我经常看到 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 链做同样的事情,而应该对 FORWARD 做同样的事情。
谢谢!
不,你不需要那个。
动态 NAT 规则始终使用 conntrack 表。所以这是没用的(也是错误的)。该
nat
表仅由连接的第一个数据包遍历,因此它只会看到--ctstate NEW
数据包。它永远不会看到--ctstate ESTABLISHED
数据包,因为它们不会遍历规则。如果在连接跟踪器 nat 表中找到数据包,则应用记录的转换并继续下一个表。连接状态考虑似乎在
FORWARD
链中有用,而不是在PREROUTING
orPOSTROUTING
中,所以在FORWARD filter
orFORWARD mangle
表中使用它。附加说明:
state
匹配模块已过时并从内核中删除。实际匹配是用conntrack
模块实现的。在我看来,最好明确地使用它,所以最好总是使用-m conntrack --ctstate ...
而不是-m state
.