iptables 如何识别数据包状态?

Ale*_*exH 4 security firewall administration iptables

考虑这两组规则:

套餐A

-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j REJECT
-A OUTPUT -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

B组

-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j REJECT
-A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

以前我的印象是两者在功能上是相同的,但最近有人对我说:

建立一个ESTABLISHED,RELATED连接,您必须有一个规则,将连接添加到该规则查看的数据库中。这是通过NEW规则完成的。一旦连接被接受,它就会被放入数据库中,因此ESTABLISHED,RELATED规则可以与之匹配。如果没有NEW规则,db 中没有任何内容,因此ESTABLISHED,RELATED将永远不会匹配任何内容。

所以我承认我对内部的iptables运作方式有点困惑,究竟是如何iptables根据数据包状态标记数据包的?

gol*_*cks 7

[不幸的是,由于消失了,我不得不从下面删除引用,iptables.info所以你可能不得不相信我的几点。]

如果没有 NEW 规则,db 中没有任何内容,因此 ESTABLISHED,RELATED 将永远不会匹配任何内容。

这是错误的。

有五种用户态状态(内核空间中有更多状态),虽然 ESTABLISHED 或 RELATED 连接在逻辑上确实需要以 NEW 数据包开始,但您不需要任何显式的 NEW 规则来生成这样的连接(您确实需要显式的然而,隐含包含新数据包的接受)。按照逻辑,首先考虑其他四种状态,例如:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state INVALID -j REJECT --reject-with icmp-net-prohibited
-A INPUT -m state --state INVALID -j REJECT --reject-with icmp-net-prohibited
Run Code Online (Sandbox Code Playgroud)

我已经遗漏了 NOTRACK,因为它只能由于先前的iptables规则而存在。猜猜应用这些规则后还剩下什么?只有新数据包。您现在可以根据需要对它们进行排序。它会起作用,我保证,并注意:根本没有新规则。没有任何。

iptables 究竟是如何根据数据包状态标记数据包的?

发送回复后建立连接。协议的性质显然在这里发挥了一些作用(内核也应用了这些规则);例如,当一个新的 SYN TCP 数据包被接受时,一个 SYN/ACK 被发送作为回复并且连接被建立;在最终的 FIN/ACK 之后,它已失效。

一个连接如何被认为是 RELATED 显然进一步取决于所涉及的协议;基本上它涉及到/来自已经具有 ESTABLISHED 连接的主机的连接。请注意,有时您必须加载特殊模块(例如,用于 ftp)才能使其工作。