Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

hello i have a computer linuxbox_1.eth0 public ip 89.40.x.y eth1 public ip 85.121.a.b i have another linuxbox_2. ethx public ip 86.34.c.d

what i want to do is forward port 8001 from linuxbox_1 eth0 89.40.x.y:8001 to linuxbox_1 eth1 85.121.a.b,

and then forward again port 8001 from linuxbox_1 eth1 85.121.a.b:8001 to linuxbox_2 ethx 86.34.c.d:80

i have searched for answers using google "that knows everything" but this time it has failed. i would like to use IPTABLES or any other tool like rinetd. i tryed rinetd but it somehow mistakes the eths sorry for my bad english. 10q

share|improve this question

What do you mean by "rinetd mistakes the eths"? Do you get an error on starting rinetd? Does it start but not listen as you were expecting? What configuration did you give it on each machine? (you should add this detail to your question).

The correct syntax for the two redirects you describe is:

89.40.x.y     8001    85.121.a.b    8001
85.121.a.b    8001    86.34.c.d     80

but if both the 89.40.x.y and 85.121.a.b are associated with interfaces on the same server, would not the single line

89.40.x.y     8001    86.34.c.d     80

do the trick?

EDIT: as you say you are looking to have the traffic to 86.34.c.d to travel down the route associated with 85.121.a.b then you have a routing issue. You can force packets for a particular address to be routed down a particular interface with:

route add -host 86.34.c.d eth1

If you run the command route (with no params) it will display your current routing table so you can do that before and after to see the difference. route del 86.34.c.d will remove the new route. This assumes that the equipment traffic from eth1 eventually travels down is able to route packets for 86.34.c.d to the right place.

To make the change permanent (so it survives a reboot) you need to add the command to an appropriate place in your startup scripts (the best way to do this depends on which Linux variant you are running). Don't do this until you have confirmed it works as desired though - you don't want to accidentally change the routing table so you can't get to the machine from your current location and have the incorrect route reapply after reboot.

share|improve this answer
because i already did 89.40.x.y 8001 86.34.c.d 80 89.40.x.y it is also a dns and our application needs to see that the packets are sent from 85.121.a.b 8001.the application is stored on 86.34.c.d.i know that it looks stupid but otherwise it won`t work properly.... – tric Dec 2 '09 at 22:44
You should edit your question to add the extra detail as suggested - the more information you put in the actual question the better answers you will get. – David Spillett Dec 3 '09 at 9:32

iptables port forwarding rewrites the TCP headers, so your application will see the packet coming from the last hop in the forwarding chain. So if that's what you're trying to hack, iptables port forwarding can't help you.

IP spoofing might help, but it's complicated. And it might not working if your application needs can't send directly back to the originating sender directly.

(I haven't used rinetd so I can't comment there.)

share|improve this answer

It can be done with iptables' DNAT target (in nat's PREROUTING). But a few things in the checklist are:

  • net.ipv4.ip_forward=1
  • iptables's FORWARD chain permits forwarding as well for those packets
  • Source of the request (IP) is being translated as well (SNAT/MASQUERADE) otherwise destination will try to talk back directly (or unless its properly routed back, like in case it uses DNATing box as its gateway).
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.