我一直在尝试按照多个指南为 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 并设置命名空间的默认路由之后进行通信,但是网络不是我的核心研究领域,所以任何建议都会非常有用。如果缺少任何信息,请随时发表评论,如果我错过了什么,我会尽力提供。
我逐字应用了您的设置,它正在工作。
您一定是在某处打错了字,或者没有完全按照您在问题中写的内容进行操作。
两个备注:
是无效的语法。
man bridge
在最近的版本中进行了修改可能是因为这是一个常见的错误:所以你应该改用:
或者你会在其他网桥上获得额外的接口。当然没关系。
重要的是:
应该在网络命名空间中设置默认路由(并且为我做了),但你稍后会写:
这里缺少默认路由。在我的系统上做同样的事情,我得到了,你应该有但没有:
因此,找出缺少的内容。在不更改任何顺序的情况下,完全按照给定的方式手动重新测试您的命令,并验证您是否获得了默认路由。例如,如果接口关闭然后再次启动,则此路由将丢失(但在 OP 的脚本中未完成)。如果需要,不要使用
-all
但重复两次命令一次namespace1
一次 fornamespace2
。更新:从评论中的进一步讨论看来,OP 也有iptables,其 FORWARD 策略设置为 DROP。
如果打算启用命名空间间流量(是否应激活br_netfilter,请参阅最后)以及来自命名空间的任何传出流量,则可以简单地使用例如:
同样,如果需要,命名空间也可以到达主机:
关于这一点的安全性确实值得深思,并将规则集成到现有的防火墙解决方案中。
如果像 Docker 这样的其他工具正在运行,事情可能会变得更加复杂,因为它可能会启用br_netfilter,正如我对这个 Q/A 的回答中所见。