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

Hub*_*bro 21 networking linux iptables

我在不同的超级用户回答中看到了这个 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
Run Code Online (Sandbox Code Playgroud)

关键是始终允许作为已建立连接的一部分发送的数据包。我想知道的部分是前两行。

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

解释这两者之间的区别会很好。

har*_*ymc 19

主要回答:

Conntrack取代state,但在现代内核中,两者现在没有区别。 如果内核有它,State当前conntrack在 iptables 中被别名和翻译,所以语法-m state --state 实际上被翻译成 -m conntrack --ctstate同一个模块并由它处理。

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

可能的解释:

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

或者这可能只是Cargo cult 编程的一个例子。


Kam*_*ski 5

2012年的ServerFault上有这样一个问题:

两者之间的实际区别是什么:

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

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

哪一个最好用?

接受的答案是:

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

标题xt_conntrack.c

xt_conntrack - Netfilter module to match connection tracking
information. (Superset of Rusty's minimalistic state match.)
Run Code Online (Sandbox Code Playgroud)

所以我想说——状态模块更简单(而且可能更不容易出错)。内核也更长。另一边的 Conntrack 有更多的选项和功能[1]。

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

netfilter 邮件列表上有类似的问题。

[1] 非常有用,例如-m conntrack --ctstate DNAT -j MASQUERADE" routing/DNAT fixup;-)

其他答案之一导致了这份关于 的文档iptables。它说:

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

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

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

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

state已被弃用,取而代之的是conntrack,并且可能会也可能不会编译,具体取决于内核的构建方式。