如果我在SERVER
机器的默认命名空间中运行 Web 服务器,我可以curl
从REMOTE
机器上执行此操作:
curl http://SERVER:80/
现在我将 Web 服务器放入命名空间中nested
,并提供veth
对等的nested's
网络接口:
sudo ip link add veth type veth peer name vpeer
sudo ip link set vpeer netns nested
sudo ip addr add 192.168.3.77/24 dev veth
sudo ip link set veth up
sudo ip netns exec nested ip addr add 192.168.3.78/24 dev vpeer
sudo ip netns exec nested ip link set vpeer up
sudo ip netns exec nested ip route add default via 192.168.3.77
所以我可以从默认命名空间 ping 它:
curl --interface veth 192.168.3.78:80/
我的问题:如何nested
从远程机器 ping 命名空间中的 Web 服务器?似乎curl http://SERVER:80/
变成了lo
接口。我可以将外部请求指向veth
接口吗?或者如何配置配对?
答案1
- 远程主机必须具有到嵌套命名空间 IP 地址 ( ) 的路由
192.168.3.78
。路由设置取决于许多因素。 - 应该在默认命名空间中启用 ip 转发(sysctl 变量
net.ipv4.ip_forward
应该是1
)。 - 防火墙应允许在
veth
和 LAN 接口之间转发数据包。结果,您应该可以在远程主机和嵌套命名空间之间成功 ping。 - 如果
SERVER
域名指向本地 IP 地址之一,则应使用DNAT
目标将请求重定向到网络命名空间:
iptables -t nat -I PREROUTING -p tcp --dport 80 --dst <orig-ip> -j DNAT --to 192.168.3.78
iptables -t nat -I OUTPUT -p tcp --dport 80 --dst <orig-ip> -j DNAT --to 192.168.3.78
- 使用 tcpdump 来解决问题。