iptables 会在第一个回复包发送后匹配下面的 ICMP 请求包作为 ESTABLISHED 状态

dee*_*sky 8 linux iptables

测试环境: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”,发现如下语句:

iptables 教程?状态机

正如我们已经解释的那样,回复数据包被认为是 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 连接。

如果我不以正确的方式理解状态匹配,请纠正我。

Jon*_*lin 2

正如您所建议的,连接跟踪显然会记录您的 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”规则的正上方。