我正在尝试在我的一个 lxd 容器上设置 openvpn 以允许访问容器网络。服务器似乎可以工作,我可以访问 (ping) 具有指向我的外部/源网络的 openvpn 服务器的静态路由的容器。
我希望不必更改每个容器的路由表,并且认为我可以使用 NAT 将 vpn 客户端隐藏在 vpn 服务器后面。
iptables -t nat -I POSTROUTING -s 10.8.0.0/24 -d 10.144.79.0/24 -j SNAT --to-source 10.144.79.127
或者
iptables -t nat -I POSTROUTING -s 10.8.0.0/24 -d 10.144.79.0/24 -j MASQUERADE
生成一条我认为应该可以实现该目的的规则。但是ping
来自 VPN 客户端的数据包似乎仍然来自指定的 10.8.0.0/24 地址,而不是被屏蔽到 10.144.79.127。
第一条规则产生:
root@openvpn:~# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 10.8.0.0/24 10.144.79.0/24 to:10.144.79.127
但tcpdump
在 10.144.79.0/24 中的 ping 目标上仍然看起来像:
13:56:10.930826 IP 10.8.0.6 > 10.144.79.212: ICMP echo request, id 33133, seq 10093, length 64
13:56:10.930855 IP 10.144.79.212 > 10.8.0.6: ICMP echo reply, id 33133, seq 10093, length 64
当然,只有.212
知道路由10.8.0.0/24
后它才有效10.144.79.127
。
转发处于活动状态:
root@openvpn:~# cat /proc/sys/net/ipv4/ip_forward
1
root@openvpn:~# sysctl -p
net.ipv4.ip_forward = 1
我设置了三个 virtualbox vm 来验证当 LXD 不是方程的一部分时我是否可以使 NAT 工作,并且它能否按预期工作。
为什么容器会忽略POSTROUTING规则?