Linux Netfilter discussions
 help / color / mirror / Atom feed
* Routing and DNAT redux
@ 2005-06-09  0:54 Jeff Simmons
  2005-06-09 16:22 ` Matin Tamizi
  0 siblings, 1 reply; 5+ messages in thread
From: Jeff Simmons @ 2005-06-09  0:54 UTC (permalink / raw)
  To: netfilter

OK, a little more specific.

I have an iptables firewall with a server behind it. The server has a 
non-routable address (192.168) so the firewall's IP address:port is DNAT'd  
to the server's address:port.

Incoming packets to the server first encounter the firewall's external 
interface (EXT_IF), where the prerouting DNAT rule rewrites the IP layer 
destination address (EXT_ADDR) to the server's address (SERV_ADDR). The 
packet is then passed on to the routing function, which determines that the 
packet needs forwarding via the internal interface (INT_IF). The packet is 
then passed through any appropriate iptables forwarding chains, then to the 
post-routing function of iptables (which in this case does nothing), and 
finally out INT_IF to destination SERV_ADDR.

There's a nice diagram of this at:

 http://www.policyrouting.org/PolicyRoutingBook/ONLINE/CH03.web.html

down in section 3.3.2.

Now, to the reply from the server. When the packet leaves the server, its IP 
layer will show source SERV_ADDR destination REMOTE_ADDR. But when the packet 
arrives at the remote, it will show source EXT_ADDR destination REMOTE_ADDR. 
It gets rewritten somewhere.

My understanding is the rewriting is done by the state engine, which basically 
maintains a rule that any outbound packet SERV_ADDR:port -> REMOTE_ADDR:port 
gets changed to EXT_ADDR:port -> REMOTE_ADDR:port. But where in the chain 
does this happen?

Scenario one: it happens on INT_IF prerouting. If this is the case, then I can 
use source routing with iproute2.

Scenario two: it happens on EXT_IF postrouting. Then iproute2 can't do the 
kind of source routing I need to do, and I'll have to find another solution.

(Note that with standard destination routing, it doesn't matter where the 
packet gets rewritten. But with source routing it matters greatly.)

The reality is, the box I'm working on has 4 T1s coming in, a DMZ with 
routable IP addresses, and two LANS with non-routable addresses where both 
contain servers that need to be contacted by the outside world via DNAT. It's 
a big, messy, ugly project, but I need to know if I can use iproute2 to be 
sure that return packets from all the servers go out the T1 they came in on.

Any help, pointers, or FMs that I can RTFM would be GREATLY appreciated.

-- 
Jeff Simmons                                   jsimmons@goblin.punk.net
     Simmons Consulting - Network Engineering, Administration, Security

"You guys, I don't hear any noise. Are you sure you're doing it right?"
	-- My Life With The Thrill Kill Kult


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Routing and DNAT redux
  2005-06-09  0:54 Routing and DNAT redux Jeff Simmons
@ 2005-06-09 16:22 ` Matin Tamizi
  2005-06-09 17:00   ` Jeff Simmons
  0 siblings, 1 reply; 5+ messages in thread
From: Matin Tamizi @ 2005-06-09 16:22 UTC (permalink / raw)
  To: jsimmons; +Cc: netfilter

Why not use netfilter's SNAT and static routes via the route command? 
You can use route to define the outgoing path for specific traffic:

For example:
route add -net 192.168.0.0 netmask 255.255.0.0 dev eth1

-Matin

On 6/8/05, Jeff Simmons <jsimmons@goblin.punk.net> wrote:
> OK, a little more specific.
> 
> I have an iptables firewall with a server behind it. The server has a
> non-routable address (192.168) so the firewall's IP address:port is DNAT'd
> to the server's address:port.
> 
> Incoming packets to the server first encounter the firewall's external
> interface (EXT_IF), where the prerouting DNAT rule rewrites the IP layer
> destination address (EXT_ADDR) to the server's address (SERV_ADDR). The
> packet is then passed on to the routing function, which determines that the
> packet needs forwarding via the internal interface (INT_IF). The packet is
> then passed through any appropriate iptables forwarding chains, then to the
> post-routing function of iptables (which in this case does nothing), and
> finally out INT_IF to destination SERV_ADDR.
> 
> There's a nice diagram of this at:
> 
>  http://www.policyrouting.org/PolicyRoutingBook/ONLINE/CH03.web.html
> 
> down in section 3.3.2.
> 
> Now, to the reply from the server. When the packet leaves the server, its IP
> layer will show source SERV_ADDR destination REMOTE_ADDR. But when the packet
> arrives at the remote, it will show source EXT_ADDR destination REMOTE_ADDR.
> It gets rewritten somewhere.
> 
> My understanding is the rewriting is done by the state engine, which basically
> maintains a rule that any outbound packet SERV_ADDR:port -> REMOTE_ADDR:port
> gets changed to EXT_ADDR:port -> REMOTE_ADDR:port. But where in the chain
> does this happen?
> 
> Scenario one: it happens on INT_IF prerouting. If this is the case, then I can
> use source routing with iproute2.
> 
> Scenario two: it happens on EXT_IF postrouting. Then iproute2 can't do the
> kind of source routing I need to do, and I'll have to find another solution.
> 
> (Note that with standard destination routing, it doesn't matter where the
> packet gets rewritten. But with source routing it matters greatly.)
> 
> The reality is, the box I'm working on has 4 T1s coming in, a DMZ with
> routable IP addresses, and two LANS with non-routable addresses where both
> contain servers that need to be contacted by the outside world via DNAT. It's
> a big, messy, ugly project, but I need to know if I can use iproute2 to be
> sure that return packets from all the servers go out the T1 they came in on.
> 
> Any help, pointers, or FMs that I can RTFM would be GREATLY appreciated.
> 
> --
> Jeff Simmons                                   jsimmons@goblin.punk.net
>      Simmons Consulting - Network Engineering, Administration, Security
> 
> "You guys, I don't hear any noise. Are you sure you're doing it right?"
>         -- My Life With The Thrill Kill Kult
> 
>


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Routing and DNAT redux
  2005-06-09 16:22 ` Matin Tamizi
@ 2005-06-09 17:00   ` Jeff Simmons
  2005-06-10 17:55     ` Jason Opperisano
  0 siblings, 1 reply; 5+ messages in thread
From: Jeff Simmons @ 2005-06-09 17:00 UTC (permalink / raw)
  To: Matin Tamizi; +Cc: netfilter

The actual challenge is to have two external interfaces, IF_1 and IF_2, each 
with their own address and both DNATed to an internal server. Packets coming 
into IF_1 should have their replies routed out IF_1 while packets coming in 
on IF_2 should have their replies routed out IF_2.

The ONLY place this information (which interface a particular packet stream 
came in on) is available is in the NAT state table. Pre NAT, all routing has 
to go on is the source server destination remote.  Post NAT routing now sees 
source IF_ (1 or 2) destination remote, and the packet can now be properly 
routed out the correct interface.

Which is why it's important whether NAT takes place pre or post routing on the 
reply packets from a DNATed destination.

On Thursday 09 June 2005 09:22, you wrote:
> Why not use netfilter's SNAT and static routes via the route command?
> You can use route to define the outgoing path for specific traffic:
>
> For example:
> route add -net 192.168.0.0 netmask 255.255.0.0 dev eth1
>
> -Matin
>
> On 6/8/05, Jeff Simmons <jsimmons@goblin.punk.net> wrote:
> > OK, a little more specific.
> >
> > I have an iptables firewall with a server behind it. The server has a
> > non-routable address (192.168) so the firewall's IP address:port is
> > DNAT'd to the server's address:port.
> >
> > Incoming packets to the server first encounter the firewall's external
> > interface (EXT_IF), where the prerouting DNAT rule rewrites the IP layer
> > destination address (EXT_ADDR) to the server's address (SERV_ADDR). The
> > packet is then passed on to the routing function, which determines that
> > the packet needs forwarding via the internal interface (INT_IF). The
> > packet is then passed through any appropriate iptables forwarding chains,
> > then to the post-routing function of iptables (which in this case does
> > nothing), and finally out INT_IF to destination SERV_ADDR.
> >
> > There's a nice diagram of this at:
> >
> >  http://www.policyrouting.org/PolicyRoutingBook/ONLINE/CH03.web.html
> >
> > down in section 3.3.2.
> >
> > Now, to the reply from the server. When the packet leaves the server, its
> > IP layer will show source SERV_ADDR destination REMOTE_ADDR. But when the
> > packet arrives at the remote, it will show source EXT_ADDR destination
> > REMOTE_ADDR. It gets rewritten somewhere.
> >
> > My understanding is the rewriting is done by the state engine, which
> > basically maintains a rule that any outbound packet SERV_ADDR:port ->
> > REMOTE_ADDR:port gets changed to EXT_ADDR:port -> REMOTE_ADDR:port. But
> > where in the chain does this happen?
> >
> > Scenario one: it happens on INT_IF prerouting. If this is the case, then
> > I can use source routing with iproute2.
> >
> > Scenario two: it happens on EXT_IF postrouting. Then iproute2 can't do
> > the kind of source routing I need to do, and I'll have to find another
> > solution.
> >
> > (Note that with standard destination routing, it doesn't matter where the
> > packet gets rewritten. But with source routing it matters greatly.)
> >
> > The reality is, the box I'm working on has 4 T1s coming in, a DMZ with
> > routable IP addresses, and two LANS with non-routable addresses where
> > both contain servers that need to be contacted by the outside world via
> > DNAT. It's a big, messy, ugly project, but I need to know if I can use
> > iproute2 to be sure that return packets from all the servers go out the
> > T1 they came in on.
> >
> > Any help, pointers, or FMs that I can RTFM would be GREATLY appreciated.
> >
> > --
> > Jeff Simmons                                   jsimmons@goblin.punk.net
> >      Simmons Consulting - Network Engineering, Administration, Security
> >
> > "You guys, I don't hear any noise. Are you sure you're doing it right?"
> >         -- My Life With The Thrill Kill Kult

-- 
Jeff Simmons                                   jsimmons@goblin.punk.net
     Simmons Consulting - Network Engineering, Administration, Security

"You guys, I don't hear any noise. Are you sure you're doing it right?"
	-- My Life With The Thrill Kill Kult


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Routing and DNAT redux
  2005-06-09 17:00   ` Jeff Simmons
@ 2005-06-10 17:55     ` Jason Opperisano
  2005-06-10 18:05       ` Jeff Simmons
  0 siblings, 1 reply; 5+ messages in thread
From: Jason Opperisano @ 2005-06-10 17:55 UTC (permalink / raw)
  To: netfilter

On Thu, Jun 09, 2005 at 10:00:21AM -0700, Jeff Simmons wrote:
> The actual challenge is to have two external interfaces, IF_1 and IF_2, each 
> with their own address and both DNATed to an internal server. Packets coming 
> into IF_1 should have their replies routed out IF_1 while packets coming in 
> on IF_2 should have their replies routed out IF_2.
> 
> The ONLY place this information (which interface a particular packet stream 
> came in on) is available is in the NAT state table. Pre NAT, all routing has 
> to go on is the source server destination remote.  Post NAT routing now sees 
> source IF_ (1 or 2) destination remote, and the packet can now be properly 
> routed out the correct interface.
> 
> Which is why it's important whether NAT takes place pre or post routing on the 
> reply packets from a DNATed destination.

the way i attack this problem (ensuring a DNAT-ed connection gets routed
back out the same link it came in on) is with CONNMARK:

  iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
  iptables -t mangle -A PREROUTING -i $EXT_IF_A -d $PUB_IP_A \
    -m mark --mark 0 -j MARK --set-mark 1
  iptables -t mangle -A PREROUTING -i $EXT_IF_B -d $PUB_IP_B \
    -m mark --mark 0 -j MARK --set-mark 2
  iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

  iptables -t nat -A PREROUTING -i $EXT_IF_A -d $PUB_IP_A \
    -j DNAT --to-destination $PRIV_SRV
  iptables -t nat -A PREROUTING -i $EXT_IF_B -d $PUB_IP_B \
    -j DNAT --to-destination $PRIV_SRV

  ip route add default via $ISP_A_GW dev $EXT_IF_A table ISPA
  ip route add default via $ISP_B_GW dev $EXT_IF_B table ISPB

  ip rule add fwmark 1 table ISPA
  ip rule add fwmark 2 table ISPB

this isn't 100% step-by-step, but should give you the foundation.
i have posted truly step-by-step examples of this in the past--search
the archives.

hope this gets you on the right track.

-j

--
"Lois: I'm sorry that Stewie ruined your books. Here, I brought
 you some of Peter's. 
 Brian: "Mr. T" by Mr. T. "T and Me" by George Poppard. "For The Last
 Time, I'm Not Mr. T" by Ving Rhames."
        --Family Guy


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Routing and DNAT redux
  2005-06-10 17:55     ` Jason Opperisano
@ 2005-06-10 18:05       ` Jeff Simmons
  0 siblings, 0 replies; 5+ messages in thread
From: Jeff Simmons @ 2005-06-10 18:05 UTC (permalink / raw)
  To: Jason Opperisano; +Cc: netfilter

Nice. Very slick. I was contemplating a horrible kludge using NAT on both the 
exterior and interior interfaces. This is far superior.

Many thanks!

On Friday 10 June 2005 10:55, Jason Opperisano wrote:
> On Thu, Jun 09, 2005 at 10:00:21AM -0700, Jeff Simmons wrote:
> > The actual challenge is to have two external interfaces, IF_1 and IF_2,
> > each with their own address and both DNATed to an internal server.
> > Packets coming into IF_1 should have their replies routed out IF_1 while
> > packets coming in on IF_2 should have their replies routed out IF_2.
> >
> > The ONLY place this information (which interface a particular packet
> > stream came in on) is available is in the NAT state table. Pre NAT, all
> > routing has to go on is the source server destination remote.  Post NAT
> > routing now sees source IF_ (1 or 2) destination remote, and the packet
> > can now be properly routed out the correct interface.
> >
> > Which is why it's important whether NAT takes place pre or post routing
> > on the reply packets from a DNATed destination.
>
> the way i attack this problem (ensuring a DNAT-ed connection gets routed
> back out the same link it came in on) is with CONNMARK:
>
>   iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
>   iptables -t mangle -A PREROUTING -i $EXT_IF_A -d $PUB_IP_A \
>     -m mark --mark 0 -j MARK --set-mark 1
>   iptables -t mangle -A PREROUTING -i $EXT_IF_B -d $PUB_IP_B \
>     -m mark --mark 0 -j MARK --set-mark 2
>   iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
>
>   iptables -t nat -A PREROUTING -i $EXT_IF_A -d $PUB_IP_A \
>     -j DNAT --to-destination $PRIV_SRV
>   iptables -t nat -A PREROUTING -i $EXT_IF_B -d $PUB_IP_B \
>     -j DNAT --to-destination $PRIV_SRV
>
>   ip route add default via $ISP_A_GW dev $EXT_IF_A table ISPA
>   ip route add default via $ISP_B_GW dev $EXT_IF_B table ISPB
>
>   ip rule add fwmark 1 table ISPA
>   ip rule add fwmark 2 table ISPB
>
> this isn't 100% step-by-step, but should give you the foundation.
> i have posted truly step-by-step examples of this in the past--search
> the archives.
>
> hope this gets you on the right track.
>
> -j
>
> --
> "Lois: I'm sorry that Stewie ruined your books. Here, I brought
>  you some of Peter's.
>  Brian: "Mr. T" by Mr. T. "T and Me" by George Poppard. "For The Last
>  Time, I'm Not Mr. T" by Ving Rhames."
>         --Family Guy

-- 
Jeff Simmons                                   jsimmons@goblin.punk.net
     Simmons Consulting - Network Engineering, Administration, Security

"You guys, I don't hear any noise. Are you sure you're doing it right?"
	-- My Life With The Thrill Kill Kult


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2005-06-10 18:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-06-09  0:54 Routing and DNAT redux Jeff Simmons
2005-06-09 16:22 ` Matin Tamizi
2005-06-09 17:00   ` Jeff Simmons
2005-06-10 17:55     ` Jason Opperisano
2005-06-10 18:05       ` Jeff Simmons

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox