Re: my debian does not read my own iptables script
On 2009-01-31 Patrik Hasibuan wrote:
> Firstly, thank you very much for you reply.
> It still does not give any change. So I start from a very simple,
> namely: "Just opening some ports I need". But which opened are not
> mentioned in my script.
> But the port of 21,23,53,10883 are always close. I don't mention port
> of 111,113 and 515 in my iptables-script and I want they're be closed
> but in fact they are stay open. Sigh...!!!
There seems to be a misunderstanding about the nature of ports here.
Ports don't magically turn "open", because you don't filter them on the
firewall. A port is only in the state "open" if some daemon has a
listening socket bound to it. For instance, port 111/tcp on your machine
is probably open, because you're running the portmap daemon.
If you want port 21/tcp to be open, you have to run a service listening
on that port (usually an FTP server). On port 23/tcp you'd normally run
a telnet server (although I'd strongly recommend against doing so, since
SSH is a far better option). On ports 53/tcp and 53/udp you'd normally
be running your DNS server, and so on.
Besides, why is your firewall running port-mapper, identd and print
spooler anyway? A firewall is a security device and should be running as
little services as possible. I also strongly recommend running a custom
> This is my complete script:
> #Zero...zero...from beginning
> iptables -F
> iptables -t nat -F
> iptables -t mangle -F
> iptables -X
> iptables -t nat -X
> iptables -t mangle -X
> echo "0" > /proc/sys/net/ipv4/ip_forward
> #route add default gateway 126.96.36.199
> #Basic policy
> iptables -P INPUT DROP
> iptables -P FORWARD ACCEPT
> iptables -P OUTPUT ACCEPT
First problem. Never flush your chains before setting the default
policies. If you do, you have a (however short) period of time where
your firewall may be wide open. Always initialize your firewall in the
order I lined out in my previous posting.
Second problem. Don't set policies to ACCEPT without a good reason.
Setting the OUTPUT chain to ACCEPT is arguably okay, because as long as
your firewall isn't compromised, the traffic originating from it can be
considered trustworthy. And if it becomes compromised you have bigger
problems than some outbound connections. However, this reasoning does
*not* apply to the FORWARD chain. That chain handles all packets that
your firewall transfers between your LAN and the Internet. Set the
policy to ACCEPT and your LAN is wide open to the world. Don't do that.
> iptables -A INPUT -m state --state INVALID -j DROP
> iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT
This is the actual culprit. You're accepting all inbound TCP connections
to any port. Don't do that.
> iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT
This rule is pointless, since you're accepting everything in the OUTPUT
> iptables -A FORWARD -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT
Same as with the INPUT chain. Only worse. Never allow all inbound TCP
connections to your LAN. Ever. That's a big no-no.
You probably meant to write these rules instead of the three above:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
These will allow all traffic belonging to already established
connections, but won't allow to actually establish any connection. You
do that by accepting NEW connections to particular ports.
> iptables -t nat -P PREROUTING ACCEPT
> iptables -t nat -P POSTROUTING ACCEPT
> iptables -t nat -P OUTPUT ACCEPT
> echo "1" > /proc/sys/net/ipv4/ip_forward
> iptables -A INPUT -j LOG
> iptables -A OUTPUT -j LOG
> iptables -A FORWARD -j LOG
Because your ruleset is already accepting all traffic at this point,
incoming/outgoing packets will never reach these rules, so they won't
> iptables -A INPUT -p tcp -m multiport --source-port 20,22,23,53,10883 -j ACCEPT
> iptables -A INPUT -p udp -m multiport --source-port 20,22,23,53,10883 -j ACCEPT
> iptables -A INPUT -p tcp -m multiport --sport 21 -j ACCEPT
> iptables -A INPUT -p udp -m multiport --sport 21 -j ACCEPT
> iptables -A OUTPUT -p tcp -m multiport --destination-port 20,22,23,53,10883 -j ACCEPT
> iptables -A OUTPUT -p udp -m multiport --destination-port 20,22,23,53,10883 -j ACCEPT
> iptables -A OUTPUT -p tcp -m multiport --dport 21 -j ACCEPT
> iptables -A OUTPUT -p udp -m multiport --dport 21 -j ACCEPT
Thes rules will allow your users to establish connections (you should
add "-m state --state NEW" to them, though). However, it looks to me
like you got your perspective wrong. Why are you accepting inbound
connections TO your firewall with those source ports? And why outbound
connections FROM your firewall TO those destination ports on some other
Also your FORWARD chain seems rather useless. You don't seem to be
passing any particular traffic between a LAN and the Internet, and your
not NATing the traffic either.
Perhaps you should elaborate a little on your setup and what you
actually want to achieve.
"The Mac OS X kernel should never panic because, when it does, it
seriously inconveniences the user."