Оглавление |
---|
См. также:
Информация | ||
---|---|---|
| ||
|
Введение
В статье рассматриваются приемы включения и настройки сетевых служб 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:
Загрузить модуль ядра 8021q:
Command sudo modprobe 8021q Убедиться, что модуль загружен:
Command lsmod | grep 8021q Добавить в сетевые настройки (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
- Войти в сессию администратора (для Astra Linux Special Edition с включенным МКЦ — администратора с высоким уровнем целостности);
- Правой кнопкой мыши нажать на апплет NetworkManager:
- В появившемся списке выбрать пункт "Изменить соединения":
- Для создания нового соединения нажать кнопку с символом "+";
- Выбрать тип соединения VLAN и нажать кнопку "Создать":
- В открывшейся форме:
- В закладке VLAN задать параметры, относящиеся к VLAN:
- Указать имя соединения;
- Выбрать родительский интерфейс;
- Указать идентификатор VLAN;
- По необходимости заполнить остальные параметры:
- В остальных закладках указать параметры, как для обычных сетевых соединений.
- Нажать кнопку "Сохранить";
- В закладке VLAN задать параметры, относящиеся к VLAN:
Создание и настройка VLAN с помощью службы networking
Для настройки интерфейса VLAN с помощью службы networking
Войти в сессию администратора (для Astra Linux Special Edition с включенным МКЦ — администратора с высоким уровнем целостности);
Проверить список имеющихся сетевых интерфейсов:
Command Title 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:002: 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;
В файл конфигурации сетевого интерфейса добавить строки:
Блок кода # 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 8.8.8.8 8.8.4.4
Название сетевого интерфейса VLAN должно иметь форму <имя_интерфейса>.<VLAN_ID>;
Включить сетевые интерфейсы:
Command sudo ifup eth0.500 Проверить состояние интерфейса:
Command 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 |
Если хост используется в качестве гипервизора, то выполнить настройку сети:
Разрешить в конфигурации сети пересылку пакетов. Для этого создать в каталоге /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
Загрузить конфигурацию:
Command sudo sysctl -p
Включение и настройка VXLAN
Базовые команды
Создание устройства VXLAN:
Command 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;
Удаление устройства VXLAN:
Command sudo ip link delete vxlan0 Получение информации об устройстве VXLAN:
Command sudo ip -d link show vxlan0
Управление таблицами пересылки VXLAN выполняется с помощью команды bridge:
Создать правило в таблице пересылки:
Command sudo bridge fdb add to 00:17:42:8a:b4:05 dst 192.19.0.2 dev vxlan0 Удалить правило пересылки:
Command sudo bridge fdb delete 00:17:42:8a:b4:05 dev vxlan0 Получение информации о правилах пересылки:
Command sudo bridge fdb show dev vxlan0
Проверить состояние устройства VXLAN можно командой ifconfig:
Command |
---|
sudo ifconfig vxlan0 |
Проверить таблицу маршрутизации можно командой:
Command |
---|
sudo route -n |
Простейшую проверку работоспособности можно сделать, выполнив команду ping с адресом VXLAN другого устройства:
Command |
---|
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:
Добавить интерфейс VXLAN:
Command sudo ip link add vxlan0 type vxlan id 1 remote 172.31.0.107 dstport 4789 dev eth0 Включить добавленный интерфейс:
Command sudo ip link set vxlan0 up Назначить интерфейсу адрес:
Command sudo ip addr add 10.0.0.106/24 dev vxlan0
Настройка Сервера 2 выполняется аналогично, отличаются только адреса:
Command 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 можно командой:
Command |
---|
sudo apt install bridge-utils |
При установке docker на компьютере по умолчанию создается специальный сетевой интерфейс - мост docker0, которому присваивается IP-адрес 172.17.0.1/16. Это сетевой мост, соединяющий контейнеры. Проверить параметры интерфейса:
Command | ||
---|---|---|
| ||
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, и такую сеть нужно создать на каждой из хост-машин:
Command |
---|
docker network create --subnet 172.18.0.0/16 mynetwork |
Проверить список сетей:
Command | ||
---|---|---|
| ||
NETWORK ID NAME DRIVER SCOPE 265dff745581 bridge bridge local ddf7301657ff host host local a28625161bb9 mynetwork bridge local b74b0b0796bb none null local |
При создании сети будет создан новый сетевой интерфейс br-... типа "мост":
Command | ||
---|---|---|
| ||
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-адрес, для первой хост-машины:
Command |
---|
docker run -itd --net mynetwork --ip 172.18.0.2 wiki/astralinux:se |
Для второй хост-машины:
Command |
---|
docker run -itd --net mynetwork --ip 172.18.0.3 wiki/astralinux:se |
Контейнер также можно запустить в сети docker, принятой "по умолчанию", с автоматическим присвоением адреса:
Command |
---|
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, например:
Command | ||
---|---|---|
| ||
br-a28625161bb9 8000.0242e9f0e9a0 no veth1675dd1 docker0 8000.0242a95e6f00 no vethe587b2d
|
Далее создадим сетевые интерфейсы VXLAN в каждой из хост-машин, и подключим их к мосту docker. Сетевые пакеты из контейнера будут доставляться в мост docker, инкапсулироваться в сообщения VXLAN и пересылаться на вторую хост-машину. На второй хост-машине сообщения VXLAN пересылаются в контейнер docker через мост второй хост-машины.
- Настройка первой хост-машины:
Создать интерфейс VXLAN с идентификатором (VNI) 2000 и названием vxlan_docker. Параметры похожи на использованные в предыдущем примере:
Command sudo ip link add vxlan_docker type vxlan id 200 remote 172.31.0.107 dstport 4789 dev eth0 Включить созданный интерфейс VLAN:
Command sudo ip link set vxlan_docker up Подключить созданный интерфейс к мосту docker:
Command sudo brctl addif br-3231f89d69f6 vxlan_docker
Настройка второй хост-машины выполняется аналогично:
Command 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, выполняемой в контейнере:
Command |
---|
ping 172.18.0.2 |