使用 iptables 限制 ICMP

使用 iptables 限制 ICMP

我有以下规则,我相信它会将 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稍后的规则可能会把事情搞得一团糟。

您有两个选择:

  1. 根据每个协议设置相关的和已建立的规则。
  2. 使该类型的 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

在它们被政策删除之前允许它们。

相关内容