我的主机出现以下情况:
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 输出为:
输出ip link
:
输出ip -4 addr
:
输出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 规则、路由或其他内容,即使你没有将它们放在那里。