Alpine linux veth 网络/网桥没有互联网

Alpine linux veth 网络/网桥没有互联网

我一直在尝试按照多个指南为 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,正如我所看到的回答此问答

相关内容