Туннель OvS VXLAN с несколькими идентификаторами туннеля работает только для одного идентификатора туннеля

Я хочу настроить туннель VXLAN между сетевыми интерфейсами Linux на разных виртуальных машинах. Точнее, топология такова. У меня есть две коробки Ubuntu 16.04 Vagrant с установленным OvS 2.5.5. На каждой виртуальной машине я создал мост OvS с именем kos и к каждому мосту добавил порт/интерфейс vxlan с помощью следующей команды:

ovs-vsctl add-port kos vtep -- set interface vtep type=vxlan option:remote_ip=flow option:key=flow

Затем я создал два сетевых интерфейса Linux на каждой машине. Интерфейсы на одной машине имеют одинаковый IP-адрес, но разные MAC-адреса. Я хочу, чтобы четыре интерфейса были разделены на две отдельные VXLAN (идентификаторы 1 и 2 соответственно) и использовали туннелирование OvS VXLAN для обеспечения связи между интерфейсами на разных виртуальных машинах, но в одной и той же VXLAN. Команды, используемые для создания интерфейсов и их подключения к OvS:

VM1:

ovs-vsctl add-port kos kos11 -- set interface kos11 type=internal mac="02\:00\:00\:00\:00\:11" && ip addr add 10.0.0.1/8 scope link dev kos11 && ip link set kos11 up
ovs-vsctl add-port kos kos21 -- set interface kos21 type=internal mac="02\:00\:00\:00\:00\:21" && ip addr add 10.0.0.1/8 scope link dev kos21 && ip link set kos21 up

VM2:

ovs-vsctl add-port kos kos12 -- set interface kos12 type=internal mac="02\:00\:00\:00\:00\:12" && ip addr add 10.0.0.2/8 scope link dev kos12 && ip link set kos12 up
ovs-vsctl add-port kos kos22 -- set interface kos22 type=internal mac="02\:00\:00\:00\:00\:22" && ip addr add 10.0.0.2/8 scope link dev kos22 && ip link set kos22 up

Каждое имя интерфейса создается путем объединения «kos», за которым следуют две цифры, первая из которых представляет собой VNI интерфейса, а вторая — номер виртуальной машины, которой он принадлежит.

Наконец, я получил порты openflow для каждого интерфейса (vtep на обеих виртуальных машинах, kos11, kos21, kos12, kos22) и добавил следующие потоки OpenFlow:

VM1:

table=0,in_port=2,actions=set_field:1->tun_id,resubmit(,1)
table=0,in_port=3,actions=set_field:2->tun_id,resubmit(,1)
table=0,actions=resubmit(,1)

table=1,tun_id=1,arp,arp_tpa=10.0.0.1,actions=output:2
table=1,tun_id=1,dl_dst=02:00:00:00:00:11,actions=output:2

table=1,tun_id=2,arp,arp_tpa=10.0.0.1,actions=output:3
table=1,tun_id=2,dl_dst=02:00:00:00:00:21,actions=output:3

table=1,tun_id=1,arp,arp_tpa=10.0.0.2,actions=set_field:172.28.128.5->tun_dst,output:1
table=1,tun_id=1,dl_dst=02:00:00:00:00:12,actions=set_field:172.28.128.5->tun_dst,output:1

table=1,tun_id=2,arp,arp_tpa=10.0.0.2,actions=set_field:172.28.128.5->tun_dst,output:1
table=1,tun_id=2,dl_dst=02:00:00:00:00:22,actions=set_field:172.28.128.5->tun_dst,output:1

table=1,actions=drop

VM2:

table=0,in_port=2,actions=set_field:1->tun_id,resubmit(,1)
table=0,in_port=3,actions=set_field:2->tun_id,resubmit(,1)
table=0,actions=resubmit(,1)

table=1,tun_id=1,arp,arp_tpa=10.0.0.2,actions=output:2
table=1,tun_id=1,dl_dst=02:00:00:00:00:12,actions=output:2

table=1,tun_id=2,arp,arp_tpa=10.0.0.2,actions=output:3
table=1,tun_id=2,dl_dst=02:00:00:00:00:22,actions=output:3

table=1,tun_id=1,arp,arp_tpa=10.0.0.1,actions=set_field:172.28.128.4->tun_dst,output:1
table=1,tun_id=1,dl_dst=02:00:00:00:00:11,actions=set_field:172.28.128.4->tun_dst,output:1

table=1,tun_id=2,arp,arp_tpa=10.0.0.1,actions=set_field:172.28.128.4->tun_dst,output:1
table=1,tun_id=2,dl_dst=02:00:00:00:00:21,actions=set_field:172.28.128.4->tun_dst,output:1

table=1,actions=drop

1 — это порт openflow, связанный с интерфейсом vtep на обеих виртуальных машинах.

На ВМ1 2 и 3 — это порты openflow, связанные с интерфейсами kos11 и kos21 соответственно.

На ВМ2 2 и 3 — это порты openflow, связанные с интерфейсами kos12 и kos22 соответственно.

1 — VNI VXLAN, которым принадлежат kos11 и kos12, 2 — VNI VXLAN, которым принадлежат kos21 и kos22.

172.28.128.4 и 172.28.128.5 — это IP-адреса сетевых интерфейсов, через которые две виртуальные машины могут пинговать друг друга (также известные как IP-адреса конечных точек туннеля).

После выполнения вышеупомянутых шагов kos11 может пинговать kos12 и наоборот (например, туннелирование для VXLAN с VNI 1 работает), тогда как ping kos22 из kos21 или наоборот приводит к недостижимости хоста назначения. Я запустил tcpdump на kos22, пропинговав его с kos21, и вот что я получил:

ARP, Request who-has 10.0.0.2 tell 10.0.0.1, length 28
ARP, Request who-has 10.0.0.2 tell 10.0.0.1, length 28
ARP, Request who-has 10.0.0.2 tell 10.0.0.1, length 28

Что я делаю не так? Как это исправить?


person Matteo    schedule 02.01.2019    source источник


Ответы (1)


Причина, по которой это не сработало, заключается в том, что у вас не может быть нескольких интерфейсов в одной и той же подсети. Обходной путь, который я нашел, заключается в том, чтобы поместить каждый интерфейс в отдельное сетевое пространство имен Linux.

person Matteo    schedule 24.03.2019