将 NAT 流量返回到正确的接口

将 NAT 流量返回到正确的接口

在定制主板(运行 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 路由回来,这是我的问题。

我已经搜索过解决方案,而且可能已经找到了,但我还是没能解决这个问题。我确信有一个简单的方法可以解决这个问题,所以现在我希望有人能帮我解决这个问题。我知道我应该自己找到一个合适的解决方案,但不知何故我却找不到。

相关内容