测试环境:CentOS 6.3 - kernel 2.6.32-279.el6.i686, iptables v1.4.7 Win7 ? CentOS Windows 不断地以 10pkt/sec 的速率向 CentOS 重放 ICMP 回声请求。
在 iptables 中,我添加了如下规则来限制传入的 icmp 请求数据包速率。但它没有用。因为在第一个传入的 icmp 请求被第一个规则接受并且我的主机回复之后,接下来的所有 icmp 请求都将被第二个规则接受,它将接受传入的 icmp 请求作为 ESTABLISHED 状态数据包。我认为这没有意义。

我查看了“Iptables Tutorial 1.2.2”,发现如下语句:
正如我们已经解释的那样,回复数据包被认为是 ESTABLISHED。但是,我们可以肯定地知道,在ICMP回复之后,同一连接中绝对不会再有合法流量了。因此,一旦回复通过 Netfilter 结构,连接跟踪条目就会被销毁。在上述每种情况下,请求被视为 NEW,而回复被视为 ESTABLISHED。
但是,我发现在/proc/net/nf_conntrack发送第一个回复后,conntrack 条目始终存在。
ipv4 2 icmp 1 24 src=192.168.56.1 dst=192.168.56.101 type=8 code=0 id=1 src=192.168.56.101 dst=192.168.56.1 type=0 code=0 id=1 mark=0 secmark=0 use=2
Run Code Online (Sandbox Code Playgroud)
我认为每个传入的 ICMP 请求都应该被视为 NEW 状态而不是 ESTABLISHED,即使已经建立了 icmp 连接。
如果我不以正确的方式理解状态匹配,请纠正我。
正如您所建议的,连接跟踪显然会记录您的 ICMP“会话”,因此一旦执行了乒乓往返,它就会认为数据包处于 ESTABLISHED 状态。
为了实现限制 ICMP 请求的目标,您将“丢弃所有其他 ICMP”规则(屏幕截图中的第三条规则)移至接受速率限制的回显请求的规则下方。这样,ICMP 数据包就不会考虑 ESTABLISHED 规则。
然而,由于 ICMP 数据包也用于传达各种问题,我强烈建议您添加一条规则,接受所有类型不是“回显请求”的 icmp 数据包,以确保您不会遇到 TCP 连接等问题(作为例如,“连接被拒绝”是使用 ICMP 进行通信的)。我建议的规则是:
iptables -A INPUT -p icmp ! --icmp-type echo-request -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
并将其放在接受 ECHO 请求的速率限制规则的正下方,并放在“丢弃所有其他 ICMP”规则的正上方。