我正在尝试在 Linux 上配置两个 TAP 接口之间的桥接,每个接口都在其自己的网络命名空间内创建。我使用 OpenVSwitch 作为软件桥接。
我认为这些步骤应该可行:
ip netns add test_ns1
ip netns exec test_ns1 ip tuntap add mode tap testif1
ip netns exec test_ns1 ip addr add 192.168.1.1/24 dev testif1
ip netns exec test_ns1 ip link set testif1 up
ip netns add test_ns2
ip netns exec test_ns2 ip tuntap add mode tap testif2
ip netns exec test_ns2 ip addr add 192.168.1.2/24 dev testif2
ip netns exec test_ns2 ip link set testif2 up
ovs-vsctl add-br test_br
ip netns exec test_ns1 ovs-vsctl add-port test_br testif1
ip netns exec test_ns2 ovs-vsctl add-port test_br testif2
ip netns exec test_ns1 ping -c 2 192.168.1.1
ip netns exec test_ns2 ping -c 2 192.168.1.2
ip netns exec test_ns1 ping -c 2 192.168.1.2
ip netns exec test_ns2 ping -c 2 192.168.1.1
所有四个 ping 命令均不起作用并报告 100% 数据包丢失。
我希望能够从其自己的命名空间内 ping 接口(例如,从 test_ns1 ping testif1)。我可以用 Quantum 接口做到这一点,但不能用我的接口做到这一点,为什么?
然后,我很确定 OpenVSwitch 安装正确,因为我正在运行原始 Ubuntu 版本,并且在同一台机器上运行 OpenStack Quantum。
答案1
OpenStack 不使用 创建 tap 设备ip tuntap add
。相反,它使用 命令在 openvswitch 网桥上创建内部端口ovs-vsctl add-port
。由于 openvswitch 将内部端口实现为 tap 设备,因此 OpenStack 将这些端口标记为“tapXXXX”。
要在 openvswitch 桥上创建 testif1 接口并将其放入 test_ns1 命名空间,请尝试执行以下操作:
ovs-vsctl add-port test_br testif1 -- set interface testif1 type=internal
ip link set testif1 netns test_ns1
ip netns exec test_ns1 ip addr add 192.168.1.1/24 dev testif1
ip netns exec test_ns1 ip link set testif1 up
答案2
是的,只有 ovs 的内部端口支持 L3 功能,这篇文章对此有很好的介绍:https://arthurchiao.art/blog/ovs-deep-dive-6-internal-port/