Я пытаюсь настроить мост между двумя интерфейсами TAP, каждый из которых создан в своем собственном сетевом пространстве имен в Linux. Я использую 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% потере пакетов.
Я бы ожидал, что смогу проверить связь с интерфейсом изнутри его собственного пространства имен (например, testif1 из test_ns1). Я могу сделать это с интерфейсами Quantum, но не со своим, почему?
Тогда я совершенно уверен, что OpenVSwitch установлен правильно, потому что я использую стандартную версию Ubuntu, и у меня на том же компьютере работает OpenStack Quantum.
OpenStack не создает тап-устройства с ip tuntap add
. Вместо этого он создает внутренние порты на мосту openvswitch, используя ovs-vsctl add-port
команда. Поскольку openvswitch реализует внутренние порты как устройства с ответвлением, OpenStack помечает эти порты как «tapXXXX».
Чтобы создать интерфейс testif1 на мосту openvswitch и поместить его в пространство имен 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