iptables拒绝它应该接受的一切

大家好,你好!

我试图用iptables设置我的服务器防火墙(我不得不承认,上一次我使用iptables是在一年前),但iptables的行为违背我的要求。

这是我的testing脚本:

#!/bin/sh IPT="/sbin/iptables" echo -n "Loading iptables rules..." # Flush old rules $IPT --flush $IPT --delete-chain # Allow incoming and outgoing for loopback interfaces $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # Allow incoming traffic for HTTP(S), SSH and SMTP $IPT -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT $IPT -A INPUT -p tcp --dport 443 -i eth0 -j ACCEPT $IPT -A INPUT -p tcp --dport 22 -j ACCEPT $IPT -A INPUT -p tcp --dport 25 -i eth0 -j ACCEPT # Allow ICMP requests $IPT -A INPUT -p icmp -i eth0 -j ACCEPT $IPT -A OUTPUT -p icmp -o eth0 -j ACCEPT # Allow outgoing traffic for SMTP, DNS, NTP, PgSQL, SolR, and SSH $IPT -A OUTPUT -p tcp --dport 25 -o eth0 -j ACCEPT $IPT -A OUTPUT -p tcp --dport 53 -o eth0 -j ACCEPT $IPT -A OUTPUT -p udp --dport 53 -o eth0 -j ACCEPT $IPT -A OUTPUT -p udp --dport 123 -o eth0 -j ACCEPT $IPT -A OUTPUT -p tcp --dport 5433 -o eth0.2654 -j ACCEPT $IPT -A OUTPUT -p udp --dport 5433 -o eth0.2654 -j ACCEPT $IPT -A OUTPUT -p tcp --dport 8983 -o eth0.2654 -j ACCEPT $IPT -A OUTPUT -p udp --dport 8983 -o eth0.2654 -j ACCEPT $IPT -A OUTPUT -p tcp --dport 22 -o eth0 -j ACCEPT $IPT -A OUTPUT -p tcp --dport 22 -o eth0.2654 -j ACCEPT # Deny web server user outgoing connections $IPT -A OUTPUT -o eth0 -m owner --uid-owner www-data -j DROP # Drop everything else $IPT -A INPUT -j DROP $IPT -A OUTPUT -j DROP $IPT -A FORWARD -j DROP echo "rules loaded." # Print rules as understood, then flush to avoid lockout sleep 10 $IPT -L # Flush old rules $IPT --flush $IPT --delete-chain 

使用这个脚本,服务器不会再响应任何请求,而是ping(ICMP),然后在10秒钟后打印以下文本并退出:

 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 100 5920 ACCEPT all -- lo any anywhere anywhere 0 0 ACCEPT tcp -- eth0 any anywhere anywhere tcp dpt:www 0 0 ACCEPT tcp -- eth0 any anywhere anywhere tcp dpt:https 1 52 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh 0 0 ACCEPT tcp -- eth0 any anywhere anywhere tcp dpt:smtp 0 0 ACCEPT icmp -- eth0 any anywhere anywhere 0 0 DROP all -- any any anywhere anywhere Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DROP all -- any any anywhere anywhere Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 100 5920 ACCEPT all -- any lo anywhere anywhere 0 0 ACCEPT icmp -- any eth0 anywhere anywhere 0 0 ACCEPT tcp -- any eth0 anywhere anywhere tcp dpt:smtp 0 0 ACCEPT tcp -- any eth0 anywhere anywhere tcp dpt:domain 0 0 ACCEPT udp -- any eth0 anywhere anywhere udp dpt:domain 0 0 ACCEPT udp -- any eth0 anywhere anywhere udp dpt:ntp 0 0 ACCEPT tcp -- any eth0.2654 anywhere anywhere tcp dpt:5433 0 0 ACCEPT udp -- any eth0.2654 anywhere anywhere udp dpt:5433 0 0 ACCEPT tcp -- any eth0.2654 anywhere anywhere tcp dpt:8983 0 0 ACCEPT udp -- any eth0.2654 anywhere anywhere udp dpt:8983 0 0 ACCEPT tcp -- any eth0 anywhere anywhere tcp dpt:ssh 0 0 ACCEPT tcp -- any eth0.2654 anywhere anywhere tcp dpt:ssh 0 0 DROP all -- any eth0 anywhere anywhere owner UID match www-data 14 2061 DROP all -- any any anywhere anywhere 

首先令人不安的是,我注意到INPUT和OUTPUT的第一条规则是接受所有的数据包,而我没有要求这样做。 另外,我试着将INPUT和OUTPUT策略设置为DROP(使用$IPT -P INPUT DROP$IPT -P OUTPUT DROP ),但是这样做确实将我locking,甚至在十秒钟超时之后,服务器只有ICMP的答案,这迫使我硬重启服务器。 如果我在脚本的开始处设置策略设置,效果相同。

我怀疑我的错误对于普通的iptables用户来说是显而易见的,但是现在我已经search了几个小时的解决scheme,并且像往常一样在这种情况下,只有当有人指出时,答案才是显而易见的。 请任何帮助我的人?

eth0.2654是一个用于与我们的PgSQL服务器进行通信的VLAN。 关于HTTP的答案,我觉得他们使用客户端打开的连接,这是我的规则允许的。 我错了吗?

关于HTTP的答案,我觉得他们使用客户端打开的连接,这是我的规则允许的。 我错了吗?

是的,你错了。 很可能您想要接受已build立或与传入连接相关的连接。 因此,input规则可以接受的任何东西都可以被回答。 使用无状态防火墙时,必须明确地打开源端口。 由于IPtables是有状态的,所以你不需要这样做。 它会跟踪您的连接状态,并自动允许出站连接的方式,但只有当你告诉它这样做。 这个规则是iptables -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT 。 把它放在输出列表的顶部。 如果你想特别激进,你可以将该规则绑定到特定的端口。

如果你要以无状态的方式来看待这个问题,你就必须记住包的来源和去向。 你有你的服务器目前安装允许你SSH到另一台机器。 由于您不允许将端口22作为源的任何stream量,您的服务器无法应答传入的连接。 同样,“ESTABLISHED,RELATED”规则解决了这个问题,允许stream量回应入站连接,就像允许来自端口22的stream量一样,但是与无状态防火墙上的开放22不同,这个设置不允许新的连接从那里开始。

你的方法是不好的。 您允许所有input连接,然后停止输出。 这不会阻止DDoS攻击。 正确的方法是停止input连接并允许输出。

通过您的代码阅读我试图重拍。 这是我认为它应该看起来如何:

 #!/bin/sh IPT=/usr/sbin/iptables echo "Clear firewall rules..." $IPT -F $IPT -Z $IPT -t nat -F $IPT -t nat -Z $IPT -t mangle -F $IPT -t mangle -Z $IPT -X echo "Setting firewall policy..." $IPT -P INPUT DROP # Deny all incoming connections $IPT -P OUTPUT ACCEPT # Allow all outgoing connections $IPT -P FORWARD DROP # Deny all forwaring echo "Allow connections from: lo, eth0, eth0.2654" $IPT -I INPUT -i lo -j ACCEPT $IPT -I INPUT -i eth0 -j ACCEPT echo "Allow icmp requests from eth0" $IPT -A INPUT -p icmp -i eth0 -j ACCEPT echo "Allow traffic for HTTP(S), SSH, SMTP, DNS, NTP, PgSQL, SolR" $IPT -A INPUT -p tcp --dport 22 -j ACCEPT $IPT -A INPUT -p tcp --dport 25 -i eth0 -j ACCEPT $IPT -A INPUT -p tcp --dport 53 -i eth0 -j ACCEPT $IPT -A INPUT -p udp --dport 53 -i eth0 -j ACCEPT $IPT -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT $IPT -A INPUT -p udp --dport 123 -i eth0 -j ACCEPT $IPT -A INPUT -p tcp --dport 443 -i eth0 -j ACCEPT $IPT -A INPUT -p tcp --dport 5433 -i eth0.2654 -j ACCEPT $IPT -A INPUT -p udp --dport 5433 -i eth0.2654 -j ACCEPT $IPT -A INPUT -p tcp --dport 8983 -i eth0.2654 -j ACCEPT $IPT -A INPUT -p udp --dport 8983 -i eth0.2654 -j ACCEPT echo "Deny web server user outgoing connections; eth0" $IPT -A INPUT -o eth0 -m owner --uid-owner www-data -j DROP echo "Drop everything." $IPT -A INPUT -s 0/0 -j DROP echo "Firewall loaded." sleep 20 $IPT -nvL echo "Clear firewall rules..." $IPT -F $IPT -Z $IPT -t nat -F $IPT -t nat -Z $IPT -t mangle -F $IPT -t mangle -Z $IPT -X 

我没有testing过,所以记住这一点。 我不确定“-i eth0.2654”是否适用于虚拟接口。

如果你想 – 尝试它,让我知道,如果它的工作或没有。