我创建了一个网络命名空间(名为ppn
)来在其中运行某些应用程序。这工作得很好,但是当我的商业 VPN(基于 OpenVPN)也启用时,流量似乎只是单向的。
对于网络命名空间的创建,遵循以下逻辑(也使用相同的 IP 地址):https://askubuntu.com/a/499850/820897
当 VPN 被禁用时,从网络命名空间 ping 8.8.8.8 可以正常工作:
sudo ip netns exec ppn ping 8.8.8.8
但是,当启用 VPN 时,尽管tcpdump -i tun0 host 8.8.8.8
记录了 ICMP 回显请求,但我没有收到 ICMP 回显回复。
下面你可以找到我的 iptables 和 ip 路由列表:
- wlo1 位于 192.168.2.106
- tun0 位于 10.8.1.12
sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -s 5.180.62.60/32 -i wlo1 -j ACCEPT
-A INPUT -s 5.180.62.60/32 -i enp5s0 -j ACCEPT
-A INPUT -i wlo1 -j DROP
-A INPUT -i enp5s0 -j DROP
-A OUTPUT -d 5.180.62.60/32 -o wlo1 -j ACCEPT
-A OUTPUT -d 5.180.62.60/32 -o enp5s0 -j ACCEPT
-A OUTPUT -o wlo1 -j DROP
-A OUTPUT -o enp5s0 -j DROP
sudo iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -s 192.168.163.0/24 -o wlo1 -j SNAT --to-source 192.168.2.106
ip路由
0.0.0.0/1 via 10.8.1.1 dev tun0
default via 192.168.2.1 dev wlo1 proto dhcp metric 600
5.180.62.60 via 192.168.2.1 dev wlo1
10.8.1.0/24 dev tun0 proto kernel scope link src 10.8.1.12
128.0.0.0/1 via 10.8.1.1 dev tun0
169.254.0.0/16 dev tun0 scope link metric 1000
192.168.2.0/24 dev wlo1 proto kernel scope link src 192.168.2.106 metric 600
192.168.163.0/24 dev veth-b proto kernel scope link src 192.168.163.254
sudo ip netns 执行 ppn ip 路由
default via 192.168.163.254 dev veth-a
192.168.163.0/24 dev veth-a proto kernel scope link src 192.168.163.1
如何使网络命名空间在 VPN 下也能正常工作?
--------编辑--------
sysctl net.ipv4.ip_forward = 1
在我的系统中
答案1
当数据包离开网络命名空间时,它们(在您的情况下)在网络中具有源地址192.168.163.0/24
。在本地,路由回网络命名空间工作得很好,但是一旦数据包离开本地系统,您需要将此源地址转换为下一跳/网关知道如何路由回您的地址。
这就是表中链的-j SNAT
作用。但是,在您的情况下,您只能将数据包离开接口。这就是为什么路由 via工作正常,但 via (VPN 接口)失败的原因。POSTROUTING
nat
SNAT
wlo1
wlo1
tun0
当数据包通过 路由时tun0
,它们仍然具有网络中的源地址192.168.163.0/24
,并且您的 VPN 服务器不知道如何从该源地址返回数据包。
要解决此问题,您需要将SNAT
数据包离开tun0
接口。这里最简单的选择(因为粘合网络地址通常是动态的)是使用目标-j MASQUERADE
:
iptables -A POSTROUTING -t nat -s 192.168.163.0/24 -o tun0 -j MASQUERADE