LINUX.ORG.RU
ФорумAdmin

NetworkManager + Open vSwitch: поднять внутренний линк

 ,


0

1

Доброго времени суток

На тестовом стенде с libvirt решил попробовать openvswitch. Реальных интерфейсов не добавлял, свитч чисто внутренний

Интерфейс на стороне хоста без проблем поднимается через iproute2 и через /etc/network/initerfaces

Но у меня не получается сделать это через NetworkManager. unmanaged и всё тут. Все созданные connection не привязываются к device

Где я торможу?

подробности:

Как создавал виртуальный свитч:

root@io:~# ovs-vsctl add-br ovs-br0
root@io:~# ovs-vsctl set port ovs-br0 trunks=22,23,24

## после запуска 2 ВМ:
root@io:~# ovs-vsctl show
0ebe929a-0acc-41ad-8d3b-72638f781ed0
    Bridge ovs-br0
        Port vnet2
            tag: 23
            Interface vnet2
        Port ovs-br0
            trunks: [22, 23, 24]
            Interface ovs-br0
                type: internal
        Port vnet1
            tag: 23
            Interface vnet1
    ovs_version: "3.1.0"

ВМ друг друга пингуют, все ок. Теперь надо добавить доступ из ОС. Т.е. тупо поднять vlan на транковом интерфейсе ovs-br0

  • через iproute2 без проблем:
## до всех действий интерфейс ovs-br0 на стороне хоста в состоянии down
## это его дефолтное значение, вообще не проблема, ВМ все равно друг друга пингуют
ip link set dev ovs-br0 up
ip link add link ovs-br0 name ovs-br0.23 type vlan id 23
ip link set dev ovs-br0.23 up
ip a a 192.168.23.1/24 dev ovs-br0.23
## все, интерфейс поднят, пинг с хоста к ВМ проходит
  • через устаревший debian’овский /etc/network/interfaces тоже без проблем
## до всех действий интерфейс ovs-br0 на стороне хоста в состоянии down
## это ок, см. предыдущий пункт
root@io:~# grep -A1 ovs-br0 /etc/network/interfaces
iface ovs-br0.23 inet static
        address 192.168.23.1/24
root@io:~# ifup ovs-br0.23
## все, интерфейсы (оба, и транковый ovs-br0, и vlan ovs-br0.23) подняты, пинг с хоста к ВМ проходит
  • а вот через NetworkManager не выходит каменный цветок. По какой-то причине он считает device ovs-br0 unmanaged. несмотря на то, что в конфиге я вроде бы разрешил управлять всем
root@io:~# nmcli dev | grep ovs
ovs-br0     openvswitch  unmanaged               --         

root@io:~# cat /etc/NetworkManager/NetworkManager.conf 
[main]
plugins=ifupdown,keyfile

[ifupdown]
managed=true

[main]
no-auto-default=*

[keyfile]
unmanaged-devices=

## напомню, по дефолту ovs-br0 в состоянии down
## если поднять ovs-br0 вручную через ip l set dev ovs-br0 up, то NetwokManager согласен создать на нём vlan
nmcli con add type vlan con-name ovs-br0.23 dev ovs-br0 id 23 ipv4.method manual ipv4.addresses 192.168.23.1/24 ipv6.method disabled
## после этого хост пингует ВМ
## НО. без ручного поднятия интерфейса NetworkManager не привязывает созданный vlan никуда
## а хотелось бы, чтобы эта конструкция переживала ребут :)

У NetworkManager есть некий плагин openvswitch (https://developer-old.gnome.org/NetworkManager/stable/nm-openvswitch.html) Насколько я понял, он нужен для того, чтобы управлять openvswitch через NetworkManager. Как раз это мне категорически НЕ нужно. От NetworkManager на тестовом стенде требуется только поднять (просто поднять) транковый интерфейс, навесить на него vlan и уже на интерфейсе vlan’а назначить ip

★★★★★

попробовал принудительно перевести device в managed. в результате он меняет статус на unavailable (скорее всего потому, что в ip l l виден «state UNKNOWN»)

nmcli dev set ovs-br0 managed yes
nmcli dev
nmcli dev set ovs-br0 managed no

как workaround, добавил в /etc/network/interface

auto ovs-br0

iface ovs-br0 inet manual

теперь после загрузки интерфейс в UP, и навешивание vlan’а через NetworkManager работает. Но это какой-то костыль

Все ещё не могу понять, как заставить NetworkManager самому переводить device в up

router ★★★★★
() автор топика

не нужно через ip li там ничего создавать.

Если тебе с хоста нужно получить доступ в vlan какого-то ovs-бриджа, то для этого есть отдельное заклятие

ovs-vsctl add-port $BRIDGE "$IFNAME" "tag=$VID" -- set interface "$IFNAME" type=internal

Как это делать через NM - без понятия.

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

ovs-vsctl add-port $BRIDGE "$IFNAME" "tag=$VID" -- set interface "$IFNAME" type=internal

Спасибо, пригодится

Только и с ним NetworkManager работать не хочет, т.к. у созданного интерфейса тип «openvswitch» и он тоже считается unmanaged :/

root@io:~# ovs-vsctl add-port ovs-br0 vlan23 tag=23 -- set interface vlan23 type=internal

root@io:~# ovs-vsctl show
0ebe929a-0acc-41ad-8d3b-72638f781ed0
    Bridge ovs-br0
        Port vnet0
            tag: 23
            Interface vnet0
        Port ovs-br0
            trunks: [22, 23, 24]
            Interface ovs-br0
                type: internal
        Port vlan23
            tag: 23
            Interface vlan23
                type: internal
        Port vnet1
            tag: 23
            Interface vnet1
    ovs_version: "3.1.0"

root@io:~# nmcli dev 
DEVICE      TYPE         STATE                   CONNECTION 
enp3s0      ethernet     connected               enp3s0     
lo          loopback     connected (externally)  lo         
vnet0       tun          disconnected            --         
vnet1       tun          disconnected            --         
enp2s0      ethernet     unavailable             --         
wlp4s0      wifi         unavailable             --         
ovs-br0     openvswitch  unmanaged               --         
ovs-system  openvswitch  unmanaged               --         
vlan23      openvswitch  unmanaged               --         

Вчера я ещё пробовал создать dummy интерфейс и добавить его в ovs-br0

root@io:~# ip link add dummy0 type dummy
## вчера пробовал без type=internal
root@io:~# ovs-vsctl add-port ovs-br0 dummy0 tag=23


root@io:~# ovs-vsctl show
0ebe929a-0acc-41ad-8d3b-72638f781ed0
    Bridge ovs-br0
        Port vnet0
            tag: 23
            Interface vnet0
        Port dummy0
            tag: 23
            Interface dummy0
                type: internal
                error: "could not add network device dummy0 to ofproto (File exists)"
        Port ovs-br0
            trunks: [22, 23, 24]
            Interface ovs-br0
                type: internal
        Port vnet1
            tag: 23
            Interface vnet1
    ovs_version: "3.1.0"

## порт попадает в вывод ovs-dpctl show
root@io:~# ovs-dpctl show
system@ovs-system:
  lookups: hit:3125 missed:120 lost:0
  flows: 5
  masks: hit:3610 total:3 hit/pkt:1.11
  cache: hit:2930 hit-rate:90.29%
  caches:
    masks-cache: size:256
  port 0: ovs-system (internal)
  port 1: ovs-br0 (internal)
  port 2: vnet0
  port 3: vnet1
  port 4: dummy0

## и даже трафик через него виден
## но пинга нет
tcpdump -nn -i dummy0

## и в FDB mac адрес нового порта не попадает
root@io:~# ovs-appctl fdb/show ovs-br0
 port  VLAN  MAC                Age
    1    23  52:54:00:64:fe:8e    1
    2    23  52:54:00:8d:b3:89    1


## попробовал добавить ему type internal
root@io:~# ovs-vsctl set interface dummy0 type=internal

## команда вроде проходит, но результат странный
## could not add network device dummy0 to ofproto (File exists)

root@io:~# ovs-vsctl show
0ebe929a-0acc-41ad-8d3b-72638f781ed0
    Bridge ovs-br0
        Port vnet0
            tag: 23
            Interface vnet0
        Port ovs-br0
            trunks: [22, 23, 24]
            Interface ovs-br0
                type: internal
        Port dummy0
            tag: 23
            Interface dummy0
                type: internal
                error: "could not add network device dummy0 to ofproto (File exists)"
        Port vnet1
            tag: 23
            Interface vnet1
    ovs_version: "3.1.0"

## и порт пропадает из вывода 
root@io:~# ovs-dpctl show
system@ovs-system:
  lookups: hit:3413 missed:126 lost:0
  flows: 3
  masks: hit:3938 total:2 hit/pkt:1.11
  cache: hit:3194 hit-rate:90.25%
  caches:
    masks-cache: size:256
  port 0: ovs-system (internal)
  port 1: ovs-br0 (internal)
  port 2: vnet0
  port 3: vnet1

## ну и в дампе теперь пусто
router ★★★★★
() автор топика
Ответ на: комментарий от router

Т.е. либо создавать порт с internal интерфейсом штатными средствами openvswitch, и он получит тип «openvnswitch», с которым не хочет работать NetworkManager

либо создавать обычный dummy порт, но его не получается корректно сделать internal, а без этого трафик почему-то не проходит

Пока оставил костыль с поднятием основного internal порта через /etc/network/interfaces с последующим созданием на нём vlan’а средствами NetworkManagner. Думаю, как ещё попытаться обойти проблему. Вообще она скорее с NetworkManager, который почему-то не хочет работать с портами типа «openvswitch»

## тип интерфейса
root@io:~# ip -detail -json l l | jq -r '.[] | .ifname + ": " + (.linkinfo?.info_kind?|tostring)' | cat
lo: null
enp2s0: null
enp3s0: null
wlp4s0: null
ovs-system: openvswitch
ovs-br0: openvswitch
vnet0: tun
vnet1: tun
dummy0: dummy
vlan23: openvswitch


## драйвер интерфейса
root@io:~# iface_list=$(ip -json  l l | jq -r '.[] | .ifname' )
root@io:~# for iface in $iface_list ; do echo $iface $(ethtool -i $iface | grep driver); done
Cannot get driver information: Operation not supported
lo
enp2s0 driver: igc
enp3s0 driver: igc
wlp4s0 driver: iwlwifi
ovs-system driver: openvswitch
ovs-br0 driver: openvswitch
vnet0 driver: tun
vnet1 driver: tun
dummy0 driver: dummy
vlan23 driver: openvswitch
router ★★★★★
() автор топика
Последнее исправление: router (всего исправлений: 2)