iptables, portforward, DNAT, SNAT

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Antony Stone <Antony@Soft-Solutions.co.uk> wrote:

>On Thursday 31 October 2002 3:33 pm, Thomas Meindl wrote:
>
>> #!/bin/bash
>>
>> EXTIF=eth0
>> INTIF=eth1
>> EXTIP=www.xxx.yyy.zzz
>> INTIP=192.168.0.1
>> WWWSRV=192.168.0.2
>>
>> #here I'll make some
>> echo 1 > /proc/sys/net/ipv4/*
>
>Does that line really say "echo 1 to every file in the /proc/sys/net/ipv4 
>directory" !?
>
>Why ???

no, i didn't write it that way in the actual script.
just to save some tipping here..

* stands for the three below

sorry for that confusing
I simply should have copied and pasted it like

echo 1 > /proc/sys/net/ipv4/ip_dynaddr
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/tcp_syncookie


>
>> #to some features like ip_dynaddr, ip_forward, tcp_syncookie
>>
>> #then I set the default policies
>> #accept everything except the FORWARD chain
>> #and flush them
>> iptables -P INPUT -j ACCEPT
>
>I don't like that - you should have a default DROP on INPUT and then create 
>rules to ACCEPT what you know you want.   Otherwise you're accepting anything 
>anyone cares to send you....
>

I know. I have a more extended script, but to be sure that portforwarding works pretty soon, i'll keep that one simple

>> iptables -F INPUT
>> iptables -P OUTPUT -j ACCEPT
>> iptables -F OUTPUT
>> iptables -P FORWARD -j DROP
>> iptables -F FORWARD
>> iptables -t nat -f        #flush the nat table
>>
>> # and here's my little disaster
>> # i try to forward port 1234 to my internal www-server
>> iptables -t nat -A PREROUTING -p tcp -i $EXTIF -d $EXTIP --dport 1234 -j
>> DNAT --to-destination $WWWSRV:80
>
>Okay - that will redirect the incoming packets on TCP port 1234 to your 
>internal web server, port 80
>
>> iptables -A FORWARD -p tcp -i $EXTIF -o $INTIF -d $WWWSRV --dport 80 -j 
>ACCEPT
>
>That rule will forward the packets through your firewall to the web server 
>(do you have a rule somewhere to allow the replies back again ?)
>
>> iptables -t nat -A POSTROUTING -p tcp -o $EXTIF -s $WWWSRV --sport 80 -j 
>SNAT --to-source $EXTIP:1234
>
>I don't understand this rule - replies from the webserver are going to get 
>automagically reverse NATted anyway, so this rule is redundant...
>
>> # for what i understand from iptables till now is
>> # packet comes in thru ethernet, arrives in kernel
>> # so packet looks like this
>> # ip-layer: source-ip: WWWREQUEST  destination-ip: $EXTIP
>> # tcp-layer: source-port: a port higher than 1024   destination-port: 1234
>> # and hits the PREROUTING chain
>
>Looks good so far.
>
>> # with the DNAT rule above it changes following
>> # ip-layer: source-ip: WWWREQUEST   destination-ip: $WWSRV
>> # tcp-layer: source-port: a port higher than 1024   destination-port: 80
>
>Yup.
>
>> # then hits FORWARD chain (usually it would hit the INPUT chain,
>> # but we changed that with DNAT; it has to go out on $INTIF to reach
>> # its destination..)
>
>Correct.
>
>> # with the FORWARD rule it can bypass..
>
>Sorry - what do you mean ?
>
>> # when applying DNAT all other packets in that stream are bypassed as well
>
>All other packets in that stream are translated (both ways), yes.
>
>> # with this two rules it is sure that a request from a www-client from
>> # the inet is reaching the inner $WWWSRV, and the $WWWSRV can respond but
>> # there is still something wrong with the reply packet:
>> # ip-layer: source-ip: $WWWSRV destination-ip: WWWREQUEST
>> # tcp-layer: source-port: 80   destination-port: 1024:
>
>That's how it goes out from the web server, yes, but that doesn't show the 
>reverse NAT which will have been applied by netfilter by the time it gets 
>back to the client.   Borrowing your terminology, that would look like:
>
>> # ip-layer: source-ip: $EXTIP destination-ip: WWWREQUEST
>> # tcp-layer: source-port: 1234   destination-port: 1024:
>
>> # when the packet arrives at the WWWREQUEST-host-browser it doesn't know
>> # what to do with the packet (there was no request to this host $WWWSRV)
>> # so here comes rule 3; it changes the source ip and port to this
>> # ip-layer: source-ip: $EXTIP destination-ip: WWWREQUEST
>> # tcp-layer: source-port: 1234   destination-port: 1024:
>> # now the packet seems like the awaited reply from the request
>> # he has given to $EXTIP:1234
>
>I think you do not realise that netfilter automagically applies the reverse 
>NAT rules to reply packets, so you do not have to create your own rules to do 
>this.
>
>> # and another few rules to complete the firewall script
>>
>> # allow all connections from inside out and only related
>> # and established ones in
>> iptables -A FORWARD -p tcp -i $EXTIF -o $INTIF -m state --state
>> ESTABLISHED,RELATED -j ACCEPT
>> iptables -A FORWARD -p tcp -o $EXTIF -i $INTIF -j ACCEPT
>
>Okay, these two rules (specifically the last one) will allow your replies 
>back out from the web server to the client.
>
>> # enable masquerading
>> iptables -t NAT -A POSTROUTING -o $EXTIF -j MASQUERADE
>
>"NAT" in this rule should read "nat" - it matters !
>

spelling mistake sorry! nat

>> I hope anyone out there can help me..
>> I tried serveral permutations with the three portforwarding rules:
>
>I think if you remove the third one it will work.

I just tried it without the third (i have tried it that way before)
but it still won't work !!!


>
>> I changed some params or even let them away
>> One Variation was to ACCEPT the full FORWARD chain
>
>Ugh !!!

i know, i know; but one gets really bad ideas when sth doesn't work

> 
>
>Antony.
>
>-- 
>
>It is also possible that putting the birds in a laboratory setting
>inadvertently renders them relatively incompetent.
>
> - Daniel C Dennett
>
>


__________________________________________________________________
The NEW Netscape 7.0 browser is now available. Upgrade now! http://channels.netscape.com/ns/browsers/download.jsp 

Get your own FREE, personal Netscape Mail account today at http://webmail.netscape.com/



[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux