我有一个Linux网关与iptables的路由和端口转发。 我希望端口转发独立于路由发生。
为了向前端口,我把这个添加到nat表中:
iptables -t nat -A "$PRE" -p tcp -d $GW --dport $fromPort -j DNAT --to-destination $toHost:$toPort iptables -t nat -A "$POST" -p tcp -d $toHost --dport $toPort -j SNAT --to $SRC
$PRE和POST实际上是特定于目的地的链,我分别从PREROUTING和POSTROUTING链跳转到所以我可以保持iptables清洁。 $SRC是我正在SNATing的IP地址与网关IP $GW 。
这个设置的问题是没有被DNATed但是碰巧到相同$toHost:$toPort组合的常规路由数据包也将被SNATed。
我希望避免这一点。 我可以做什么聪明的事情?
保持简单:你实际上不需要SNAT任何东西。 通过这样做,每个数据包将到达目标服务器似乎来自您的防火墙,而不是来自始发客户端,在大多数情况下不是你想要的。
通过SNAT规则,您不必担心与其他stream量匹配。
注意:由于在应用DNAT规则后达到了FORWARD链,因此您的FORWARD规则必须与真实的源IP和内部目标IP相匹配。
编辑
考虑到SNAT的要求:只要你对DNAT规则匹配数据包的方式感到满意,那么你可以使用标记这些相同数据包的mangle规则:
iptables -t mangle -A <mangle chain> -p tcp -d $GW --dport $fromPort -j MARK --set-mark 0x1
那么你的SNAT规则所要做的就是匹配那些标记的数据包:
iptables -t nat -A "$POST" -m mark --mark 0x1 -j SNAT --to $SRC
如果你需要识别多个独立的stream,你应该能够改变脚本中的标记以及$SRC 。