![将 NAT 流量返回到正确的接口](https://linux22.com/image/693316/%E5%B0%86%20NAT%20%E6%B5%81%E9%87%8F%E8%BF%94%E5%9B%9E%E5%88%B0%E6%AD%A3%E7%A1%AE%E7%9A%84%E6%8E%A5%E5%8F%A3.png)
在定制主板(运行 4.x 内核)上,我有两个物理以太网接口和一个无线调制解调器,它为我提供了一个 ppp 接口。iproute2 已安装,我正在使用 nftables(而不是 iptables)。
我的问题是,我想将通过 ppp0 或 eth0 进入的特定 UDP 流量(到端口 41000-41002)转发到位于 eth1 后面的特定主机。转发工作正常,但我无法让返回流量正常工作。下面是我如何设置的示例:
eth0 has IP 192.168.10.10
eth1 has IP 192.168.100.10
ppp0 has IP 10.10.10.10
我想要发送流量(并从中返回流量)的外部主机的 IP 为 192.168.100.1,并且它物理连接到与 eth1 相同的网络。
现在,nftables 设置如下所示:
table ip firewall {
chain incoming {
type filter hook input priority 0; policy drop;
ct state established,related accept
iifname "lo" accept
icmp type echo-request accept
tcp dport { ssh} accept
}
chain prerouting {
type nat hook prerouting priority 0; policy accept;
iifname "ppp0" udp dport 41000-41002 dnat 192.168.100.1
iifname "eth0" udp dport 41000-41002 dnat 192.168.100.1
}
chain postrouting {
type nat hook postrouting priority 100; policy accept;
oifname != "lo" masquerade
}
}
我的 iproute2 路由规则如下:
0: from all lookup local
1000: from 192.168.100.1 lookup ppproute
2000: from 10.10.10.10 lookup ppproute
32766: from all lookup main
32767: from all lookup default
并且 ppproute 表仅包含 ppp0 上的默认路由:
default dev ppp0 scope link
使用此设置,如果入站流量通过 ppp0 进入,则一切都会正常工作。数据包由 nftables/netfilter 正确重写,并从 eth1 退出。返回流量符合 1000 规则,并返回到发送方。
如果流量通过 eth0 进入,它也会按应有的方式到达 192.168.100.1 处的主机,但返回流量也会通过 ppp0 路由回来,这是我的问题。
我已经搜索过解决方案,而且可能已经找到了,但我还是没能解决这个问题。我确信有一个简单的方法可以解决这个问题,所以现在我希望有人能帮我解决这个问题。我知道我应该自己找到一个合适的解决方案,但不知何故我却找不到。