L2 VLAN, 802.1Q, STP

Один коммутатор — это одна общая L2-сеть, где все слышат друг друга. Это плохо для безопасности (бухгалтерия видит broadcast серверов), плохо для производительности (один большой broadcast-домен), плохо для проектирования. Решается это VLAN'ами.

Когда в сети появляется резервирование (две связки между свитчами на случай обрыва), возникает другой подвох — петля L2, которая за секунды кладёт всю сеть. Лечится STP/RSTP.

Что узнаешь

1. Что такое VLAN — и зачем

VLAN (Virtual LAN) — это способ логически разделить один физический коммутатор на несколько независимых сетей. Хосты в разных VLAN не слышат друг друга на L2, даже если воткнуты в один и тот же свитч.

Физическая топология vs логическая (с VLAN)
Физическая топология один свитч, 6 портов SWITCH 24p 24× GigE, 4× SFP+ PC-1 PC-2 SRV-1 SRV-2 VoIP-1 VoIP-2 Проблема: один broadcast-домен broadcast от PC-1 слышат все 5 остальных хостов VoIP-приоритет не сделать бухгалтерию не отделить от dev-окружения Логическая (с VLAN) тот же свитч, три VLAN SWITCH 24p 3 VLAN сконфигурированы VLAN 10 · USERS VLAN 20 · SERVERS VLAN 30 · VOICE PC-1 PC-2 SRV-1 SRV-2 VoIP-1 VoIP-2 Три изолированных broadcast-домена PC-1 не слышит SRV-1 на L2 VoIP отдельная сеть, можно QoS Сегментация + безопасность даром
Один и тот же физический коммутатор — но «как будто три разных свитча» с точки зрения хостов.

Зачем нужны VLAN — реальные причины

2. Формат тега 802.1Q

Когда кадр идёт между свитчами по trunk-порту, ему нужно нести информацию: «я из VLAN 10». Это делается через тег 802.1Q — 4 байта, вставляемые в Ethernet-кадр.

Кадр Ethernet с тегом 802.1Q
Untagged (обычный кадр) Dst MAC Src MAC EtherType 0x0800 Payload (IP-пакет) FCS Tagged (с 802.1Q) — добавляется 4 байта между Src MAC и EtherType Dst MAC Src MAC 802.1Q tag TPID (2B) TCI (2B) EtherType 0x0800 Payload FCS Тег раскладываем по битам — 32 бита всего TPID 0x8100 Tag Protocol ID 16 бит, всегда 0x8100 PCP 3 бита Priority QoS, 0-7 DEI 1 бит Drop eligible VID — VLAN ID 12 бит = 0..4095 собственно номер VLAN VID=0/4095 reserved
Тег 802.1Q добавляет 4 байта overhead. Максимальный размер фрейма становится 1522 байт (или 9022 для jumbo).

Reserved VLAN IDs

VIDНазначение
0Priority-only tag (есть PCP, но нет принадлежности к VLAN)
1Default VLAN на большинстве коммутаторов (Cisco). НЕ используется в production.
2-1001Стандартный диапазон, доступен везде.
1002-1005Зарезервированы Cisco для legacy (Token Ring, FDDI). Не использовать.
1006-4094Расширенный диапазон, доступен на современных свитчах.
4095Reserved (служебный).

3. Access vs Trunk порты

Порт коммутатора может работать в одном из двух режимов:

Access port vs Trunk port
Access port «один порт = один VLAN» PC обычный хост access SWITCH interface gi0/1 → VLAN 10 Хост шлёт untagged → свитч внутри помечает VLAN 10 При выходе на access — тег снимается Trunk port «несёт несколько VLAN сразу, с тегами» SWITCH-A VLAN 10, 20, 30 SWITCH-B VLAN 10, 20, 30 TRUNK [VLAN10] frame from PC-1 → SRV-A [VLAN20] frame from PC-3 → DB [VLAN30] frame from VoIP phone Trunk несёт все VLAN с тегами в одном кадре. Свитч на другом конце видит тег и роутит куда надо.
Access — между свитчем и хостом. Trunk — между свитчами или между свитчем и роутером/гипервизором.

Native VLAN — нюанс trunk-порта

На trunk-порту один из VLAN объявляется native — его кадры идут без тега. По умолчанию native = VLAN 1.

безопасность VLAN hopping атака. Если native VLAN на trunk = 1, и обычный access-порт стоит в VLAN 1 — атакующий может отправить кадр с двумя 802.1Q тегами подряд (double-tagging). Первый тег снимется на первом свитче, второй пройдёт дальше → попал в другой VLAN, минуя файрвол. Защиты: 1) native = неиспользуемый VLAN (например 999), 2) на каждом trunk явно прописать switchport trunk native vlan tag.

4. Inter-VLAN routing — как VLAN общаются между собой

L2-коммутатор внутри VLAN'а — это L2. А чтобы пакет ушёл из VLAN 10 в VLAN 20, нужен L3. Между разными VLAN — всегда маршрутизация.

Три способа inter-VLAN routing
1. Router-on-a-stick (старая школа) L2 SWITCH TRUNK ROUTER subinterfaces VLAN 10 VLAN 20 VLAN 30 VLAN 10 Минусы: bottleneck на одном trunk-линке, «hairpin» — пакет туда-сюда. Дёшево, но не для DC. Используется в малых офисах 2. L3-switch с SVI (современный стандарт) L3 SWITCH SVI: vlan10 = 10.10.0.1/24 SVI: vlan20 = 10.20.0.1/24 VLAN 10 VLAN 20 VLAN 30 VLAN 10 SVI = Switch Virtual Interface. L3-свитч имеет per-VLAN виртуальный gateway. Wire-speed routing, никакого hairpin 3. Routed access / spine-leaf (современный ДЦ) SPINE SPINE LEAF-1 LEAF-2 LEAF-3 LEAF-4 VLAN терминируется на leaf (или вообще нет VLAN, всё L3 + VXLAN)
Современный ДЦ — это spine-leaf с routing на каждом leaf. VLAN живёт только в пределах одного rack.

5. STP — зачем нужен и что без него

Представь сеть с резервированием — два uplink'а между свитчами на случай обрыва одного. Это правильно с точки зрения надёжности. Но без специальной защиты — это смерть сети.

Без STP: broadcast-storm — почему сеть умирает за секунды
① Топология: три свитча в кольце. Резервирование — это хорошо… SW-A SW-B SW-C PC ② PC шлёт broadcast (например ARP). Что происходит? SW-A SW-B SW-C PC BCAST ×N BCAST ×N BCAST ×N BROADCAST STORM Каждый свитч получает broadcast, флудит на все порты, включая uplink. Соседний получает — флудит обратно. Кадры размножаются экспоненциально. В Ethernet НЕТ TTL! Кадры летают вечно — CPU свитчей 100%, сеть мёртвая за 10-30 секунд.
В IP есть TTL (счётчик хопов). В Ethernet — нет. Loop в L2 = катастрофа. Поэтому нужен STP.

6. Как STP всё это лечит

STP (Spanning Tree Protocol, 802.1D) умеет одну простую вещь: построить из топологии с кольцами логическое дерево (без циклов), заблокировав избыточные порты. Если основной линк падает — заблокированный «оживает» автоматически. Эластичность + защита от петель.

STP в действии: выбор root и блокировка лишнего
До STP — кольца есть, петля возможна SW-A (ROOT) priority 4096 SW-B priority 32768 SW-C priority 32768 SW-D priority 32768 X BLOCKED резерв на случай аварии Как выбирался root: Меньшая Bridge ID = Priority (4096) + MAC. SW-A приоритет ниже → стал root. Если приоритеты одинаковые — побеждает MAC, который меньше численно.
Один линк намеренно заблокирован. Если уйдёт SW-A↔SW-B — за 30-60 сек STP переключится на резерв.

Состояния портов STP (классический)

Состояния порта STP
Blocking слушает BPDU 20 секунд Listening слушает + шлёт BPDU 15 секунд Learning учит MAC 15 секунд Forwarding данные идут Disabled админ. shutdown Итого: 50 секунд до начала передачи данных. Это очень долго! Поэтому придумали RSTP (802.1w) — переход в Forwarding за ~6 секунд.
Между Disabled и Forwarding порт проходит три промежуточных состояния, итого ~50 секунд.

RSTP — современная замена

RSTP (Rapid Spanning Tree Protocol, 802.1w) сократил время сходимости с 50с до ~6с. Состояний теперь три: DiscardingLearningForwarding. Используется по умолчанию на всех современных свитчах.

Расширения STP — must know

ФичаЗачем
BPDU Guard На access-портах. Если кто-то воткнул свой свитч (а тот шлёт BPDU) → порт мгновенно err-disabled. Защита от подделки root.
Root Guard На trunk-портах в сторону «не root». Если оттуда приходит BPDU с лучшим priority — порт блокируется. Защита, что root не «переедет» внезапно.
BPDU Filter Запрещает порту участвовать в STP. Использовать ОСТОРОЖНО — можно создать loop, если ошибся в топологии.
PortFast / edge port На access-портах. Порт сразу в Forwarding, не ждёт STP. Для DHCP-клиентов, серверов — важно (быстрая загрузка).
Loop Guard Защита от «unidirectional link» (когда BPDU перестали приходить, но физически линк жив) — блокирует порт вместо ошибочного forwarding.
UDLD (Unidirectional Link Detection) Cisco-specific. Активная проверка двунаправленности линка. Часто включают на оптике.

7. EtherChannel / LAG — альтернатива STP

Когда нужно несколько линков в одну сторону, но не хочется блокировать половину через STP — собирают их в EtherChannel (Cisco) / Link Aggregation Group (стандарт IEEE 802.3ad / 802.1AX). Несколько физических линков становятся одним логическим, с балансировкой по hash.

STP vs LAG
С STP: один линк работает, второй спит SW-A SW-B 1G FORWARDING 1G BLOCKED Эффективная скорость: 1 Gbps 50% линка простаивает LAG: оба линка работают параллельно SW-A SW-B port-channel Эффективная скорость: 2 Gbps балансировка по hash(src/dst MAC) + failover автоматический
LAG настраивается через LACP (динамический, стандарт) или PAgP (Cisco-only). Стандарт: LACP.

8. Cisco-конфиги для практики

Создать VLAN

switch# configure terminal switch(config)# vlan 10 switch(config-vlan)# name USERS switch(config-vlan)# exit switch(config)# vlan 20 switch(config-vlan)# name SERVERS switch(config-vlan)# exit

Access-порт

switch(config)# interface GigabitEthernet0/1 switch(config-if)# switchport mode access switch(config-if)# switchport access vlan 10 switch(config-if)# spanning-tree portfast # быстрый старт для хоста switch(config-if)# spanning-tree bpduguard enable # err-disable, если придёт BPDU switch(config-if)# description "Marketing PC-15"

Trunk-порт

switch(config)# interface GigabitEthernet0/24 switch(config-if)# switchport trunk encapsulation dot1q switch(config-if)# switchport mode trunk switch(config-if)# switchport trunk allowed vlan 10,20,30,99 # только эти switch(config-if)# switchport trunk native vlan 999 # native = unused switch(config-if)# switchport trunk native vlan tag # тегировать всё, безопасность

SVI (L3 на L3-свитче)

switch(config)# ip routing switch(config)# interface vlan 10 switch(config-if)# ip address 10.10.0.1 255.255.255.0 switch(config-if)# no shutdown switch(config)# interface vlan 20 switch(config-if)# ip address 10.20.0.1 255.255.255.0 switch(config-if)# no shutdown # Теперь VLAN 10 ↔ VLAN 20 общаются через wire-speed routing

STP / RSTP

switch(config)# spanning-tree mode rapid-pvst # RSTP per-VLAN switch(config)# spanning-tree vlan 10 priority 4096 # этот свитч = root для VLAN 10 switch(config)# spanning-tree portfast bpduguard default # BPDU guard на всех PortFast switch# show spanning-tree # текущая топология STP switch# show spanning-tree root # кто root

LACP (LAG)

switch(config)# interface range gi0/23 - 24 switch(config-if-range)# channel-group 1 mode active # LACP active switch(config-if-range)# exit switch(config)# interface Port-channel 1 switch(config-if)# switchport mode trunk switch(config-if)# switchport trunk allowed vlan 10,20,30 switch# show etherchannel summary

9. QinQ (802.1ad) — двойной тег

Провайдеру нужно пропустить через свою сеть клиентские VLAN'ы, не трогая их. Решение — QinQ: добавляет ещё один внешний 802.1Q-тег поверх клиентского. Клиент думает, что его кадры идут «как есть»; провайдер коммутирует по своему внешнему тегу.

QinQ — внешний тег провайдера + внутренний тег клиента
Dst MAC Src MAC S-TAG TPID 0x88a8 VID = провайдер C-TAG TPID 0x8100 VID = клиент ET Payload FCS S-TAG (service / outer) + C-TAG (customer / inner)
Провайдер пропускает 4096 клиентов × 4096 VLAN каждого = 16 миллионов виртуальных сетей.

10. Частые ошибки и сценарии

сценарий 1 «VLAN не работает между двумя свитчами» → 1) Проверь, что VLAN существует на обоих (show vlan brief). 2) Проверь, что trunk правильно поднят (show interfaces trunk). 3) Проверь, что в switchport trunk allowed vlan есть нужный номер. 4) Если разные native VLAN на сторонах — увидишь warning «native VLAN mismatch».
сценарий 2 «После подключения нового свитча половина сети легла» → Самое вероятное: новый свитч прибыл с дефолтным STP priority (32768) и более низким MAC, стал root для всего домена → топология перестроилась → пакеты «потерялись» на 30 секунд. Профилактика: на core-свитчах spanning-tree priority 4096, на новых устанавливай bpduguard на все access-порты.
сценарий 3 «PC получает IP из «чужого» DHCP» → Кто-то воткнул роутер с DHCP в офисную сеть → broadcast DISCOVER пошёл к нему первому → клиент получил «не тот» IP, default gateway уводит в никуда. Защита: DHCP snooping на свитчах + access-порты с BPDU guard.
Ключевое за этот урок