Re: Accessing machine with public ip address.

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

 



On Monday 23 December 2002 10:06 am, Sundaram Ramasamy wrote:
{ liberally snipped }
> Here is my iptables rules

> EXT="eth0"
> INT="eth1"
> INT2="eth2"

> $IPT -A FORWARD -i $INT -j ACCEPT
> $IPT -A FORWARD -o $INT -j ACCEPT

> $IPT -A FORWARD -i $INT2 -j ACCEPT
> $IPT -A FORWARD -o $INT2 -j ACCEPT

> $IPT -t nat -A POSTROUTING -o $EXT -j MASQUERADE
>
> $IPT -A FORWARD -i $EXT -m state --state ESTABLISHED,RELATED -j ACCEPT
> $IPT -A FORWARD -i $EXT -m state --state NEW -j ACCEPT

> $IPT -t nat -A PREROUTING  -i $EXT -d $EXT_IP1  -p tcp --dport 80 -j
> DNAT --to $INT_IP1
> $IPT -A FORWARD -p tcp  --dport 80 -d $INT_IP1 -j ACCEPT
> $IPT -t nat -A POSTROUTING -o $EXT -s $INT_IP1  -j SNAT --to  $EXT_IP1

> I have forwarded 216.205.140.8 to 192.168.1.130. I am accessing web
> page from 192.168.1.140 machine.

> > > I have NATed public 216.205.140.8 IP Address into local
> > > 192.168.1.130 Network address, from my LAN I was not able to
> > > access my machine using public IP Address.

Several problems here.  The source of your specific stated problem is 
that you are not DNATting the packets.  You specify "-i $EXT" for your 
prerouting DNAT, and requests from the LAN will NOT appear as input from 
that interface, but from $INT or $INT2.  Remove the "-i $EXT" and it 
will DNAT all packets going to $EXT_IP1 port 80, whether from the 
internet or from the LAN.

If the clients are on the same subnet as the server at 192.168.1.130 (or 
if the server has any valid route back to the LAN clients that does NOT 
pass back through the firewall box) then you also need to SNAT packets 
from LAN clients in POSTROUTING that go to the server, changing their 
source IP to the IP of the interface they go out on to reach the server.  
This way the server will always return traffic back through the firewall 
to be unDNATted, and the client will recognize the response to its 
request.  Something like:

$IPT -t nat -A POSTROUTING -d $INT_IP1 -j SNAT --to $192.168.1.x
using the firewall box's IP for the interface that it reaches 
192.168.1.130 through.  To avoid the extra overhead of SNATting all 
traffic from the internet as well, which isn't necessary, you can use 
this rule twice, with "-i $INT" and "-i $INT2", or specifying source IPs 
as a subnet matching all local client IPs.  (like "-s 192.168.1.0/24" 
perhaps)

Forwarding needs an overhaul here.  First you accept anything coming in 
$INT.  A little loose perhaps, but ok, as long as the LAN can be 
trusted...  Then you accept anything directed out $INT.  Quite a bit 
looser, and could be considered a problem.  Then you do the same two 
things for $INT2.  Together these four rules accept absolutely 
everything EXCEPT forwarding packets from $EXT (internet) right back to 
$EXT.  Then you go on to accept ESTABLISHED & RELATED inbound at $EXT, 
which is fine, but follow it up with accepting all NEW packets there as 
well.  At this point the ONLY packets left that have not already been 
accepted would be ones with state INVALID.  Your dport 80 ACCEPT rule 
further down will never match, unless the packet is INVALID, meaning 
either it is unidentifiable, or it's state cannot be determined.

I would NOT recommend using this ruleset in an environment where you want 
a secure firewall.  Basically all this ruleset does is handle 
forwarding.  The only thing that saves you from harm is probably the 
fact that (at least as shown here) the only services you actually DNAT 
are dport 80 requests targeting EXT_IP1.  This is essentially the only 
filtering actually done, and you aren't doing it in the filter table, 
but rather in the nat table's PREROUTING chain.  That is the purpose of 
the filter table.  (INPUT, OUTPUT, and FORWARD chains)

You would probably be much better served if you remove both the -o 
forward rules, remove the "-i $EXT" from the EST/REL forward rule, and 
replace the -i $EXT state NEW rule with explicit rules for what dports 
you wish to allow the unwashed masses on the internet to actually 
access.  (basically --dport 80 in this case, it seems)  To get things a 
little tighter, remove the FORWARD rules for input from the two local 
interfaces, and replace them with specific destport rules as well.  
There's no reason to make things easy for viruses, spyware, phone-homes, 
and other usually quite undesirable communications 'clients'.

Finally, it appears that you have a static IP address for $EXT_IP1, 
correct?  If so, you are incurring quite a bit of overhead by using 
MASQUERADE, which won't even work without 
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
to enable tracking of the dynamic IP of the interface MASQ is being 
applied to.  You should probably be using this instead:
$IPT -t nat -A POSTROUTING -o $EXT -j SNAT --to $EXT_IP1

A very useful 'tool' for following this kind of thing is:
"cat /etc/init.d/firewall | grep FORWARD"
or whatever the path and filename are for your firewall script, and check 
each chain.  Then you can examine the sequence of rules, and determine 
what will be accepted at each stage.  Organizing the rules in groups the 
way you have makes them more readable, perhaps, but can make it harder 
(especially if you have 100+ rules, or even more than one screenful) to 
really follow the overall effects.  

It might be more useful if you define all your substitions at the very 
start, then list the rules for each chain start to finish before the 
rules for the next chain.  The variable names you use will still make it 
clear what rules are related to which interface. (I'd suggest INT1 
instead of INT, and HTTP_SVR or some such instead of INT1_IP, to make 
them more meaningful)  The 'tool' suggested above can be invoked with 
"grep INT2" for example, for the (probably rare) occasions when you 
really need to see everything relating to that interface in an unbroken 
group.

j




[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