我使用一台具有两个不同互联网连接的 Linux 机器作为本地网络的默认网关。每个互联网连接都有自己的公共 IP 地址。我使用带有“ip rule”命令的源路由来平衡这两个互联网连接之间的传出流量。
eth0是本地网络,eth1和ppp0连接互联网,linux机器本身使用eth1连接互联网。
一切工作正常,除了我无法从本地网络访问 ppp0 公共 IP:
ping PPP0-PUBLIC-IP #works fine from the linux machine
ping PPP0-PUBLIC-IP #works fine from outside network
ping PPP0-PUBLIC-IP #**fails** from other machines on local network
还:
$ip rule ls
0: from all lookup local
32763: from x.x.x.x lookup Home
32765: from 192.168.0.208/28 lookup Home
32766: from all lookup main
32767: from all lookup default
$ip route show table local
...
local x.x.x.x dev ppp0 proto kernel scope host src x.x.x.x
...
其中 xxxx 是 ppp0 公共 IP 地址。我在这里做错了什么?为什么我无法从本地网络 ping ppp0 公共 IP 地址,但我可以从外部网络 ping 它?
更新:我使用两个 iptables 命令来设置 NAT。我不确定这是否是正确的方法,但它对我有用:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
更新 2:当我从本地网络上的一台机器 ping ppp0 公共 IP 地址时,网关上的 tcpdump 输出表明数据包从本地网络正确到达,但似乎内核没有将它们传送到应用程序层。
答案1
你需要使用发夹型NAT在这种情况下。请注意,PCI-DSS 不允许这种类型的 NAT 规则。