Данная статья применима к:

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7), РУСБ.10015-10
  • Astra Linux Special Edition РУСБ.10015-17
  • Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)
  • Astra Linux Special Edition РУСБ.10015-03 (очередное обновление 7.6)
  • Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1 и исп. 2
  • Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)
  • Astra Linux Common Edition 2.12

Введение

В статье рассматриваются приемы включения и настройки сетевых служб VLAN и VXLAN.

  • VLAN (Virtual Local Area Network) — виртуальная локальная компьютерная сеть (виртуальный изолированный широковещательный домен). Позволяет группе сетевых устройств взаимодействовать так, как если бы они были подключены к единой изолированной от других сетей локальной сети независимо от физического местонахождения этих устройств. VLAN представляется участникам группы как отдельная физическая локальная сеть, обеспечивает передачу данных между участниками группы и изолирует их от устройств, не входящих в группу. Для идентификации принадлежности сетевых пакетов тому или иному VLAN-у используется двенадцатибитный идентификатор (VLAN ID), т.е. максимальное количество VLAN-ов в одной сети - 4096. Подробнее см. RFC-3069 VLAN Aggregation for Efficient IP Address Allocation и документацию по стандартам IEEE 802.1q. В Astra Linux реализован как модуль ядра (модуль 8021q);

  • VXLAN (Virtual Extensible LAN) - технология сетевой виртуализации, предназначенная для обеспечения масштабируемости больших система облачных вычислений. VXLAN использует схожую с VLAN технику для инкапсуляции кадров Ethernet второго уровня в в пакеты UDP.
    VXLAN обеспечивает функционирование до 16 миллионов изолированных логических сетей второго уровня, позволяя им одновременно существовать в одной сети передачи данных. Представляет собой протокол туннелирования, разработанный для преодоления ограничения в 4096 идентификаторов, установленного в стандарте IEEE 802.1q (VLAN). Размер идентификатора VXLAN увеличен до 24 бит (16 777 216 идентификаторов). Подробнее см. RFC 7348 и стандарт IEEE 802.1ad. В Astra Linux реализован как модуль ядра (модуль vxlan).

Включение и настройка VLAN

Настройка сетевых интерфейсов VLAN подобна настройке обычных сетевых интерфейсов. Важным отличием является то, что интерфейс VLAN привязывается к существующему "родительскому" интерфейсу. Далее в примерах будет выполняться настройка с использованием в качестве родительского простого сетевого интерфейса eth0, однако VLAN может быть настроен с использованием в качестве родительских таких интерфейсов, как объединение (bond или team) или мост (bridge).

Загрузка модуля ядра

Для использования VLAN:


  1. Загрузить модуль ядра 8021q:

    sudo modprobe 8021q

  2. Убедиться, что модуль загружен:

    lsmod | grep 8021q

  3. Добавить в сетевые настройки (iptables) разрешения на создание таблиц маршрутизации:

    echo "500 firsttable" | sudo tee -a /etc/iproute2/rt_tables
    echo "501 firsttable" | sudo tee -a /etc/iproute2/rt_tables"

    Здесь и далее используются VLAN ID 500 и 501;

Для того, чтобы модуль загружался автоматически при загрузке ОС, можно создать в каталоге /etc/modules-load.d/ файл с именем, например,  /etc/modules-load.d/vlan.conf, и перечислить в нём названия загружаемых модулей:

8021q

Настройка VLAN

Создание и настройка VLAN с помощью NetworkManager

  1. Войти в сессию администратора (для Astra Linux Special Edition с включенным МКЦ — администратора с высоким уровнем целостности);
  2. Правой кнопкой мыши нажать на апплет NetworkManager:
  3. В появившемся списке выбрать пункт "Изменить соединения":
  4. Для создания нового соединения нажать кнопку с символом "+";
  5. Выбрать тип соединения VLAN и нажать кнопку "Создать":
  6. В открывшейся форме:
    1. В закладке VLAN задать параметры, относящиеся к VLAN:
      1. Указать имя соединения;
      2. Выбрать родительский интерфейс;
      3. Указать идентификатор VLAN;
      4. По необходимости заполнить остальные параметры:
    2. В остальных закладках указать параметры, как для обычных сетевых соединений.
    3. Нажать кнопку "Сохранить";

Создание и настройка VLAN с помощью службы networking

Для настройки интерфейса VLAN с помощью службы networking

  1. Войти в сессию администратора (для Astra Linux Special Edition с включенным МКЦ — администратора с высоким уровнем целостности);

  2. Проверить список имеющихся сетевых интерфейсов:

    ip link show

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:64:d9:e8 brd ff:ff:ff:ff:ff:ff

    Далее для настройки будет использоваться интерфейс eth0;

  3. В файл конфигурации сетевого интерфейса добавить строки:

    # The first VLAN interface
    auto eth0.500
    iface eth0.500 inet static
    address 172.20.20.10
    netmask 255.255.255.240
    gateway 172.20.20.1
    dns-nameservers 77.88.8.8 77.88.8.1

    Название сетевого интерфейса VLAN должно иметь форму <имя_интерфейса>.<VLAN_ID>;

  4. Включить сетевые интерфейсы:

    sudo ifup eth0.500

  5. Проверить состояние интерфейса:

    sudo ifconfig eth0.500

При необходимости можно добавить несколько интерфейсов VLAN

# The second VLAN interface
auto eth0.501
iface eth0.501 inet static
address 172.21.10.0
netmask 255.255.255.0

Если хост используется в качестве гипервизора, то выполнить настройку сети:

  1. Разрешить в конфигурации сети пересылку пакетов. Для этого создать в каталоге /etc/sysctl.d/ файл с любым именем и расширением .conf. Например:

    echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.d/net.conf
    echo "net.ipv4.conf.all.arp_filter=0" | sudo tee -a /etc/sysctl.d/net.conf
    echo "net.ipv4.conf.all.rp_filter=2" | sudo tee -a /etc/sysctl.d/net.conf
  2. Загрузить конфигурацию:

    sudo sysctl -p

Включение и настройка VXLAN

Базовые команды

  1. Создание устройства VXLAN:

    sudo ip link add vxlan0 type vxlan id 42 group 239.1.1.1 dev eth0 dstport 4789
    Указанная команда создает новое устройство с именем vxlan0. Это устройство использует широковещательную группу 239.1.1.1 и родительское устройство eth0 для обработки трафика, не имеющего правил обработки в таблице пересылки (форвардинга) пакетов. Целевой порт 4789 выбран в соответствии со стандартом IANA;

  2. Удаление устройства VXLAN:

    sudo ip link delete vxlan0

  3. Получение информации об устройстве VXLAN:

    sudo ip -d link show vxlan0

Управление таблицами пересылки VXLAN выполняется с помощью команды bridge:

  1. Создать правило в таблице пересылки:

    sudo bridge fdb add to 00:17:42:8a:b4:05 dst 192.19.0.2 dev vxlan0

  2. Удалить правило пересылки:

    sudo bridge fdb delete 00:17:42:8a:b4:05 dev vxlan0

  3. Получение информации о правилах пересылки:

    sudo bridge fdb show dev vxlan0

Проверить состояние устройства VXLAN можно командой ifconfig:

sudo ifconfig vxlan0

Проверить таблицу маршрутизации можно командой:

sudo route -n

Простейшую проверку работоспособности можно сделать, выполнив команду ping с адресом VXLAN другого устройства:

ping 10.0.0.107

Примеры

Простейший VXLAN "точка-точка"

Описание стенда:

  • Сервер 1:
    • IP-адрес: 172.31.0.106;
    • VXLAN-адрес: 10.0.0.106;
  • Сервер 2:
    • IP-адрес: 172.31.0.107;
    • VXLAN-адрес: 10.0.0.107;

Настройка стенда:

  1. Настройка Сервера 1:
    1. Добавить интерфейс VXLAN:

      sudo ip link add vxlan0 type vxlan id 1 remote 172.31.0.107 dstport 4789 dev eth0

    2. Включить добавленный интерфейс:

      sudo ip link set vxlan0 up

    3. Назначить интерфейсу адрес:

      sudo ip addr add 10.0.0.106/24 dev vxlan0

  2. Настройка Сервера 2 выполняется аналогично, отличаются только адреса:

    sudo ip link add vxlan0 type vxlan id 1 remote 172.31.0.106 dstport 4789 dev eth0
    sudo ip link set vxlan0 up
    sudo ip addr add 10.0.0.107/24 dev vxlan0

VXLAN между контейнерами Docker

Далее используются две хост-машины:

  • Хост-машина 1:
    • IP-адрес: 172.31.0.106;
  • Хост-машина 2:
    • IP-адрес: 172.31.0.107;

По умолчанию контейнеры на каждой хост-машине подключены к одному сетевому мосту и могут коммуницировать друг с другом, а контейнеры на разных хост-машинах не могут коммуницировать друг с другом (для коммуникации может использоваться специальное ПО, как, например k8s). В настоящем примере для установления связи между контейнерами на разных хост-машинах используются стандартные сетевые интерфейсы docker и VXLAN.

Материалы по установке docker и созданию контейнеров см. статью Установка и администрирование Docker в Astra Linux Special Edition. Далее в примере используется образ wiki/astralinux:se.

Далее используется команда brctl из пакета bridge-utils. Установить пакет bridge-utils можно командой:

sudo apt install bridge-utils
При установке docker на компьютере по умолчанию создается специальный сетевой интерфейс - мост docker0, которому присваивается IP-адрес 172.17.0.1/16. Это сетевой мост, соединяющий контейнеры. Проверить параметры интерфейса:
sudo ifconfig docker0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
       inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
       ether 02:42:a9:5e:6f:00  txqueuelen 0  (Ethernet)
       RX packets 0  bytes 0 (0.0 B)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 0  bytes 0 (0.0 B)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
IP-адреса контейнеров docker назначаются автоматически начиная с адреса 172.17.0.2. Чтобы зафиксировать адреса сетевых интерфейсов контейнеров, используемых далее в примере, необходимо при запуске контейнеров использовать параметр --ip. Использование это параметра поддерживается только на дополнительных сетях docker, и такую сеть нужно создать на каждой из хост-машин:
docker network create --subnet 172.18.0.0/16 mynetwork
Проверить список сетей:
docker network ls

NETWORK ID     NAME        DRIVER    SCOPE
265dff745581   bridge      bridge    local
ddf7301657ff   host        host      local
a28625161bb9   mynetwork   bridge    local
b74b0b0796bb   none        null      local
При создании сети будет создан новый сетевой интерфейс br-... типа "мост":
sudo ifconfig

br-a28625161bb9: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
       inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
       ether 02:42:e9:f0:e9:a0  txqueuelen 0  (Ethernet)
       RX packets 0  bytes 0 (0.0 B)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 0  bytes 0 (0.0 B)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
Теперь при запуске контейнера можно указать сеть и фиксированный IP-адрес, для первой хост-машины:
docker run -itd --net mynetwork --ip 172.18.0.2 wiki/astralinux:se
Для второй хост-машины:
docker run -itd --net mynetwork --ip 172.18.0.3 wiki/astralinux:se
Контейнер также можно запустить в сети docker, принятой "по умолчанию", с автоматическим присвоением адреса:
docker run -itd wiki/astralinux:se
Теперь на хост-машинах имеются следующие сетевые интерфейсы:

  • docker0 - мост, созданный при установке docker. Сеть 172.17.0.0/16, IP-адрес интерфейса 172.17.0.1;
  • br-xxxx - мост сети, созданной для реализации примера. Сеть 172.18.0.0/16, IP-адрес интерфейса 172.18.0.1;
  • vethxxxx - интерфейсы контейнеров. Создаются при создании (запуске) каждого контейнера. Интерфейс eth0 контейнера соответствует интерфейсу veth;

При этом на каждой хост-машине работает контейнер.

Получить список мостов и их интерфесов можно командой brctl, например:

sudo brctl show          

br-a28625161bb9         8000.0242e9f0e9a0       no              veth1675dd1
docker0         8000.0242a95e6f00       no              vethe587b2d
Далее создадим сетевые интерфейсы VXLAN в каждой из хост-машин, и подключим их к мосту docker. Сетевые пакеты из контейнера будут доставляться в мост docker, инкапсулироваться в сообщения VXLAN и пересылаться на вторую хост-машину. На второй хост-машине сообщения VXLAN пересылаются в контейнер docker через мост второй хост-машины.

  1. Настройка первой хост-машины:
    1. Создать интерфейс VXLAN с идентификатором (VNI) 2000 и названием vxlan_docker. Параметры похожи на использованные в предыдущем примере:

      sudo ip link add vxlan_docker type vxlan id 200 remote 172.31.0.107 dstport 4789 dev eth0

    2. Включить созданный интерфейс VLAN:

      sudo ip link set vxlan_docker up

    3. Подключить созданный интерфейс к мосту docker:

      sudo brctl addif br-3231f89d69f6 vxlan_docker

  2. Настройка второй хост-машины выполняется аналогично:

    sudo ip link add vxlan_docker type vxlan id 200 remote 172.31.0.106 dstport 4789 dev eth0
    sudo ip link set vxlan_docker up
    sudo brctl addif br-f4b35af34313 vxlan_docker

Далее можно проверить соединение с помощью команды ping, выполняемой в контейнере:

ping 172.18.0.2