我在另一个超级用户的回答中看到了这个 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
我的建议是,如果您需要它的功能,就使用它,否则就坚持使用状态模块。[1] 相当有用
-m conntrack --ctstate DNAT -j MASQUERADE" routing/DNAT fixup
;-)
另一个答案导致了这一点关于的文件iptables
。 它说:
match
conntrack
是 match 的扩展版本state
,它能够以更精细的方式匹配数据包。它让您可以直接查看连接跟踪系统中可用的信息,而无需任何“前端”系统,例如 match 中的系统state
。
所以我认为这是正确的(来自另一个答案):
这两条规则的结果没有区别。
请注意,该问题下还有一个有趣的评论:
state
已被弃用,取而代之的是conntrack
,并且可能会或可能不会被编译,这取决于你的内核是如何构建的。