iptables“state”和“ctstate”有什么区别?

iptables“state”和“ctstate”有什么区别?

我在另一个超级用户的回答中看到了这个 iptables 片段:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

重点是始终允许作为已建立连接的一部分发送的数据包。我感兴趣的部分是上面两行。

对于链来说,同时写和INPUT有什么意义。似乎两者都应该做同样的事情?-m conntrack --ctstate RELATED,ESTABLISHED-m state --state RELATED,ESTABLISHED

对这两者之间的差异的解释将会很好。

答案1

主要答案:

Conntrack取代state,但在现代内核中,两者之间没有区别。 State当前在 iptables 中被别名并转换为(conntrack如果内核有的话),因此语法-m state --state 实际上被转换为 -m conntrack --ctstate同一个模块并由其处理。

但是,在一些旧内核上,必须专门启用 contrack。

可能的解释:

在我看来,您引用的规则似乎包含重复内容,既适用于旧内核,也适用于新内核。

或者这只是一个例子货物崇拜编程

答案2

ServerFault 上的这个问题从 2012 年开始:

以下两者之间有何实际区别:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

哪一个最好用?

接受的答案是:

两者底层都使用相同的内核内部结构(连接跟踪子系统)。

标题xt_conntrack.c

xt_conntrack - Netfilter module to match connection tracking
information. (Superset of Rusty's minimalistic state match.)

所以我想说 -- 状态模块更简单(可能更不容易出错)。它在内核中也更长。另一方面,Conntrack 有更多选项和功能[1]。

conntrack我的建议是,如果您需要它的功能,就使用它,否则就坚持使用状态模块。

关于 netfilter 邮件列表的类似问题。

[1] 相当有用-m conntrack --ctstate DNAT -j MASQUERADE" routing/DNAT fixup;-)

另一个答案导致了这一点关于的文件iptables。 它说:

matchconntrack是 match 的扩展版本state,它能够以更精细的方式匹配数据包。它让您可以直接查看连接跟踪系统中可用的信息,而无需任何“前端”系统,例如 match 中的系统state

所以我认为这是正确的(来自另一个答案):

这两条规则的结果没有区别。

请注意,该问题下还有一个有趣的评论:

state已被弃用,取而代之的是conntrack,并且可能会或可能不会被编译,这取决于你的内核是如何构建的。

相关内容