![使用 iptables 限制 ICMP](https://linux22.com/image/609025/%E4%BD%BF%E7%94%A8%20iptables%20%E9%99%90%E5%88%B6%20ICMP.png)
我有以下规则,我相信它会将 icmp 数据包限制为 1/s。
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [7:988]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -m limit --limit 1/sec -j ACCEPT
-A INPUT -s 11.x.x.71/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 11.x.x.65/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 11.x.x.66/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
但是当我用“ping -i .001”ping 该主机时,所有数据包都到达了这台机器,并且
iptables-nvLDROP 计数器没有增加。这条规则有什么问题
答案1
这里的问题是,您接受一个数据包(隐含地是新状态),然后尝试应用限制规则。限制可能确实有效,但是RELATED,ESTABLISHED
稍后的规则可能会把事情搞得一团糟。
您有两个选择:
- 根据每个协议设置相关的和已建立的规则。
- 使该类型的 ICMP 流量无法通过状态跟踪进行跟踪。
鉴于桌子现在就在那里......
根据每个协议设置相关的和已建立的规则。
iptables -D INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m tcp -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m udp -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
使该类型的 ICMP 流量无法通过状态跟踪进行跟踪。
iptables -t raw -I PREROUTING -m icmp -p icmp --icmp-type any -j NOTRACK
答案2
我认为你需要在速率限制规则后为 ICMP 添加一条明确的 DROP 规则
-A INPUT -p icmp -m icmp --icmp-type any -m limit --limit 1/sec -j ACCEPT
-A INPUT -p icmp -j DROP
这是因为后续数据包被视为已建立,并且您的后续规则
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
在它们被政策删除之前允许它们。