iptables icmp 规则生效的延迟

iptables icmp 规则生效的延迟

我已将 iptables 设置为禁用所有传入连接,即

:INPUT DROP [0:65535]

启动 iptables 后,我运行以下命令来启用 ping:

/usr/sbin/iptables -A INPUT -m icmp --icmp-state 8 -j ACCEPT
/usr/sbin/iptables -A INPUT -m icmp --icmp-state 0 -j ACCEPT

我看到 iptables 规则是从/etc/init.d/iptables status.我可以从 Windows 和 Linux PC 上 ping 通该设备。现在我运行以下命令来删除它们:

/usr/sbin/iptables -D INPUT -m icmp --icmp-state 8 -j ACCEPT
/usr/sbin/iptables -D INPUT -m icmp --icmp-state 0 -j ACCEPT

我看到 iptables 规则已从 中删除/etc/init.d/iptables status。我无法从 Linux PC ping 设备,这是预期的。但是,我可以从 Windows PC ping 设备 1-2 分钟,然后就无法 ping 通它。

我不会从 Windows XP PC 无限期地对设备执行 ping 操作(即不使用 -t),但为什么会得到此结果?

答案1

从您提供的所有信息来看,我只是猜测当您删除规则时,您的Linux PC的IP地址不再存在iptables conntrack table,因此其流量会下降。 Windows PC 的 IP 地址可能仍出现在 conntrack 表中,因此其流量被接受。

iptables从上到下处理每条规则。所以你定义的规则的顺序iptables非常重要。在你的情况下,你的链条INPUT看起来像:

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 127.0.0.0/255.0.0.0 -j ACCEPT
....
-A INPUT -m icmp --icmp-state 8 -j ACCEPT
-A INPUT -m icmp --icmp-state 0 -j ACCEPT

所以你可以看到,即使你删除ICMP规则,如果客户端连接在 conntrack 表中,它仍然被 接受iptables

您可以阅读有关iptables conntrack table 这里:

当连接看到两个方向的流量时,conntrack 条目将擦除 [UNREPLIED] 标志,然后重置它。告诉我们连接没有看到任何双向流量的条目将被 [ASSURED] 标志替换,可以在条目末尾附近找到。 [ASSURED] 标志告诉我们这个连接是有保证的,并且如果我们达到最大可能的跟踪连接,它不会被删除。因此,标记为 [ASSURED] 的连接不会被删除,这与非保证连接(未标记为 [ASSURED] 的连接)相反。连接跟踪表可以容纳多少个连接取决于可以通过最新内核中的 ip-sysctl 函数设置的变量。该条目保存的默认值在很大程度上取决于您拥有的内存量。在 128 MB RAM 上,您将获得 8192 个可能的条目,在 256 MB RAM 上,您将获得 16376 个条目。您可以通过 /proc/sys/net/ipv4/ip_conntrack_max 设置读取和设置您的设置。

答案2

iptables 维护有关先前/当前连接的某些状态,这可能会导致您对 iptables 发出的更改似乎有延迟应用。要查看和操作状态,您首先需要安装 conntrack:

sudo apt-get conntrack

这样,您就可以发出

sudo conntrack -L

查看该状态中以前/当前连接的列表。

您可以通过运行来完全清除此状态

sudo conntrack -F

但是,这将杀死所有当前打开的连接,即使当前有效的规则仍然允许它们。您可以更细粒度地处理从状态表中删除的内容。跑步

sudo conntrack

获得有关该命令的一些基本帮助。您通常正在处理“conntrack”表,如果未指定该表,则该命令将对其进行操作。例如,对于打开或关闭 NAT 的用例,我将运行

sudo conntrack -D --any-nat

发出适当的 iptables 命令来关闭或打开 nat 后。

答案3

您可以通过在规则集的开头添加规则来显式阻止 ICMP 协议:

iptables -I INPUT -p icmp -j DROP

需要注意的一件事是,RELATED,ESTABLISHED 规则应该是规则集中的最后一个规则。否则,ESTABLISHED 状态将匹配旨在匹配其他规则的数据包,最终导致您的计数器失效并使调试成为一场噩梦,例如您当前遇到的情况

答案4

这是正常行为,也是 RELATED,ESTABLISHED 应该做的事情

“相关的、已建立的规则应该是你的规则中的最后一条规则”完全是无稽之谈,你不想为每个答案包跳过整个链,并且在没有明确拒绝/删除之前无论如何都不会改变行为,但是使处理每个包变得更加昂贵,因为它正在评估每个规则并且最后一个接受它

毫无理由地让 8.38 亿个包裹通过前向链中的 27 条规则,享受乐趣 - 正确的规则集是按照命中率最高的规则排序的,最后是最终拒绝/丢弃规则

Chain FORWARD(策略 DROP 0 数据包,0 字节) num pkts 字节 target prot opt in out 源目的地 1 838M 852G ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 2 35M 1912M INBOUND all - - 万兰 0.0.0.0/0 0.0.0.0/0 0

相关内容