我一直在尝试按照多个指南为 2 个命名空间设置 veth 对,它们可以在 alpine linux 上相互通信。到目前为止,命名空间之间的通信正常,但两个命名空间都无法连接/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 并设置命名空间的默认路由后应该能够进行通信,但是网络不是我的核心研究领域,所以任何建议都非常有用。如果有任何信息缺失,请随时发表评论,如果我遗漏了某些信息,我会尽力提供。
答案1
我应用了你的设置逐字并且它正在发挥作用。
您肯定在某个地方打错了,或者没有完全按照您在问题中所写的内容来写。
两点评论:
bridge link show br1
是无效的语法。man bridge
在最近的版本中进行了修改,可能是因为这是一个常见的错误:
bridge link show
- 列出端口配置适用于所有桥梁. 此命令显示端口配置和标志适用于所有桥梁。要显示特定网桥的端口配置和标志,请使用“
ip link show master <bridge_device>
”命令。
因此你应该使用:
ip link show master br1
或者您会在其他网桥上获得额外的接口。当然这无所谓。
重要的是:
ip -all netns exec ip route add default via 192.168.1.10
应该在网络命名空间中设置默认路由(并且对我来说也是如此),但是你后来写道:
当我跑步时
ip netns exec namespace1 ip route
我得到结果:
192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.11
这里缺少默认路由。在我的系统上执行同样的操作,我得到了你应该得到但却没有得到的结果:
# ip netns exec namespace1 ip route
default via 192.168.1.10 dev veth1
192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.11
因此,找出缺失的内容。手动重新测试您给出的命令,不要更改任何顺序,并验证您是否获得了默认路由。例如,如果接口关闭然后再次打开,此路由将丢失(但在 OP 的脚本中没有这样做)。如果需要,请不要使用,-all
而是重复两次命令一次namespace1
一次namespace2
。
更新:从评论中的进一步讨论来看,OP 也iptables'并将 FORWARD 策略设置为 DROP。
如果打算启用命名空间间通信(应该br_netfilter被激活,见最后)以及来自命名空间的任何传出流量,可以简单地使用例如:
iptables -I FORWARD -i br1 -j ACCEPT
同样,如果需要,命名空间也可以到达主机:
iptables -I INPUT -i br1 -j ACCEPT
我们确实应该认真考虑这方面的安全性,并将规则集成到现有的防火墙解决方案中。
如果运行其他工具(如 Docker)的话,事情可能会变得更加复杂,因为它可能会启用br_netfilter,正如我所看到的回答此问答。