IPTables连接状态

在大多数默认的iptablesconfiguration中,我读了类似于:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT [...] -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT 

我想知道为什么 – --state NEW常常被添加到第二条规则。 行为不一样吗? 如果有新的连接,第二个规则将被触发,而在现有的连接的情况下,第一个规则将适用。

除了状态NEW,ESTABLISHED和RELATED之外,netfilter还知道两个更less的已知状态,INVALID和UNTRACKED。

从状态机的文档:

无效
INVALID状态意味着数据包不能被识别,或者它没有任何状态。 这可能是由于几个原因,如系统内存不足或ICMP错误消息不响应任何已知的连接。 一般来说,在这个状态下丢弃所有东西是一个好主意。

未经跟踪
这是UNTRACKED状态。 简而言之,如果一个数据包在NOTRACK目标的原始表中被标记,那么这个数据包将在状态机中显示为UNTRACKED。 这也意味着所有RELATED连接都不会被看到,所以在处理UNTRACKED连接时必须谨慎,因为状态机将不能看到相关的ICMP消息等等。

对于什么是一个有效的新连接:

 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT 

有同样的效果

 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p tcp --dport 22 -j ACCEPT 

但后者也会接受INVALID连接,这是你可能不想要的。

所以在有状态的防火墙中,请确保您的规则也知道状态。