iptables 在发送第一个回复数据包后将匹配以下 ICMP 请求数据包作为 ESTABLISHED 状态

iptables 在发送第一个回复数据包后将匹配以下 ICMP 请求数据包作为 ESTABLISHED 状态

测试环境:CentOS 6.3 - 内核 2.6.32-279.el6.i686,iptables v1.4.7 Win7 ⇔ CentOS Windows 不断以 10pkt/sec 的速率向 CentOS 重播 ICMP echo 请求。

在 iptables 中,我添加了如下规则来限制传入的 icmp 请求数据包速率。但这没有用。因为在第一个规则接受第一个传入的 icmp 请求并且我的主机回复后,第二个规则将接受所有后续的 icmp 请求,第二个规则将接受传入的 icmp 请求作为 ESTABLISHED 状态数据包。我认为这没有道理。

在此输入图像描述

我查看了“Iptables教程1.2.2”,发现如下声明:

Iptables 教程 ► 状态机

正如我们已经解释过的,回复数据包被视为已建立。然而,我们可以肯定的是,在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

我认为每个传入的 ICMP 请求都应该被视为新状态而不是 ESTABLISHED,即使 icmp 连接已经建立。

如果我没有正确理解状态匹配,请纠正我。

答案1

正如您所建议的,连接跟踪显然会记录您的 ICMP“会话”,因此一旦执行了乒乓往返,它就会认为数据包处于 ESTABLISHED 状态。

为了实现限制 ICMP 请求的目标,您将“丢弃所有其他 ICMP”规则(屏幕截图中的第三条规则)移至接受速率限制的回显请求的规则下方。这样,ICMP 数据包就不会考虑 ESTABLISHED 规则。

但是,由于 ICMP 数据包也用于传达各种问题,因此我强烈建议您添加一条规则,接受具有某种类型的所有 icmp 数据包其他而不是“echo-r​​equest”,以确保您不会遇到 TCP 连接等问题(例如,“连接被拒绝”是使用 ICMP 传达的)。我建议的规则是:

iptables -A INPUT -p icmp ! --icmp-type echo-request -j ACCEPT

并将其放在接受 ECHO 请求的速率限制规则的正下方,并放在“丢弃所有其他 ICMP”规则的正上方。

相关内容