我一直在尝试按照多个指南为 2 个可以在 alpine linux 上相互通信的命名空间设置 veth-pair。到目前为止,我在命名空间之间进行了通信,但两个命名空间都不能连接/ping 到任何外部 ip/url。
这是我完全使用的指南配置:
ip netns add namespace1
ip netns add namespace2
ip netns exec namespace1 ip address show
ip link add veth1 type veth peer name br-veth1
ip link add veth2 type veth peer name br-veth2
ip link set veth1 netns namespace1
ip link set veth2 netns namespace2
ip netns exec namespace1 ip address show
ip netns exec namespace1 ip addr add 192.168.1.11/24 dev veth1
ip netns exec namespace1 ip address show
ip netns exec namespace2 ip addr add 192.168.1.12/24 dev veth2
# Create the bridge device naming it `br1`
# and set it up:
ip link add name br1 type bridge
ip link set br1 up
ip link | grep br1
# Set the bridge veths from the default
# namespace up.
ip link set br-veth1 up
ip link set br-veth2 up
ip netns exec namespace1 ip link set veth1 up
ip netns exec namespace2 ip link set veth2 up
# Add the br-veth* interfaces to the bridge
# by setting the bridge device as their master.
ip link set br-veth1 master br1
ip link set br-veth2 master br1
bridge link show br1
ip addr add 192.168.1.10/24 brd + dev br1
ip -all netns exec ip route add default via 192.168.1.10
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
我还验证了 /etc/sysctl.conf 包含
net.ipv4.ip_forward = 1
我也运行了这个命令以防万一
sysctl -w net.ipv4.ip_forward=1
我的 resolv.conf 包含:
nameserver 8.8.8.8
当我跑步时
ip netns exec namespace1 ip route
我得到结果:
192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.11
如果我运行一个常规的 ip 路由列表,我会得到:
192.168.56.0 eth0 proto kernel scope link src 192.168.56.217
192.168.1.0/24 dev br1 proto kernel scope link src 192.168.1.10
我不知道为什么上面的设置不起作用,因为大多数指南似乎建议主机和命名空间应该能够在执行 MASQUERADE 并设置命名空间的默认路由之后进行通信,但是网络不是我的核心研究领域,所以任何建议都会非常有用。如果缺少任何信息,请随时发表评论,如果我错过了什么,我会尽力提供。