Problem with masqurading "long" connections.

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

 



Hi,

I've been tearing my hair out with this problem so I'm turning to the
list for help. The problem in a nut shell is that with my latest
firewall script if an outside user requests a short web page (~1000
bytes) it gets sent through the firewall, a long one (page+graphics) and
the connection hangs. I can cause a similar hang if I ssh into the
webserver box and do a ps ax (hangs after about 10 lines of output).

Background

I'm running the firewall on a dedicated linux PC (2.4.19, Mandrake 9.0,
iptables 1.2.6a) which is doing normal masqurading for outgoin LAN
traffic as well as port forwarding several ports to various internal
machines. The webserver is apache running on Debian 3.0 (2.2.20 kernel)

The (abridged) working script (1.9) - (see
http://www.bennee.com/cgi-bin/cvsweb/src/scripts/iptables_firewall?rev=1.9&content-type=text/x-cvsweb-markup for the ful version)

   # Setup NAT (Masquerading, special case for dynamic IP's)
   /sbin/iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
    # Remap NAT'ed ports to be from gateway (so I can access from LAN)
    /sbin/iptables -t nat -A POSTROUTING -d $ZHEER -s $INTNET -p tcp
--dport 80 -j SNAT --to $INTIP
    /sbin/iptables -t nat -A POSTROUTING -d $ZHEER -s $INTNET -p tcp
--dport 443 -j SNAT --to $INTIP
    # Setup incomming port forwarding for our public services
    # Web (http and https)
    /sbin/iptables -t nat -A PREROUTING -d $EXTIP -p tcp --dport 80 -j
DNAT --to $ZHEER:80
    /sbin/iptables -t nat -A PREROUTING -d $EXTIP -p tcp --dport 443 -j
DNAT --to $ZHEER:443
    # Secure shell
    /sbin/iptables -t nat -A PREROUTING -i $EXTIF -p tcp --dport 24 -j
DNAT --to $ZHEER:22
    # FORWARD is used for NAT stuff - careful not to kill it
    /sbin/iptables -P FORWARD ACCEPT
    # Forwarding rules. Allow our external services access but not much
else
    # Allow access to web/secure web/smtp (remember the destination is
now translated)
    /sbin/iptables -A FORWARD -d $ZHEER -p tcp --dport 22 -j ACCEPT
    /sbin/iptables -A FORWARD -d $ZHEER -p tcp --dport 80 -j ACCEPT
    /sbin/iptables -A FORWARD -d $ZHEER -p tcp --dport 443 -j ACCEPT
    # tighten up some forwarding rules
    /sbin/iptables -A FORWARD -i $EXTIF -s $INTNET -m limit -j LOG
--log-prefix "[Spoofed packets from $EXTIF]"
    # and for the time being ACCEPT everything else (will tighten up
later)
    /sbin/iptables -A FORWARD -j ACCEPT

The (abridged) "failing" script (1.14) - ( see
http://www.bennee.com/cgi-bin/cvsweb/src/scripts/iptables_firewall?rev=1.14&content-type=text/x-cvsweb-markup for full version)

    # Setup incomming port forwarding for our public services - note
these rules are hit once
    # for any incomming connection. Once matched the connection is dealt
with by the FORWARD rules(?)
    # *NO* filtering should happen here, just DNAT stuff
    # Web (http and https)
    /sbin/iptables -t nat -A PREROUTING -d $EXTIP -p tcp --dport 80 -j
DNAT --to $ZHEER:80
    /sbin/iptables -t nat -A PREROUTING -d $EXTIP -p tcp --dport 443 -j
DNAT --to $ZHEER:443
    # allow internal boxes to get mapped to these ports too
    
    # Secure shell - port 24 is no real protection but it may put of the
odd script kidde
    /sbin/iptables -t nat -A PREROUTING -d $EXTIP -p tcp --dport 24 -j
DNAT --to $ZHEER:22
    # FORWARD is used for NAT/MASQ stuff - anything thats not destined
for this machine
    /sbin/iptables -P FORWARD DROP
   
    # Now create some forwarding chains
    /sbin/iptables -N fw-to-lan
    /sbin/iptables -N fw-to-inet

    # Forwarding rules. Allow our external services access but not much
else
    # Allow access to web/secure web/smtp/ssh on zheer (remember the
destination is now translated)
    /sbin/iptables -A fw-to-lan -d $ZHEER -p tcp --dport 22 -j ACCEPT
    /sbin/iptables -A fw-to-lan -d $ZHEER -p tcp --dport 80 -j ACCEPT
    /sbin/iptables -A fw-to-lan -d $ZHEER -p tcp --dport 443 -j ACCEPT
    /sbin/iptables -A fw-to-lan -d $ZHEER -m state --state
ESTABLISHED,RELATED -j ACCEPT

    # ESTABLISHED and RELATED connections allowed through as well
    /sbin/iptables -A fw-to-lan -d $INTNET -m state --state
ESTABLISHED,RELATED -j ACCEPT
    # Log any spoofed packets
    /sbin/iptables -A fw-to-lan -s $INTNET -m limit -j LOG --log-prefix
"[Spoofed packets from $EXTIF]"
    # and anything INVALID should get dropped
    /sbin/iptables -A fw-to-lan -d $INTNET -m state --state INVALID -j
DROP
    
    # Dump everything else
    /sbin/iptables -A fw-to-lan -j DROP
    # enable
    /sbin/iptables -A FORWARD -o $INTIF -j fw-to-lan
    
    # Forwarding rules for outgoing connections - split to make
debugging easier for now
    /sbin/iptables -A fw-to-inet -s $ZHEER -p tcp --sport 22 -j ACCEPT
    /sbin/iptables -A fw-to-inet -s $ZHEER -p tcp --sport 25 -j ACCEPT
    /sbin/iptables -A fw-to-inet -s $ZHEER -p tcp --sport 80 -j ACCEPT
    /sbin/iptables -A fw-to-inet -s $ZHEER -p tcp --sport 443 -j ACCEPT
    /sbin/iptables -A fw-to-inet -s $ZHEER -j ACCEPT
    # and everyone else
    /sbin/iptables -A fw-to-inet -j ACCEPT
    # enable
    /sbin/iptables -A FORWARD -o $EXTIF -j fw-to-inet
    
    # Log anything else
    /sbin/iptables -A FORWARD -m limit -j LOG --log-prefix "[Packet lost
forwarding]"

    echo " setting up outgoing NAT (Masq)";
    # Setup NAT (Masquerading, special case for dynamic IP's) for all
outgoing connections
    /sbin/iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

    # Remap NAT'ed ports to be from gateway (so I can access bennee.com
from LAN)
    /sbin/iptables -t nat -A POSTROUTING -d $ZHEER -s $INTNET -p tcp
--dport 80 -j SNAT --to $INTIP
    /sbin/iptables -t nat -A POSTROUTING -d $ZHEER -s $INTNET -p tcp
--dport 443 -j SNAT --to $INTIP


Why I am so confused

I've reviewed the changes I've made carefully for the last few days and
I can't see whats going wrong. I wrote the dumpnat function in the
script to see what was happening to the NAT/FORWARD tables in the
failure case and I can see packets stop crossing the firewall but I'm
not seeing the FORWARD DROP count go up, infact I can't see any of the
DROP counters going up, even though a tcpdump on the webserver says that
retry packets are still being sent out - until the webserver eventually
gives up. As far as I understand the way NAT should work is the first
incomming packet goes through PREROUTING and once thats accepted as long
as the FORWARD rules don't filter anything out, and as you can see by
outgoing chain "fw-to-inet" actually acepts evrything.

HELP! I'm slowly going insane with this particular one.

-- 
Alex@Bennee.com
http://www.bennee.com/~alex/




[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