VLAN — способ разделить один физический сегмент на несколько изолированных сетей. На коммутаторе это настройка портов, в Linux — программная обработка тегов 802.1Q. Администратору это нужно, когда один сервер обслуживает несколько подсетей, когда виртуальные машины должны жить в разных сегментах или когда нужно проверить, как настроен транк на коммутаторе. Ниже — два рабочих способа, постоянная конфигурация и диагностика.

Как работает 802.1Q

Тег добавляется в кадр после адресов источника и назначения и содержит идентификатор VLAN (VID) от 1 до 4094. Порт коммутатора в режиме access принимает нетегированные кадры и относит их к одному VLAN; порт в режиме trunk пропускает тегированные кадры нескольких VLAN. PVID задаёт, какой VLAN получит нетегированный кадр на входе. Эти три понятия объясняют почти все ошибки, с которыми потом сталкиваются на сервере.

Порт Вход Выход
access без тега без тега
trunk с тегом с тегом
hybrid оба оба

Гибридный режим встречается там, где часть VLAN идёт без тега, а часть с тегом; в Linux это набор записей pvid и tagged на одном порту.

В Linux есть два подхода. Первый — отдельный интерфейс вида enp3s0.20, который снимает тег и выглядит как обычный Ethernet. Второй — мост с включённой фильтрацией VLAN, где один bridge обслуживает несколько сегментов, а какие теги пропускать, решает таблица. Первый проще, второй удобнее для виртуализации.

Подготовка

Сначала убедитесь, что модуль 8021q загружен: в большинстве дистрибутивов он подхватывается автоматически при создании интерфейса, но проверить стоит. Заодно посмотрите имена интерфейсов и текущее состояние линка.

ip -br link show
sudo modprobe 8021q
lsmod | grep 8021q
ip -d link show enp3s0 | head -20

Имя enp3s0 в примерах — условное; подставьте своё из первого вывода. Если интерфейс называется eth0, логика не меняется.

Вариант 1: интерфейс VLAN поверх физического

Самый быстрый способ — создать подынтерфейс с тегом. Он наследует физический линк, получает собственный MAC и адрес, а тег снимается ядром на входе и ставится на выходе. Родительский интерфейс должен быть поднят, иначе подынтерфейс не заработает.

sudo ip link add link enp3s0 name enp3s0.20 type vlan id 20
sudo ip addr add 192.0.2.10/24 dev enp3s0.20
sudo ip link set enp3s0.20 up
ip -d link show enp3s0.20

В выводе ip -d видно id 20 и протокол 802.1Q — это подтверждение, что интерфейс создан правильно. Проверить связность можно пингом до шлюза в этом VLAN: ping -I enp3s0.20 192.0.2.1. Если пинг не идёт, а линк поднят, первым делом проверьте, что порт коммутатора действительно настроен как trunk с этим VLAN.

Вариант 2: bridge с фильтрацией VLAN

Мост с vlan_filtering=1 ведёт себя как управляемый коммутатор: он хранит таблицу VLAN для каждого порта и решает, пропускать кадр или отбросить. Это удобно, когда на одном физическом порту нужно несколько сегментов для виртуальных машин.

sudo ip link add br0 type bridge vlan_filtering 1
sudo ip link set enp3s0 master br0
sudo bridge vlan add dev enp3s0 vid 20 pvid untagged
sudo bridge vlan add dev br0 vid 20 self

Запись pvid untagged означает: нетегированные кадры, пришедшие на порт, относятся к VLAN 20. Для транка наоборот — bridge vlan add dev enp3s0 vid 20 без pvid, тогда порт ждёт тег. Локальная запись self нужна, чтобы мост отдавал этот VLAN собственному сетевому стеку; адрес при этом вешают на br0.20.

К мосту подключаются tap-интерфейсы, и каждому можно назначить свой PVID. Так одна машина с двумя мостами обслуживает и офисную сеть, и сеть управления, не смешивая broadcast-домены.

Постоянная конфигурация

Команды ip живут до перезагрузки. В системах с systemd-networkd конфигурация описывается файлами .netdev и .network. Для VLAN-интерфейса создаётся .netdev с типом vlan, а адрес задаётся в .network. Файлы кладут в /etc/systemd/network и перезапускают networkd.

[NetDev]
Name=enp3s0.20
Kind=vlan

[VLAN]
Id=20
[Match]
Name=enp3s0.20

[Network]
Address=192.0.2.10/24
Gateway=192.0.2.1
DNS=192.0.2.53

В .network указывают Name=enp3s0.20, Address=192.0.2.10/24 и Gateway; имя в секции Match должно совпадать с Name из .netdev. После правки: sudo networkctl reload и networkctl status enp3s0.20.

Для моста с фильтрацией в .netdev добавляют VLANFiltering=yes, а записи таблицы задают через BridgeVLAN в секции [BridgeVLAN] соответствующего .network.

В NetworkManager проще одна команда: nmcli con add type vlan con-name vlan20 dev enp3s0 id 20 ipv4.method manual ipv4.addresses 192.0.2.10/24, затем nmcli con up vlan20. Профиль сохранится и переживёт перезагрузку.

Диагностика

Главная команда — bridge vlan show: она печатает таблицу по портам с флагами pvid и untagged. Если нужного VLAN там нет, кадры будут молча отброшены, и это самая частая причина «линк есть, пинга нет».

bridge vlan show
bridge link show
sudo tcpdump -e -i enp3s0 vlan
ip -d link show br0
bridge fdb show | head -20

tcpdump с ключом -e показывает тег в заголовке кадра: так видно, приходит ли трафик тегированным и с каким VID. Если на входе теги есть, а на выходе в нужный порт нет, смотрите таблицу моста. Если тегов нет вовсе, проблема на стороне коммутатора или в том, что трафик идёт через другой порт.

Типичные ошибки

  • Несовпадение PVID. Порт помечен как untagged для одного VLAN, а коммутатор шлёт другой — трафик уходит не туда.
  • Забытый trunk. На сервере VLAN создан, а порт коммутатора в access: тегированные кадры отбрасываются.
  • VLAN на slave вместо bond. Для агрегации интерфейс создаётся поверх bond0, а не поверх его участников.
  • MTU. Тег добавляет четыре байта; при нестандартном MTU проверьте согласованность на всём пути.
  • Firewall. nftables и iptables по умолчанию могут резать forwarding между VLAN — проверяйте счётчики, а не только правила.
  • Забытый self. Без локальной записи адрес на br0.20 не поднимется, хотя порты будут пропускать трафик.
  • VLAN 1. Использовать его как рабочий не стоит: он часто остаётся native и ведёт себя непредсказуемо.

Итог

Для одного-двух VLAN достаточно подынтерфейсов enp3s0.20: быстро и наглядно. Для виртуализации и нескольких сегментов на одном порту берите bridge с vlan_filtering и ведите таблицу через bridge vlan. В любом случае проверка одна: bridge vlan show, tcpdump с тегом и пинг из нужного интерфейса. Если все три пункта сходятся, схема работает.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте