Openvswitch: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
(Подготовка физических интерфейсов)
(Создаём конфигурацию для поднятия моста vmbr0 поверх ens20 средствами etcnet)
 
(не показано 27 промежуточных версий этого же участника)
Строка 1: Строка 1:
 +
=Введение=
 +
 +
Данная статья написана и проверена для операционной системы Альт Сервер ветки P10.
 +
 +
С высокой долей вероятности описанные здесь способы будут работать и в более старших версиях дистрибутивов ОС "Альт".
 +
 
=Общие настройка=
 
=Общие настройка=
  
Строка 22: Строка 28:
  
 
Остальные файлы в каталоге интерфейса (/etc/net/ifaces/ens19) должны отсутствовать
 
Остальные файлы в каталоге интерфейса (/etc/net/ifaces/ens19) должны отсутствовать
 +
 +
Далее в Alt Linux можно настроить Openvswitch либо посредством ovs-vsctl либо через конфигурационные файлы etcnet.
 +
 +
Оба способа описаны ниже. Предпочтительным является способ через etcnet, т.к. в таком случае сохраняются читабельные конфигурационные файлы в тексте.
  
 
=Настройка через ovs-vsctl=
 
=Настройка через ovs-vsctl=
Строка 83: Строка 93:
 
  cd /etc/net/ifaces/
 
  cd /etc/net/ifaces/
  
  ls ens19
+
  ls ens20
 
  options
 
  options
  
 
<pre>
 
<pre>
cat ens19/options
+
cat ens20/options
OOTPROTO=static
+
BOOTPROTO=static
 
TYPE=eth
 
TYPE=eth
NM_CONTROLLED=no
 
 
DISABLED=no
 
DISABLED=no
CONFIG_WIRELESS=no
 
SYSTEMD_BOOTPROTO=static
 
 
CONFIG_IPV4=yes
 
CONFIG_IPV4=yes
SYSTEMD_CONTROLLED=no
 
 
ON_BOOT=yes
 
ON_BOOT=yes
 +
</pre>
 +
 +
Должны быть только эти файлы и только такое содержимое в них.
 +
 +
Количество самих интерфейсов и их названия могут отличаться.
 +
 +
Дальнейшие примеры будут строиться на базе физического интерфейса
 +
 +
ens20
 +
 +
==Создаём конфигурацию для поднятия моста vmbr0 поверх ens20 средствами etcnet==
 +
 +
Далее будет использоваться синтаксис [https://ru.wikipedia.org/wiki/Heredoc-%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81 heredoc] для более удобного конфигурирования через копирование текста мышью из браузера в эмулятор терминала
 +
 +
Создаём мост vmbr0 поверх физического интерфейса ens20 с выводом трафика с виланов 100, 200, 999 через сетевой интерфейс ens20 во внешнюю сеть.
 +
 +
cd /etc/net/ifaces/
 +
 +
mkdir vmbr0
 +
 +
<pre>
 +
cat << 'EOF' > vmbr0/options
 +
BOOTPROTO=static
 +
TYPE=ovsbr
 +
DISABLED=no
 +
CONFIG_IPV4=yes
 +
ON_BOOT=yes
 +
HOST=ens20
 +
OVS_REMOVE=yes
 +
EOF
 +
</pre>
 +
 +
<pre>
 +
cat << 'EOF' > vmbr0/ifup-post
 +
ovs-vsctl set port ens20 trunks=100,200,999
 +
EOF
 +
</pre>
 +
 +
chmod +x vmbr0/ifup-post
 +
 +
systemctl restart network
 +
 +
Проверка
 +
 +
ovs-vsctl show
 +
 +
должна вернуть что-то типа
 +
 +
<pre>
 +
968569fe-451b-4b42-b191-65700538b36b
 +
    Bridge vmbr0
 +
        Port ens20
 +
            trunks: [100, 200, 999]
 +
            Interface ens20
 +
        Port vmbr0
 +
            Interface vmbr0
 +
                type: internal
 +
    ovs_version: "2.17.8"
 +
</pre>
 +
 +
Для вывода трафика из виланов на физические интерфейсы в файл
 +
 +
vmbr0/ifup-post
 +
 +
дополнительно можно добавить команды. Например для вывода вилана 100 и 200, соответственно в физические интерфейсы ens21 и ens22 файл можно создать так:
  
 +
<pre>
 +
cat << 'EOF' > vmbr0/ifup-post
 +
ovs-vsctl set port ens20 trunks=100,200,999
 +
ovs-vsctl set port ens21 tag=100
 +
ovs-vsctl set port ens22 tag=200
 +
EOF
 
</pre>
 
</pre>
  
  ls ens20
+
==Создаём конфигурацию для поднятия vlan интерфейса vlan999 с id=999 поверх моста vmbr0 средствами etcnet==
  options
+
 
 +
  cd /etc/net/ifaces/
 +
 
 +
  mkdir vlan999
  
 
<pre>
 
<pre>
cat ens20/options
+
cat << 'EOF' > vlan999/options  
OOTPROTO=static
+
BOOTPROTO=static
TYPE=eth
+
TYPE=ovsport
NM_CONTROLLED=no
 
 
DISABLED=no
 
DISABLED=no
CONFIG_WIRELESS=no
 
SYSTEMD_BOOTPROTO=static
 
 
CONFIG_IPV4=yes
 
CONFIG_IPV4=yes
SYSTEMD_CONTROLLED=no
 
 
ON_BOOT=yes
 
ON_BOOT=yes
 +
BRIDGE=vmbr0
 +
VID=999
 +
EOF
 +
</pre>
 +
 +
echo '10.10.10.2/24' > vlan999/ipv4address
 +
 +
systemctl restart network
 +
 +
Проверка
 +
 +
ovs-vsctl show
 +
 +
должна вернуть что-то типа
 +
 +
<pre>
 +
968569fe-451b-4b42-b191-65700538b36b
 +
    Bridge vmbr0
 +
        Port vlan999
 +
            tag: 999
 +
            Interface vlan999
 +
                type: internal
 +
        Port vmbr0
 +
            Interface vmbr0
 +
                type: internal
 +
        Port ens20
 +
            trunks: [100, 200, 999]
 +
            Interface ens20
 +
    ovs_version: "2.17.8"
 
</pre>
 
</pre>
  
Должны быть только эти файлы и только такое содержимое в них.
+
Проверяем все сетевые интерфейсы
 +
 
 +
<pre>
 +
ip a
 +
 
 +
...
 +
физический интерфейс ens20. Особое внимание на state UP
 +
...
 +
3: ens20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master ovs-system state UP group default qlen 1000
 +
    link/ether 7a:ba:31:39:f3:47 brd ff:ff:ff:ff:ff:ff
 +
    altname enp0s20
 +
    inet6 fe80::78ba:31ff:fe39:f347/64 scope link
 +
      valid_lft forever preferred_lft forever
 +
...
 +
интерфейс ovs-system, который создаётся посредством openvswitch. state не имеет значения
 +
...
 +
18: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
 +
    link/ether 7e:d8:51:8b:62:59 brd ff:ff:ff:ff:ff:ff
 +
...
 +
мост vmbr0. state UNKNOWN -- это нормально
 +
...
 +
19: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
 +
    link/ether c6:f3:66:f8:cf:4f brd ff:ff:ff:ff:ff:ff
 +
    inet6 fe80::c4f3:66ff:fef8:cf4f/64 scope link
 +
      valid_lft forever preferred_lft forever
 +
...
 +
vlan интерфейс vlan999. state UNKNOWN -- это нормально. inet 10.10.10.2/24 -- это настроенный на нём статический ip-адрес
 +
...
 +
20: vlan999: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
 +
    link/ether fa:52:f6:ff:05:87 brd ff:ff:ff:ff:ff:ff
 +
    inet 10.10.10.2/24 scope global vlan999
 +
      valid_lft forever preferred_lft forever
 +
    inet6 fe80::f852:f6ff:feff:587/64 scope link
 +
      valid_lft forever preferred_lft forever
 +
</pre>
 +
 
 +
 
 +
=Коллизии с одинаковыми MAC-адресами при работе в виртуальных стендах=
 +
 
 +
==Проблема==
 +
 
 +
В виртуальных стендах используются клоны виртуальных машин. Следовательно, клоны могут вести себя одинаково. До такой степени одинаково, что openvswitch и etcnet могут поднимать сетевые интерфейсы с абсолютно одинаковыми MAC-адресами.
 +
 
 +
Например, на вилан-интерфейсах на разных машинах могут быть одинаковые MAC-адреса. Следовательно, ping между двумя такими машинами (с одинаковыми MAC-адресами) работать не будет.
 +
 
 +
==Решение==
 +
 
 +
Для решения этой проблемы можно воспользоваться дополнительным конфигурационным файлом в каталоге etcnet.
 +
 
 +
Например, для интерфейса
 +
 
 +
vlan999
 +
 
 +
можно задать другой MAC-адрес путём создания в каталоге
 +
 
 +
/etc/net/ifaces/vlan999
 +
 
 +
файла
 +
 
 +
iplink
 +
 
 +
со следующем содержимым
 +
 
 +
address 0a:98:99:c0:e8:28
 +
 
 +
, где
 +
 
 +
0a:98:99:c0:e8:28
 +
 
 +
-- это желаемый MAC-адрес
 +
 
 +
После создания файла необходимо перезапустить сервис network командой
 +
 
 +
systemctl restart network
  
Количество самих интерфейсов и их названия могут отличаться.
+
После этого можно проверить вывод команды
  
Дальнейшие примеры будут строиться на базе физических интерфейсов
+
ip a
  
ens19 и ens20
+
и убедиться в том, что на сетевом интерфейсе поменялся MAC-адрес

Текущая версия на 10:21, 10 октября 2024

Введение

Данная статья написана и проверена для операционной системы Альт Сервер ветки P10.

С высокой долей вероятности описанные здесь способы будут работать и в более старших версиях дистрибутивов ОС "Альт".

Общие настройка

Включить сервис

systemctl enable --now openwsvitch

Настройки физических интерфейсов через etcnet на примере ens19

cat /etc/net/ifaces/ens19/options 
BOOTPROTO=static
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
CONFIG_WIRELESS=no
SYSTEMD_BOOTPROTO=static
CONFIG_IPV4=yes
SYSTEMD_CONTROLLED=no
ON_BOOT=yes

Остальные файлы в каталоге интерфейса (/etc/net/ifaces/ens19) должны отсутствовать

Далее в Alt Linux можно настроить Openvswitch либо посредством ovs-vsctl либо через конфигурационные файлы etcnet.

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

Настройка через ovs-vsctl

Проверить конфигурацию

ovs-vsctl show

Очистить конфигурацию

ovs-vsctl emer-reset

Добавить мост

ovs-vsctl add-br vmbr0

Прикрепляем к мосту vmbr0 физический сетевой интерфейс ens20

ovs-vsctl add-port vmbr0 ens20 trunks=100,200,999

Если необходимо создать мост vmbr0 поверх физических интерфейсов ens19, ens20, ens21 и при этом транковые порты должны быть только на ens19, а физические порты ens20 и ens21 должны работать на виланах, соответственно, 100 и 200

ovs-vsctl add-port vmbr0 ens19 trunks=100,200,999
ovs-vsctl add-port vmbr0 ens20 tag=100
ovs-vsctl add-port vmbr0 ens21 tag=200

Если нужно удалить физический сетевой интерфейсens20 из моста vmbr0

ovs-vsctl del-port vmbr0 ens20

Чтобы создать интерфейс vlan999 (не физический) и привязать его к мосту vmbr0 и трафику с тегом 999 (для управления хостом)

ovs-vsctl add-port vmbr0 vlan999 tag=999 -- set Interface vlan999 type=internal

Далее интерфейс vlan999 настраивается аналогично физическому интерфейсу

cat /etc/net/ifaces/vlan999/options 
BOOTPROTO=static
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
CONFIG_WIRELESS=no
SYSTEMD_BOOTPROTO=static
CONFIG_IPV4=yes
SYSTEMD_CONTROLLED=no
ON_BOOT=yes
cat /etc/net/ifaces/vlan999/ipv4address 
10.10.10.2/24

Настройка через etcnet

Подготовка физических интерфейсов

cd /etc/net/ifaces/
ls ens20
options
cat ens20/options
BOOTPROTO=static
TYPE=eth
DISABLED=no
CONFIG_IPV4=yes
ON_BOOT=yes

Должны быть только эти файлы и только такое содержимое в них.

Количество самих интерфейсов и их названия могут отличаться.

Дальнейшие примеры будут строиться на базе физического интерфейса

ens20

Создаём конфигурацию для поднятия моста vmbr0 поверх ens20 средствами etcnet

Далее будет использоваться синтаксис heredoc для более удобного конфигурирования через копирование текста мышью из браузера в эмулятор терминала

Создаём мост vmbr0 поверх физического интерфейса ens20 с выводом трафика с виланов 100, 200, 999 через сетевой интерфейс ens20 во внешнюю сеть.

cd /etc/net/ifaces/
mkdir vmbr0
cat << 'EOF' > vmbr0/options
BOOTPROTO=static
TYPE=ovsbr
DISABLED=no
CONFIG_IPV4=yes
ON_BOOT=yes
HOST=ens20
OVS_REMOVE=yes
EOF
cat << 'EOF' > vmbr0/ifup-post
ovs-vsctl set port ens20 trunks=100,200,999
EOF
chmod +x vmbr0/ifup-post
systemctl restart network

Проверка

ovs-vsctl show

должна вернуть что-то типа

968569fe-451b-4b42-b191-65700538b36b
    Bridge vmbr0
        Port ens20
            trunks: [100, 200, 999]
            Interface ens20
        Port vmbr0
            Interface vmbr0
                type: internal
    ovs_version: "2.17.8"

Для вывода трафика из виланов на физические интерфейсы в файл

vmbr0/ifup-post

дополнительно можно добавить команды. Например для вывода вилана 100 и 200, соответственно в физические интерфейсы ens21 и ens22 файл можно создать так:

cat << 'EOF' > vmbr0/ifup-post
ovs-vsctl set port ens20 trunks=100,200,999
ovs-vsctl set port ens21 tag=100
ovs-vsctl set port ens22 tag=200
EOF

Создаём конфигурацию для поднятия vlan интерфейса vlan999 с id=999 поверх моста vmbr0 средствами etcnet

cd /etc/net/ifaces/
mkdir vlan999
cat << 'EOF' > vlan999/options 
BOOTPROTO=static
TYPE=ovsport
DISABLED=no
CONFIG_IPV4=yes
ON_BOOT=yes
BRIDGE=vmbr0
VID=999
EOF
echo '10.10.10.2/24' > vlan999/ipv4address
systemctl restart network

Проверка

ovs-vsctl show

должна вернуть что-то типа

968569fe-451b-4b42-b191-65700538b36b
    Bridge vmbr0
        Port vlan999
            tag: 999
            Interface vlan999
                type: internal
        Port vmbr0
            Interface vmbr0
                type: internal
        Port ens20
            trunks: [100, 200, 999]
            Interface ens20
    ovs_version: "2.17.8"

Проверяем все сетевые интерфейсы

ip a

...
физический интерфейс ens20. Особое внимание на state UP
...
3: ens20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master ovs-system state UP group default qlen 1000
    link/ether 7a:ba:31:39:f3:47 brd ff:ff:ff:ff:ff:ff
    altname enp0s20
    inet6 fe80::78ba:31ff:fe39:f347/64 scope link 
       valid_lft forever preferred_lft forever
...
интерфейс ovs-system, который создаётся посредством openvswitch. state не имеет значения
...
18: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 7e:d8:51:8b:62:59 brd ff:ff:ff:ff:ff:ff
...
мост vmbr0. state UNKNOWN -- это нормально
...
19: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether c6:f3:66:f8:cf:4f brd ff:ff:ff:ff:ff:ff
    inet6 fe80::c4f3:66ff:fef8:cf4f/64 scope link 
       valid_lft forever preferred_lft forever
...
vlan интерфейс vlan999. state UNKNOWN -- это нормально. inet 10.10.10.2/24 -- это настроенный на нём статический ip-адрес
...
20: vlan999: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether fa:52:f6:ff:05:87 brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.2/24 scope global vlan999
       valid_lft forever preferred_lft forever
    inet6 fe80::f852:f6ff:feff:587/64 scope link 
       valid_lft forever preferred_lft forever


Коллизии с одинаковыми MAC-адресами при работе в виртуальных стендах

Проблема

В виртуальных стендах используются клоны виртуальных машин. Следовательно, клоны могут вести себя одинаково. До такой степени одинаково, что openvswitch и etcnet могут поднимать сетевые интерфейсы с абсолютно одинаковыми MAC-адресами.

Например, на вилан-интерфейсах на разных машинах могут быть одинаковые MAC-адреса. Следовательно, ping между двумя такими машинами (с одинаковыми MAC-адресами) работать не будет.

Решение

Для решения этой проблемы можно воспользоваться дополнительным конфигурационным файлом в каталоге etcnet.

Например, для интерфейса

vlan999

можно задать другой MAC-адрес путём создания в каталоге

/etc/net/ifaces/vlan999

файла

iplink

со следующем содержимым

address 0a:98:99:c0:e8:28

, где

0a:98:99:c0:e8:28

-- это желаемый MAC-адрес

После создания файла необходимо перезапустить сервис network командой

systemctl restart network

После этого можно проверить вывод команды

ip a

и убедиться в том, что на сетевом интерфейсе поменялся MAC-адрес