我经常看到 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 filter
FORWARD mangle
附加说明:state
match 模块已过时并从内核中删除。实际的匹配是通过conntrack
模块实现的。在我看来,最好明确使用它,所以最好总是使用-m conntrack --ctstate ...
而不是-m state
。