我应该使用 iptables 对 nat 表进行状态匹配吗?

我应该使用 iptables 对 nat 表进行状态匹配吗?

我经常看到 iptables 链中有一些有状态的匹配规则,例如 INPUT。

我知道他们在做什么,我对此很感兴趣

我应该对表 NAT 链执行同样的事情吗?

例如,在我的家庭路由器中,我希望它接受 ssh,并且充当 NAT 路由器。

如果我们有:

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

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

我应该做以下事情以获得更好的表现吗?

-t nat -A POSTROUTING -m state --state RELATED,ESTABLISHED -j MASQUERADE

-t nat -A POSTROUTING -s 192.168.1.0/24 -o wan0 -m state --state NEW -j MASQUERADE

我想我应该不是对 POSTROUTING 链执行相同操作,但是应该前进。

谢谢!

答案1

不,你不需要那个。

动态 NAT 规则始终使用 conntrack 表。因此,这是无用的(也是错误的)。该nat表仅由第一的连接的数据包,因此它只会看到--ctstate NEW数据包。它永远不会看到--ctstate ESTABLISHED数据包,因为这些数据包不会穿越规则。如果在连接跟踪器 nat 表中找到数据包,它会应用记录的转换并继续下一个表。

连接状态考虑似乎在FORWARD链中很有用,而不是在PREROUTING或中,因此在或表POSTROUTING中使用它。FORWARD filterFORWARD mangle

附加说明:statematch 模块已过时并从内核中删除。实际的匹配是通过conntrack模块实现的。在我看来,最好明确使用它,所以最好总是使用-m conntrack --ctstate ...而不是-m state

相关内容