NAT 规则不起作用

NAT 规则不起作用

我的主机出现以下情况:

      veth5
     10.0.0.3
        o  
        |
   ------------    -----------------                    eth0
   |   br0    |----|--o         o--|----o           o------o------ internet
   ------------    | veth3   veth6 | veth7         ppp0
                   |               |            192.168.0.2                    |   namespace   |
                   -----------------

路由配置是使用基于策略的路由进行的。据此,从主机发送到互联网(例如,使用 ping)的数据包通过 veth5 进入我的网络,然后进入命名空间。从这里,它被转发到 veth7,然后转发到 ppp0 并到达互联网。

我想配置一条 NAT 规则,使用 ppp0 IP (192.168.0.2) 伪装所有内部 IP 地址。然后我使用 iptables 添加了规则

$ iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

然而,我的数据包到达eth0时没有被上述规则伪装。

编辑

vethW 和 eth0 的 tcmpdump 输出为:

tcpdump_output_veth tcpdump_输出_eth

输出ip link

ip链接

输出ip -4 addr

ip -4 地址

输出conntrack -L

  • 从主机 ping Internet

在此输入图像描述

  • 从命名空间 ping Internet

在此输入图像描述

  • 将 nat 规则添加到命名空间后,从主机 ping Internet

在此输入图像描述

有人知道原因吗?

先谢谢您的帮助。

答案1

不是答案,而是缩小问题范围的尝试:

我复制了一个类似的、稍微简化的设置,并且伪装效果很好。它看起来像这样:

+-----------+                             +----------+
|        o--|--o                  o--ptya |  ptyb--o |
|   veth0b  |  veth0a          ppp0       |     ppp0 |
| 10.0.0.1  |  10.0.0.254  10.0.3.1       | 10.0.3.2 |
|           |                             |          |
|   ns0     |                             |   ns1    |
+-----------+                             +----------+

其中 ppp 连接是通过以下方式建立的(当然,命名空间 ns1 中的第二个 pppd):

socat PTY,link=/tmp/ptya PTY,link=/tmp/ptyb
sudo pppd `readlink /tmp/ptya` noauth nocrtscts xonxoff local maxfail 0 10.0.3.1:10.0.3.2 persist
sudo pppd `readlink /tmp/ptyb` noauth nocrtscts xonxoff local maxfail 0 10.0.3.2:10.0.3.1 persist

伪装:

sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

从 ns0 开始,在主命名空间中ping 10.0.3.2显示为tcpdump -i ppp0

IP 10.0.3.1 > 10.0.3.2: ICMP echo request, id 23836, seq 1, length 64
IP 10.0.3.2 > 10.0.3.1: ICMP echo reply, id 23836, seq 1, length 64

所以伪装显然是有效的,而且并不是 ppp 接口在某种程度上起作用。

接下来我会尝试的事情:

  • 在您的服务器上复制 socat/ppp 设置,并查看它是否有效,或者是否存在阻止其工作的不同之处。

  • 我最初尝试与用户空间建立 PPPoE 连接pppoe,但这非常复杂,导致 pppd 产生的pppoe-server不断死机,我还没有弄清楚为什么。因此,如果您可以将 PPPoE 配置减少到类似的设置(也许可以告诉我您做了什么),人们就可以弄清楚是否是 PPPoE 以某种方式搞砸了事情。

  • 在尝试此操作时,我注意到如果您不小心的话,脚本会在幕后执行很多操作:默认路由、IP 地址分配、iptables 条目等等。所以我会仔细检查你的设置中是否有有趣的 iptables 规则、路由或其他内容,即使你没有将它们放在那里。

相关内容