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

Re: eth1 - iptables do not work



On 2008-10-09 Tamas Hegedus wrote:
[...]
> echo "1" > /proc/sys/net/ipv4/ip_forward

You shouldn't enable IP forwarding before the policies for your chains
have been set. Better do something like this:

echo "0" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT DROP
#...

echo "1" > /proc/sys/net/ipv4/ip_forward

[...]
> iptables -P INPUT ACCEPT
> iptables -F INPUT
> iptables -P OUTPUT ACCEPT
> iptables -F OUTPUT
> iptables -P FORWARD DROP
> iptables -F FORWARD

"iptables -P INPUT ACCEPT" is a bad choice for a firewall. Don't do that
in a productive environment. Use "iptables -P INPUT DROP" instead and
whitelist what you want to accept. And you can use "iptables -F" to
flush all default chains in the filter table in one go.

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

iptables -F

> iptables -F -t nat

You should also set the policies for the nat table:

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

> iptables -F -t mangle

Same goes for the mangle table, unless you don't have it in your kernel
(which is advisable if you don't want to use it in the first place).

> # Flush the user chain.. if it exists
> if [ "`iptables -L | grep drop-and-log-it`" ]; then
>    iptables -F drop-and-log-it
> fi
> 
> # Delete all User-specified chains
> iptables -X

Flushing user-defined chains is pointless if you're deleting them
anyway.

[...]
> iptables -A drop-and-log-it -j REJECT

As a suggestion, it's better to reject like this, IMHO:

iptables -A drop-and-log-it -p tcp -j REJECT --reject-with tcp-reset
iptables -A drop-and-log-it -p udp -j REJECT --reject-with icmp-port-unreachable
iptables -A drop-and-log-it -j DROP

[...]
> iptables -A OUTPUT -o lo -j ACCEPT
> iptables -A OUTPUT -o $EXTIF -s $EXTIP -j ACCEPT
> iptables -A OUTPUT -o $EXTIF -s $INTNET -j ACCEPT
> iptables -A OUTPUT -j drop-and-log-it

This is the source of your problem, AFAICS. You allow outgoing packets
only on external and loopback interfaces, and reject everything else
with your drop-and-log-it rule. That means: packets coming in on port
22/tcp reach the SSH daemon, but the response packets are dropped by
your firewall. Therefore your internal client is unable to establish a
connection.

Personally, unless you have rather high security requirements, I'd
suggest to just accept everything in the OUTPUT chain. The packets
handled by this chain originated from the host anyway, and only the
firewall admins should have accounts on that box. Keep things simple.
However, if you want to restrict outgoing traffic from the firewall host
itself, I'd suggest to use something like this instead:

iptables -P OUTPUT DROP

iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# allow particular outbound connections, e.g. DNS
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
#...
# reject everything else
iptables -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -p udp -j REJECT --reject-with icmp-port-unreachable

Regards
Ansgar Wiechers
-- 
"The Mac OS X kernel should never panic because, when it does, it
seriously inconveniences the user."
--http://developer.apple.com/technotes/tn2004/tn2118.html


Reply to: