我有一个关于使用 iptables 进行 NAT 的奇怪的问题。
当我在规则末尾的 NAT 表的后路由链中执行 SNAT 时,我应该给出 -J ACCEPT 吗?
我看到后路由规则上的计数器在增加,但没有数据包离开机器。那么这是否意味着数据包被自动丢弃了?
答案1
不可以。每条规则只有一个目标 (-j)。这-j SNAT
是独有的,您不能为一条规则提供两个目标。如果您需要接受数据包,则应在“过滤器”表的“FORWARD”链中使用“ACCEPT”目标。
仅当存在丢弃数据包的规则或“FORWARD”链的默认策略为“DROP”时,才会丢弃数据包。在这两种情况下,这些计数器都会更新。
更可能的是,路由未启用或者您的路由表不完整。
启用路由:
sysctl net.ipv4.ip_forward=1
答案2
我认为您所需要的是(eth0 朝外):
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
而且当然
echo 1 > /proc/sys/net/ipv4/ip_forward
巧合的是,前几天我也在玩这个。上面的方法有效,但我读到的文章有时会说“这不能处理所有流量”,而没有进一步的解释。