Сети для самых маленьких. Часть 17: VLAN
Во второй части коммутатор делил домены коллизий, но не домен широковещания: ARP-запрос, DHCP DISCOVER и Router Advertisement получали все, кто воткнут в коммутатор. Один коммутатор — одна сеть, одна подсеть IP. В офисе с бухгалтерией, гостевым Wi-Fi, телефонами и серверами это означало бы по коммутатору и по кабелю на каждую сеть. VLAN, Virtual LAN, IEEE 802.1Q, решает задачу иначе: один коммутатор и один кабель несут несколько независимых сетей, которые друг друга не видят, как будто это разные коммутаторы. Это самая часто используемая технология сегментации, и, как обычно, нас интересует, что для этого добавили в кадр и что делает с ним коммутатор.
Тег: четыре байта в кадре
VLAN помечает кадр номером сети. Для этого между MAC-адресом отправителя и EtherType вставляются четыре байта:
байты: 6 6 2 2 2 46…1500 4
┌──────────┬──────────┬───────┬────────┬─────────┬─────────┬─────┐
│ MAC │ MAC │ TPID │ TCI │ Ether │ данные │ FCS │
│ получ. │ отправ. │0x8100 │ │ Type │ │ │
└──────────┴──────────┴───────┴────────┴─────────┴─────────┴─────┘
└── тег 802.1Q ──┘
TCI, 16 бит: PCP (3) │ DEI (1) │ VID (12)
приоритет сброс номер VLAN, 1…4094
0…7 при
перегрузке
- TPID стоит там, где коммутатор и сетевая карта ожидают EtherType. Значение
0x8100говорит: «это не тип, это тег, настоящий EtherType дальше». Так старое оборудование, не знающее о VLAN, видит кадр с неизвестным типом и выбрасывает его, а не разбирает неправильно. - PCP — приоритет, 0–7: коммутаторы с QoS ставят кадры с высоким приоритетом (голос — 5) в очередь раньше остальных.
- VID — номер VLAN. 12 бит дают 4096 значений, из которых
0означает «тег только ради приоритета, VLAN не задан»,4095зарезервирован, итого 4094 сетей. VLAN 1 — умолчание на большинстве коммутаторов: все порты в ней, пока не настроено иное.
Кадр с тегом длиннее на 4 байта, максимум 1522. MTU для IP при этом не меняется: тег живёт в заголовке Ethernet, а не в его данных. В tcpdump -e тег виден явно:
3c:52:82:1a:2b:3c > d8:47:32:0a:0b:0c, ethertype 802.1Q (0x8100), length 78: vlan 10, p 0, ethertype IPv4 (0x0800), 192.168.10.5 > 192.168.20.7: ...
Два EtherType подряд: первый 0x8100 — тег, второй 0x0800 — что внутри.
Существует и двойной тег, 802.1ad (QinQ): провайдер заворачивает кадры клиента, у которых уже есть свои VLAN, во внешний тег с TPID 0x88a8, и пропускает через свою сеть клиентские VLAN, не вникая в их номера. Клиент получает «виртуальный кабель» между офисами со всеми своими 4094 сетями внутри.
Порты: access и trunk
Хосты, как правило, о VLAN не знают. Ноутбук шлёт обычный кадр, а в VLAN его помещает коммутатор по настройке порта.
Access-порт принадлежит одной VLAN. Кадр, пришедший на такой порт без тега, коммутатор внутри себя считает принадлежащим этой VLAN (номер называется PVID — port VLAN ID). Кадр, уходящий в access-порт, отдаётся без тега: хост видит обычный Ethernet. Тегированные кадры на access-порту обычно отбрасываются.
Trunk-порт несёт несколько VLAN сразу, и каждый кадр в нём с тегом, чтобы на другом конце было понятно, чей он. Trunk — это кабель между двумя коммутаторами, между коммутатором и роутером, между коммутатором и сервером виртуализации, между коммутатором и точкой доступа с несколькими SSID.
┌────────────── коммутатор 1 ──────────┐ ┌───── коммутатор 2 ─────┐
A ──────────┤ порт 1, access VLAN 10 │ │ порт 1, access VLAN 10 ├──── B
192.168.10.5 │ │ trunk │ │ 192.168.10.7
│ порт 2, access VLAN 20 порт 24├────────────┤ порт 24 │
C ──────────┤ │ 10, 20, 30 │ порт 2, access VLAN 20 ├──── D
192.168.20.9 └──────────────────────────────────────┘ └────────────────────────┘ 192.168.20.3
Кадр от A к B: приходит на порт 1 без тега → коммутатор 1 помечает его VLAN 10 → таблица MAC для VLAN 10 говорит «B за портом 24» → в trunk кадр уходит с тегом 10 → коммутатор 2 читает тег, снимает его и отдаёт в порт 1 без тега. B получил обычный кадр. C и D ничего не видели, даже если это был broadcast: широковещание флудится только в порты той же VLAN.
Отсюда главное свойство: VLAN — это домен широковещания. ARP, DHCP, RA живут внутри одной VLAN, и каждой VLAN нужна своя IP-подсеть. A и C на соседних портах одного коммутатора не могут обменяться кадром никак — для них это разные провода.
Таблица MAC-адресов коммутатора становится таблицей по VLAN: ключ — пара (VID, MAC). Один и тот же MAC может быть в двух VLAN за разными портами, и это разные записи. STP, защищающий от петель (вторая часть), тоже становится или одним деревом на все VLAN, или деревом на каждую (PVST), или несколькими деревьями на группы VLAN (MSTP): это важно знать, потому что заблокированный STP порт блокируется для всех VLAN своего дерева.
Native VLAN
На trunk-порту есть исключение: одна VLAN может идти без тега — native VLAN. Исторически это нужно для совместимости с устройствами, которые шлют нетегированные кадры в тот же кабель, по умолчанию native — VLAN 1. Кадр без тега, пришедший на trunk, попадает в native VLAN; кадр native VLAN уходит в trunk без тега.
С этим связана самая частая ошибка VLAN: несовпадение native VLAN на двух концах trunk-а. У коммутатора 1 native 1, у коммутатора 2 native 10. Нетегированный кадр из VLAN 1 выходит с первого коммутатора без тега, приходит на второй и считается VLAN 10. Две сети молча склеиваются в одну, ARP начинает находить чужие адреса, DHCP выдаёт адреса не из той подсети. Коммутаторы умеют сообщать об этом (CDP/LLDP — протоколы, которыми соседи рассказывают друг другу о себе, в том числе о native VLAN, — покажут «native VLAN mismatch»), но не умеют чинить.
Практика: native VLAN на trunk-ах — отдельный неиспользуемый номер (например 999), либо «тегировать всё, включая native». Так ошибка на одном конце не склеивает сети, а просто оставляет VLAN 1 без связи, что заметно сразу.
Hybrid: телефон и компьютер в одной розетке
Порт, в котором одна VLAN без тега, а другая с тегом. Классический случай — IP-телефон с проходным портом для компьютера: телефон шлёт свои кадры с тегом VLAN 30 (голос), а кадры компьютера пропускает через себя без тега, и они попадают в VLAN 10 (данные). Коммутатор видит на одном порту обе VLAN и различает их по тегу. Телефон о VLAN 30 узнаёт либо по настройке, либо по LLDP от коммутатора.
Маршрутизация между VLAN
Разделили. Теперь бухгалтерии в VLAN 10 нужен сервер в VLAN 20. Два разных домена широковещания — это две IP-подсети, а между подсетями, как мы знаем с шестой части, ходит роутер.
Router on a stick. Роутер одним кабелем подключён к trunk-порту, и на этом интерфейсе у него субинтерфейсы по одному на VLAN, с адресом в каждой подсети:
┌────────────────────────────┐
trunk 10, 20 ──────────────┤ eth0 │
│ eth0.10 192.168.10.1/24 │
│ eth0.20 192.168.20.1/24 │
└────────────────────────────┘
Пакет от A (192.168.10.5) к серверу (192.168.20.7): A шлёт его шлюзу 192.168.10.1 → кадр с тегом 10 поднимается по trunk-у на роутер → роутер снимает Ethernet, маршрутизирует, упаковывает в новый кадр с тегом 20 и отправляет в тот же кабель → коммутатор доставляет серверу. Каждый пакет между VLAN проходит по кабелю дважды, и этот кабель — узкое место. Для дома и небольшого офиса — нормально, и именно так устроена маршрутизация в роутерах на Linux и в большинстве домашних устройств с гостевой сетью.
L3-коммутатор. Коммутатор, умеющий маршрутизировать сам: у него есть SVI (switch virtual interface, interface vlan 10) с адресом в каждой VLAN, и пересылка между ними идёт в той же микросхеме, что и коммутация, на полной скорости. Все серьёзные офисные и стоечные коммутаторы так умеют. Роутер при этом остаётся для выхода наружу, а между VLAN трафик не покидает коммутатора.
Важная оговорка: как только между VLAN появился роутер, изоляция держится только на его правилах. VLAN сами по себе не защищают: они разделяют L2, а L3 их снова соединяет. Если бухгалтерия не должна видеть гостевую сеть, это должно быть написано в ACL на L3-коммутаторе или в файрволе роутера. Типичная конструкция: VLAN для гостей маршрутизируется только в интернет.
DHCP для каждой VLAN при этом работает через relay из одиннадцатой части: на каждом SVI ip helper-address, и один сервер обслуживает все VLAN, выбирая пул по giaddr. Для IPv6 RA рассылает роутер с каждого субинтерфейса свой префикс.
Чем это небезопасно
VLAN hopping двойным тегом. Атакующий в native VLAN trunk-а отправляет кадр с двумя тегами: внешний — native (1), внутренний — целевой (20). Первый коммутатор, увидев тег native, снимает его и отдаёт кадр в trunk без тега. Второй коммутатор видит оставшийся тег 20 и доставляет кадр в VLAN 20. Односторонне (ответ не вернётся), но для рассылки чего-нибудь неприятного достаточно. Лечится тем же, что и ошибки с native: не использовать native VLAN для хостов.
Подделка trunk-а. Коммутаторы Cisco умеют договариваться о trunk-ах автоматически по протоколу DTP: порт в режиме «auto» станет trunk-ом, если сосед попросит. Атакующий посылает DTP-кадры, порт становится trunk-ом, и хосту доступны все VLAN. Лечится: на портах к хостам режим access жёстко и switchport nonegotiate.
Изоляция внутри VLAN. Иногда нужно, чтобы хосты одной VLAN (гости) не видели друг друга, но видели шлюз. Для этого есть private VLAN и port isolation: коммутатор не пересылает кадры между изолированными портами, только к uplink. Это та же изоляция клиентов из списка защит в седьмой части, только на кабеле.
Управление коммутатором — в отдельной VLAN, недоступной из пользовательских. Иначе гостевой ноутбук может постучаться в веб-интерфейс коммутатора.
VLAN на Linux и в виртуализации
Linux умеет и тегированные интерфейсы, и коммутатор с VLAN.
Субинтерфейс — хост или роутер, подключённый к trunk-у:
$ sudo ip link add link eth0 name eth0.10 type vlan id 10
$ sudo ip link set eth0.10 up
$ sudo ip addr add 192.168.10.1/24 dev eth0.10
eth0.10 — обычный интерфейс: адреса, маршруты, tcpdump. Кадры, уходящие через него, получают тег 10; кадры с тегом 10, пришедшие на eth0, попадают в него. Нетегированные остаются на eth0. Для роутера на Linux это и есть router on a stick: по субинтерфейсу на VLAN, включённый forwarding, файрвол между ними.
Linux-мост с фильтрацией VLAN — коммутатор с access и trunk портами:
$ sudo ip link add br0 type bridge vlan_filtering 1
$ sudo ip link set eth1 master br0 && sudo bridge vlan add dev eth1 vid 10 pvid untagged # access 10
$ sudo ip link set eth2 master br0 && sudo bridge vlan add dev eth2 vid 10 && sudo bridge vlan add dev eth2 vid 20 # trunk
$ bridge vlan show
pvid untagged — это access: входящее без тега считать VLAN 10, исходящее отдавать без тега. Так настраиваются мосты для виртуальных машин: каждая VM на своём порту моста в своей VLAN, а физический eth2 — trunk к коммутатору. В Hyper-V то же делает Set-VMNetworkAdapterVlan -Access -VlanId 10, в VMware — port group с VLAN ID.
Одна ловушка при захвате: сетевые карты умеют снимать тег аппаратно (VLAN offload), и tcpdump -i eth0 может показывать кадры без тега, хотя они тегированы. ethtool -K eth0 rxvlan off txvlan off возвращает теги в захват.
На управляемом коммутаторе та же конфигурация в терминах Cisco:
interface GigabitEthernet0/1
switchport mode access
switchport access vlan 10
interface GigabitEthernet0/24
switchport mode trunk
switchport trunk allowed vlan 10,20,30
switchport trunk native vlan 999
switchport nonegotiate
Wi-Fi вписывается сюда через точку доступа: у неё trunk-порт, и каждый SSID отображается в свою VLAN. Гостевой SSID → VLAN 30 → подсеть, из которой маршрут только в интернет.
Смотрим руками
На хосте, подключённом к trunk-у, увидеть, какие VLAN вообще приходят:
$ sudo tcpdump -i eth0 -n -e vlan
Если тут пусто, а должны быть кадры — порт на коммутаторе в режиме access, или теги снимает карта (см. выше). На Linux-роутере — какие субинтерфейсы есть и что в них:
$ ip -d link show type vlan
$ cat /proc/net/vlan/config
На коммутаторе — таблица MAC-адресов по VLAN: show mac address-table vlan 10 покажет, за каким портом какой хост в этой VLAN, а show interfaces trunk — какие VLAN разрешены в trunk-ах и какая native. При «не видят друг друга» первым делом сравнивают native и allowed на обоих концах trunk-а.
В Wireshark тег раскрывается строкой 802.1Q Virtual LAN между Ethernet и IP с полями PCP, DEI и ID.
Что запомнить
- VLAN — домен широковещания внутри одного коммутатора или группы коммутаторов; каждой VLAN — своя IP-подсеть. 4094 номера.
- Тег 802.1Q — 4 байта после MAC отправителя: TPID
0x8100, приоритет и 12-битный VID. - Access-порт: одна VLAN, хост видит кадры без тега. Trunk: много VLAN, все с тегом, кроме native. Native VLAN на двух концах trunk-а должен совпадать; лучше его не использовать для хостов.
- Таблица MAC — по (VLAN, MAC). Флуд — только внутри VLAN.
- Между VLAN — роутер: субинтерфейсы на trunk-е (router on a stick, кабель дважды) или L3-коммутатор с SVI. Изоляция после этого — только в правилах файрвола.
- Linux:
ip link add link eth0 name eth0.10 type vlan id 10для хоста, мост сvlan_filteringдля коммутатора. VLAN offload прячет теги от tcpdump.
Дальше — Часть 18: VXLAN: что делать, когда 4094 VLAN мало, а сеть должна растянуться через роутеры и дата-центры. Кадр Ethernet внутри UDP-датаграммы, VNI, VTEP, как туннель узнаёт, где живёт чужой MAC, и зачем это облакам и Kubernetes.
Серия «Сети для самых маленьких»
- Модели OSI и TCP/IP — зачем сетевой стек разбит на уровни и как данные обрастают заголовками по пути пакета.
- Ethernet — кадр по байтам, MAC-адреса и как коммутатор решает, в какой порт отправить кадр.
- Wi-Fi — чем радио отличается от кабеля, как клиент подключается к точке доступа и как защищается эфир.
- PPPoE — как провайдер заворачивает сессию абонента в Ethernet и откуда берётся MTU 1492.
- IPv4: адреса, маски и подсети — как читать адрес и маску, делить сеть на подсети и решать, нужен ли шлюз.
- IPv4: заголовок, маршрутизация и NAT — как роутер выбирает маршрут для пакета и как вся квартира выходит в интернет с одного адреса.
- ARP — как по IP-адресу соседа узнать его MAC-адрес и почему соседа так легко подменить.
- ICMP — служебные сообщения IP, как на самом деле работают ping и traceroute и что ломается, когда их режут.
- UDP — восемь байт заголовка, порты и почему отправка без соединения иногда лучше.
- TCP — как из ненадёжного IP получается надёжный поток байтов и почему потеря пакета режет скорость.
- DHCPv4 — как машина без адреса получает адрес, маску, шлюз и DNS четырьмя сообщениями.
- DNS — как имя превращается в адрес: дерево зон, рекурсивные серверы, записи и кеширование.
- IPv6: адреса и заголовок — как записываются 128-битные адреса, какие они бывают и чем заголовок IPv6 отличается от IPv4.
- ICMPv6 и Neighbor Discovery — как в IPv6 без ARP и широковещания находят соседей и роутер.
- SLAAC — как хост собирает себе адрес IPv6 из объявления роутера без всякого сервера.
- DHCPv6 — зачем DHCP, если есть SLAAC, и как провайдер выдаёт домашнему роутеру целый блок сетей.
- VLAN (эта статья) — как один коммутатор и один кабель несут несколько независимых сетей.
- VXLAN — как растянуть сеть Ethernet через роутеры, завернув кадры в UDP.
Оставить комментарий могут только зарегистрированные пользователи.
Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.