Learning Platform
Глоссарий Troubleshooting
Урок 05.04 · 18 мин
Начальный
VLAN802.1QTaggingTrunkSwitch

VLAN — разделение одного провода на много сетей

Допустим, у вас офис на 200 человек. Маркетинг, разработка, бухгалтерия, гости — всем нужен интернет. Можно купить четыре отдельных свитча, прокинуть четыре кабельных трассы, поставить четыре роутера. Дорого, неудобно, неуправляемо. А можно купить один свитч с поддержкой VLAN и логически разделить его на четыре виртуальных свитча. Это то, что VLAN делает.

VLAN (Virtual LAN) — это технология, позволяющая на одном физическом свитче создавать несколько изолированных broadcast domains. Кадр с одного VLAN никогда не попадёт в другой VLAN без явного роутинга через L3-устройство. Это даёт безопасность, экономию железа и гибкость.

В этом уроке посмотрим, что такое тег 802.1Q, чем отличается trunk-порт от access-порта, и где VLAN-ы используются в реальной инфраструктуре. Знание VLAN-ов нужно DE, потому что в дата-центрах, в Kubernetes-кластерах с CNI вроде Calico/VLAN, в офисных сетях — VLAN-ы везде. И когда вы видите в ip addr интерфейс eth0.10 — вы знаете, что это VLAN 10 на eth0.


Зачем VLAN — разбиваем broadcast domain

Главные проблемы большой плоской сети без VLAN:

  1. Broadcast storm risk. ARP, DHCP, mDNS — всё broadcast. 500 машин в одном broadcast domain = много шума. Если кто-то сделает loop — broadcast storm и сеть умирает.
  2. Безопасность. Любой может ARP-spoof’ить любого. Маркетинг видит трафик бухгалтерии (через ARP poisoning).
  3. Маштабирование. MAC-table свитчей имеет лимиты. Если у вас 50,000 устройств в одном broadcast domain — свитчи не справляются.

VLAN решает это разделением: вы говорите свитчу «port 1-8 — это VLAN 10 (разработка), port 9-16 — VLAN 20 (маркетинг)». Все кадры маркируются тегами VLAN-а внутри свитча. Кадры из VLAN 10 не попадают в порты VLAN 20.

NetworkPolicy: основы изоляции трафика в кластере
Один свитч -- два изолированных broadcast domain
Dev 1Подключён в port 1, помечен в VLAN 10
Dev 2Подключён в port 2, тоже VLAN 10. Видит broadcast от Dev 1
Marketing 1port 9, VLAN 20. НЕ видит broadcast от Dev 1 -- они в разных VLAN
SwitchОдин физический свитч, два логических: VLAN 10 (port 1-8) и VLAN 20 (port 9-16). Между ними нет L2-связности
ARP в VLAN 10Долетает до Dev 1 и Dev 2 (оба в VLAN 10). НЕ долетает до Marketing 1 -- он в другом VLAN

С точки зрения хостов это выглядит как два разных свитча. Между VLAN-ами нет L2-связности — нужен роутер.


Tagged vs untagged — два режима порта

У свитч-порта с поддержкой VLAN есть два главных режима: access и trunk.

Access port. Порт привязан к одному VLAN. Подключённое устройство не знает про VLAN-ы вообще — оно отправляет обычные Ethernet-кадры (без тегов). Свитч сам добавляет VLAN ID когда кадр заходит, и убирает когда кадр выходит.

Trunk port. Порт может пропускать несколько VLAN-ов. Кадры идут с VLAN-тегом. Используется для подключения свитчей друг к другу, гипервизоров с виртуалками в разных VLAN, или хостов, которые сами знают про VLAN-ы (Linux-сервер с vlan модулем).

Access vs trunk -- два типа портов
AccessОдин VLAN на порту. Кадр уходит/приходит БЕЗ тега. Устройство не знает про VLAN -- свитч сам управляет
Untagged frameОбычный Ethernet-кадр: dst, src, EtherType=0x0800, payload. Никаких VLAN-полей
TrunkНесколько VLAN на порту. Кадры с тегом 802.1Q -- свитч различает их по тегу. Используется между свитчами или к серверам с VLAN-aware OS
Tagged frameEthernet-кадр с 4-байтовой вставкой 802.1Q между src MAC и EtherType. VLAN ID + приоритет

Типичная топология:

  • Свитч1 порт 1 — access VLAN 10 — подключён ноутбук разработчика.
  • Свитч1 порт 24 — trunk (VLAN 10, 20, 30) — идёт в свитч2 в соседней комнате.
  • Свитч2 порт 1 — access VLAN 20 — маркетинг.
  • Свитч1 порт 23 — trunk — идёт в роутер, который умеет маршрутизировать между VLAN.

802.1Q — как тегается кадр

VLAN-тег — это 4 байта, которые свитч вставляет между src MAC и EtherType обычного Ethernet-кадра. Стандарт называется IEEE 802.1Q.

Структура VLAN tag 802.1Q -- 4 байта между MAC и EtherType
Dst MACОбычное поле, 6 байт. Не меняется
Src MACОбычное поле, 6 байт. Не меняется
TPID 0x8100Tag Protocol Identifier. 2 байта. Значение 0x8100 = это 802.1Q VLAN tag
PCPPriority Code Point. 3 бита (0-7). Класс приоритета для QoS. 7 = высший приоритет (часто для голоса), 0 = best-effort
DEIDrop Eligible Indicator. 1 бит. Можно ли дропнуть этот кадр при congestion
VLAN IDVLAN Identifier. 12 бит. От 1 до 4094 (0 и 4095 reserved). Это и есть номер VLAN
EtherType2 байта. 0x0800 = IPv4, 0x86DD = IPv6 и т.д. ОБЫЧНЫЙ EtherType, но идёт после VLAN-тега
PayloadТот же IP-пакет, что и в обычном кадре. VLAN-тег не меняет содержимое
FCSCRC-32. ПЕРЕСЧИТЫВАЕТСЯ при добавлении тега -- иначе кадр невалиден

Особенности:

  • VLAN ID — 12 бит, значит максимум 4094 VLAN-а на одном свитче. Для дата-центров с десятками тысяч клиентов это мало — придумали VXLAN с 24-битным VNI (16 миллионов сетей).
  • Native VLAN. В trunk-порту обычно один VLAN ID помечен как «native» — кадры в нём идут БЕЗ тега. Это для совместимости с устройствами, которые не понимают теги. Обычно настраивается осторожно (security risk — VLAN hopping).
  • QinQ (802.1ad). Два тега друг за другом — провайдеры используют это, чтобы пробросить клиентский VLAN внутри своего.

Когда кадр приходит в access-порт без тега — свитч добавляет тег своего VLAN. Когда кадр уходит из access-порта — свитч снимает тег. Хост ничего не знает про VLAN. Это PVID (Port VLAN ID).

В trunk-порту наоборот — кадры идут с тегом. И отправитель, и получатель должны знать про VLAN.


VLAN на Linux

Linux нативно умеет VLAN-ы через модуль 8021q. Вы можете создать виртуальный интерфейс, привязанный к VLAN:

# Загрузить модуль 802.1Q (обычно уже загружен в современных дистрибутивах):
sudo modprobe 8021q

# Создать VLAN 10 на eth0:
sudo ip link add link eth0 name eth0.10 type vlan id 10
sudo ip link set eth0.10 up
sudo ip addr add 10.10.10.5/24 dev eth0.10

# Создать VLAN 20:
sudo ip link add link eth0 name eth0.20 type vlan id 20
sudo ip link set eth0.20 up
sudo ip addr add 10.20.20.5/24 dev eth0.20

# Теперь eth0 -- физический интерфейс, eth0.10 и eth0.20 -- VLAN-интерфейсы
ip -d link show eth0.10
# eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
#     link/ether ... brd ...
#     vlan protocol 802.1Q id 10 <REORDER_HDR> ...

Что происходит на проводе: пакеты, отправленные через eth0.10, в исходящем направлении получают 802.1Q-тег с VLAN ID = 10. Свитч на другом конце должен быть настроен как trunk с разрешённым VLAN 10, иначе он эти кадры дропнет (или они уйдут в native VLAN).

# Захватить VLAN-тегированные кадры:
sudo tcpdump -i eth0 -e 'vlan' -c 3
# 12:34:56.789 a4:83:e7:1a:bb:cc > 00:1c:42:00:00:18, ethertype 802.1Q (0x8100),
#   length 102: vlan 10, p 0, ethertype IPv4, ...
# 'vlan 10' -- это VID из тега
# 'p 0' -- priority (PCP)

В выводе видим ethertype 802.1Q вместо ethertype IPv4 — это потому что после src MAC сразу идёт тег, а EtherType 0x0800 спрятан после тега.


Inter-VLAN routing — как связать VLAN-ы

Внутри L2 разные VLAN-ы изолированы. Чтобы машина из VLAN 10 могла достучаться до сервера в VLAN 20, нужен L3-роутинг. Варианты:

1. Роутер с разными интерфейсами в разных VLAN. Каждый VLAN — своя подсеть, у роутера в каждой свой IP. Обычная маршрутизация.

2. Router-on-a-stick. Один физический интерфейс роутера, на нём через trunk заведено несколько VLAN-сабинтерфейсов. На каждом сабинтерфейсе — свой IP. Дёшево, но bottleneck.

3. L3 switch. Свитч с поддержкой роутинга. Внутри ASIC-чипа делает inter-VLAN routing — быстро, без bottleneck. Стандарт для современных DC.

Inter-VLAN routing -- роутер связывает изолированные VLAN
VLAN 10192.168.10.0/24. Default gateway -- 192.168.10.1 (на роутере)
route
RouterИмеет интерфейсы в обоих VLAN: 192.168.10.1 и 192.168.20.1. Маршрутизирует пакеты между ними как обычный L3-роутер. Может фильтровать через ACL
route
VLAN 20192.168.20.0/24. Default gateway -- 192.168.20.1
ACLAccess Control List на роутере. Можно разрешить разработчикам ходить в маркетинг по HTTP, но запретить SSH. VLAN + ACL = безопасность

Без роутинга пакеты между VLAN-ами не ходят, даже если устройства подключены к одному свитчу.


VLAN в реальных кейсах

1. Корпоративная сеть. VLAN-ы для отделов, плюс отдельный VLAN для гостевого Wi-Fi (изолирован от внутренних). На свитчах настроены trunk-и между этажами, на роутере — ACL’и.

2. Дата-центр / DevOps. Каждый клиент / приложение / окружение — свой VLAN. Например, VLAN 100 = prod web, VLAN 101 = prod DB, VLAN 200 = staging. Network policies строятся через ACL.

3. Гипервизоры. Каждая VM может быть подключена в свой VLAN. ESXi/Proxmox virtual switch имеет уровень VLAN tagging.

4. Telecom. Провайдеры используют QinQ — свой VLAN снаружи + клиентский VLAN внутри. Это позволяет на одном физическом проводе обслуживать сотни клиентов без коллизий VLAN ID.

5. VoIP. Отдельный VLAN для телефонов, с QoS (PCP=7). Голос идёт с высшим приоритетом — никаких задержек даже если сеть забита.


Где VLAN не работает или мешает

1. VLAN hopping. Атака: если native VLAN не настроен правильно, можно перейти из VLAN 1 в VLAN 10 двойным тегированием. Современные свитчи защищены, но в legacy — осторожно.

2. 4094 — предел. Для гипер-DC мало. Решение — VXLAN, GENEVE, NVGRE: overlay-сети с 24-битным ID поверх IP.

3. VLAN-aware Linux требует MTU-внимания. VLAN-тег добавляет 4 байта. Если у вас MTU = 1500 на trunk-порте, а в VLAN-интерфейсе тоже MTU = 1500 — получится 1504 байт на проводе. Большинство свитчей это нормально проглатывают (стандарт «baby giant» 1518+4=1522), но не все. В случае проблем уменьшайте MTU VLAN-интерфейса на 4.

4. Spanning Tree. STP считает топологию для всей L2-сети. Большие плоские топологии с VLAN-ами могут страдать от долгого convergence. Решение — RSTP, MSTP, или вообще L3 между свитчами (spine-leaf).


Попробуй сам

# 1. Посмотреть, поддерживает ли ваше ядро VLAN:
modprobe 8021q
lsmod | grep 8021q

# 2. Создать VLAN-интерфейс (нужен root):
sudo ip link add link eth0 name eth0.42 type vlan id 42
sudo ip link set eth0.42 up
ip -d link show eth0.42

# 3. Посмотреть на трафик VLAN'а:
sudo tcpdump -i eth0 -e -nn 'vlan 42'
# В другом терминале пинговать через VLAN-интерфейс:
ping -I eth0.42 ...

# 4. Удалить VLAN:
sudo ip link del eth0.42

# 5. Если у вас Linux bridge -- VLAN-aware mode:
sudo ip link add br-vlan type bridge vlan_filtering 1
sudo ip link set br-vlan up
sudo bridge vlan add vid 10 dev br-vlan self
# Полноценный программный свитч с VLAN-support

# 6. В Docker -- посмотреть, какие сети есть:
docker network ls
docker network inspect bridge   # Docker bridge -- свой broadcast domain без VLAN

Самое наглядное: создать VLAN-интерфейс и снять tcpdump на физическом интерфейсе с фильтром vlan — вы увидите кадры с тегом и сможете руками разобрать структуру.


Проверка знанийKnowledge check
Вы поставили в офис managed switch и развели VLAN 10 (разработка) и VLAN 20 (маркетинг). Машина из VLAN 10 пингует gateway 192.168.10.1 -- работает. Пингует машину в своём VLAN 10 -- работает. Пингует машину в VLAN 20 (192.168.20.5) -- 'Destination Host Unreachable'. Что происходит и где искать проблему?
ОтветAnswer
VLAN изолирует broadcast domain на L2. Чтобы пакет с машины в VLAN 10 (192.168.10.X) дошёл до машины в VLAN 20 (192.168.20.5), нужен L3-роутинг -- кто-то должен маршрутизировать между этими подсетями. Возможные причины: 1) Inter-VLAN routing не настроен на роутере или L3 switch. На router-on-a-stick должны быть сабинтерфейсы в обоих VLAN с IP-адресами (192.168.10.1 и 192.168.20.1) и включён ip routing/forwarding. На L3 switch -- созданы SVI (switch virtual interface) для обоих VLAN. 2) ACL на роутере блокирует трафик между VLAN. Маркетинг и разработка часто намеренно изолированы. Проверить: 'show access-lists', посмотреть hit counter правил. 3) Default gateway на машинах указан неправильно или не указан. На машине в VLAN 10 default gateway должен быть 192.168.10.1 -- если не указан, она не знает, куда слать пакет за пределы своей подсети. Проверять последовательно: traceroute от источника до 192.168.20.5 -- покажет, докуда долетают пакеты. Если до роутера долетает, дальше нет -- значит проблема на роутере (роутинг/ACL). Если не долетает даже до своего gateway -- проблема в настройке default gateway или связности с роутером.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. Что VLAN-ы дают сети, и где граница между VLAN-ами?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 4