![添加最后一条规则后 iptables 会忽略其他规则](https://linux22.com/image/52235/%E6%B7%BB%E5%8A%A0%E6%9C%80%E5%90%8E%E4%B8%80%E6%9D%A1%E8%A7%84%E5%88%99%E5%90%8E%20iptables%20%E4%BC%9A%E5%BF%BD%E7%95%A5%E5%85%B6%E4%BB%96%E8%A7%84%E5%88%99.png)
我已将这些规则写在iptables
:
-A FORWARD -i eth1 -o eth0 -p icmp -m limit --limit 1/hour --limit-burst 5000 -j ACCEPT
-A FORWARD -i eth1 -o eth0 -p udp -m limit --limit 1/hour --limit-burst 200 -j ACCEPT
-A FORWARD -i eth1 -o eth0 -p tcp -m limit --limit 1/hour --limit-burst 200 -j ACCEPT
-A FORWARD -i eth1 -o eth0 -m limit --limit 1/hour --limit-burst 100 -j ACCEPT
-A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1 -o eth0 -p tcp -m tcp --dport 443 -j limitlog
-A FORWARD -i eth1 -o eth0 -p tcp -m tcp --dport 80 -j limitlog
-A FORWARD -i eth1 -o eth0 -p udp -m udp --dport 53 -j limitlog
-A FORWARD -i eth1 -o eth0 -p udp -m udp --dport 123 -j limitlog
-A FORWARD -i eth1 -o eth0 -p tcp -m tcp --dport 21 -j limitlog
-A FORWARD -i eth1 -o eth0 -p tcp -m tcp --dport 20 -j limitlog
-A FORWARD -i eth1 -o eth0 -p tcp -m tcp --dport 22 -j limitlog
-A FORWARD -i eth1 -o eth0 -p tcp -m tcp --dport 5123 -j limitlog
-A FORWARD -i eth1 -o eth0 -p udp -m udp --dport 5123 -j limitlog
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 443 -j LOG --log-prefix "HTTPS z HP: "
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 443 -m limit --limit 1/hour --limit-burst 900 -j ACCEPT
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 80 -j LOG --log-prefix "HTTP z HP: "
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 80 -m limit --limit 1/hour --limit-burst 960 -j ACCEPT
-A limitlog -i eth1 -o eth0 -p udp -m udp --dport 53 -j LOG --log-prefix "DNS z HP: "
-A limitlog -i eth1 -o eth0 -p udp -m udp --dport 53 -m limit --limit 1/hour --limit-burst 360 -j ACCEPT
-A limitlog -i eth1 -o eth0 -p udp -m udp --dport 123 -j LOG --log-prefix "NTP z HP: "
-A limitlog -i eth1 -o eth0 -p udp -m udp --dport 123 -m limit --limit 1/hour --limit-burst 300 -j ACCEPT
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 21 -j LOG --log-prefix "FTP z HP: "
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 21 -m limit --limit 1/hour --limit-burst 900 -j ACCEPT
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 20 -j LOG --log-prefix "FTP DATA z HP: "
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 20 -m limit --limit 1/hour --limit-burst 900 -j ACCEPT
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 22 -j LOG --log-prefix "SSH/SCP z HP: "
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 22 -m limit --limit 1/hour --limit-burst 900 -j ACCEPT
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 5123 -j LOG --log-prefix "5123TCP z HP: "
-A limitlog -i eth1 -o eth0 -p tcp -m tcp --dport 5123 -m limit --limit 1/hour --limit-burst 300 -j ACCEPT
-A limitlog -i eth1 -o eth0 -p udp -m udp --dport 5123 -j LOG --log-prefix "5123UDP z HP: "
-A limitlog -i eth1 -o eth0 -p udp -m udp --dport 5123 -m limit --limit 1/hour --limit-burst 300 -j ACCEPT
eth0
是外部网络,eth1
是内部网络。它工作正常,但如果我添加此规则:
iptables -A FORWARD -i eth1 -o eth0 -j DROP
之前的所有规则都将被忽略,并且流量将在最后一条规则处结束。我不懂为什么?如果我删除此规则并修改链中的规则limitlog
(例如从ACCEPT
到 ),DROP
它也可以工作。
答案1
你的限制有点激进。我不认为制定每小时只接受一个数据包的规则有什么意义。您可能设置了高突发性,但桶每小时只会充电一次,而且只有当您每小时实际收到的数据包少于一包时。
最糟糕的部分是这些限制适用于所有数据包,因为如果它们是已建立/相关 conntrack 状态的一部分,则您不会接受它们。
转储中的统计数据-L
表明这不是问题,但也许您在测试之前进行了转储。 (您可以-S
通过添加来包含统计信息-v
)。
无关:有很多方法可以简化您的规则集。如果该limitlog
链仅由 调用-i eth1 -o eth0
,则可以省略其中的所有-i
和-o
。
答案2
您需要state RELATED,ESTABLISHED
从外部到内部的流量的规则,并且需要一个或多个允许内部流量到外部的规则。您可以允许所有服务或仅允许某些服务。
ACCEPT
我发现在名为 * 的链中to s 很令人困惑log
。
TCPMSS
此外,为内部到外部的流量制定规则可能很有用:
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
你应该考虑一下你想要记录什么以及为什么。