Networking

VLAN и коммутация

VLAN — логическое деление одного физического коммутатора на несколько независимых сетей с помощью тега 802.1Q в кадре.

Что такое VLAN и коммутация

Коммутатор (switch) соединяет устройства внутри сегмента и пересылает кадры по MAC-адресам, запоминая, за каким портом какой адрес живёт. По умолчанию все его порты — одна общая сеть: широковещательный запрос от любого узла слышат все.

VLAN (Virtual LAN) ломает это правило. Порты размечаются номерами, и коммутатор перестаёт пропускать кадры между разными номерами — на одном железе получается несколько независимых сетей. Устройства в VLAN 10 не видят VLAN 20 вообще, как будто их включили в разные коммутаторы. Чтобы трафик пошёл между ними, нужен маршрутизатор — и там его можно фильтровать.

Зачем это нужно: изоляция без покупки железа и без лишних проводов. Гостевой Wi-Fi, сеть управления серверами, продакшен и офисная сеть живут на одном коммутаторе, но не пересекаются.

Тег 802.1Q

Разметка переносится прямо в кадре: стандарт 802.1Q добавляет 4 байта с номером VLAN (VID).

Обычный кадр:  [ MAC dst | MAC src |        тип | данные ]
С тегом 802.1Q:[ MAC dst | MAC src | 802.1Q VID | тип | данные ]
                                        ↑
                              12 бит → 1–4094 доступных VLAN

Отсюда два типа портов, и это главное, что нужно понимать при настройке:

Access-порт Trunk-порт
Сколько VLAN один много
Тег в кадре снимается, устройство о VLAN не знает сохраняется
Куда включают сервер, телефон, ПК другой коммутатор, гипервизор

Тег добавляет 4 байта, поэтому кадр разрастается до 1522 байт. На пути тегированного трафика MTU должен это учитывать — иначе полноразмерные пакеты начнут молча пропадать.

Настройка в Linux

Хосту-гипервизору обычно приходит trunk, а он уже разбирает VLAN по виртуальным машинам:

# поднять интерфейс для VLAN 10 поверх физического eth0
$ sudo ip link add link eth0 name eth0.10 type vlan id 10
$ sudo ip addr add 10.0.10.5/24 dev eth0.10
$ sudo ip link set eth0.10 up

$ ip -d link show eth0.10
eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    vlan protocol 802.1Q id 10 <REORDER_HDR>

Имя вида eth0.10 — общепринятое соглашение: физический интерфейс и номер VLAN.

QinQ

QinQ (802.1ad, «стек VLAN») навешивает на кадр второй тег: внешний — провайдера, внутренний — клиента.

Задача, которую он решает, — прозрачный транспорт. Провайдер хочет провезти клиентский трафик между площадками, не разбирая его и не согласовывая номера. Клиент пользуется своими VLAN 1–4094 как ему угодно, провайдер видит только свой внешний тег. Побочный эффект — снятие лимита в 4094 VLAN, критичного для операторов.

Ценой идут ещё 4 байта к кадру — про MTU здесь забывают особенно часто.

MLAG

MLAG (Multi-Chassis Link Aggregation) — агрегация линков, идущих на два разных коммутатора.

Обычный LACP объединяет несколько кабелей от сервера в один логический канал: полоса складывается, обрыв провода не рвёт связность. Но если оба кабеля воткнуты в один коммутатор, он и остаётся точкой отказа. MLAG позволяет двум коммутаторам притвориться одним: сервер видит обычный bond, а физически линки идут в разные железки.

        ┌── Коммутатор A ──┐
Сервер ─┤                  ├─ ядро сети
        └── Коммутатор B ──┘
   один bond на сервере, два независимых коммутатора

Выигрыш прямой: коммутатор можно перезагрузить для обновления прошивки, и сервер этого не заметит. Для стоек с серверами, к которым предъявляются требования по SLA, это стандартная схема. Реализация проприетарная и у каждого вендора называется по-своему.

Что помнить на практике

  • Native VLAN на trunk ходит без тега. Несовпадение native на двух концах — источник трафика, утекающего не в ту сеть.
  • Сеть управления — отдельный VLAN.IPMI и интерфейсы гипервизоров в интернете быть не должны.
  • Jumbo frames включают на всём сегменте. Один порт с MTU 1500 в середине ломает картину.
  • VLAN — не защита. Это изоляция широковещательного домена; фильтрацией занимается файрвол, а маршрутизатор между VLAN пропустит всё, что вы ему не запретили.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер