Skip to content

Кейс №6 (строительная лаба №6): VLAN-сегментация + firewall-изоляция ​

Дата: 2026-09-29 Задача: разделить клиентов на два изолированных сегмента (VLAN 10 и VLAN 20) на одном физическом линке; каждый сегмент — свой DHCP и шлюз (лаба №6). Статус: ✅ построено и проверено


Построенная топология ​

text
alpine1 ──[VLAN 10, 802.1Q tag 10]──┐
                                    ├── lab-lan (один сегмент, тегированные кадры)
alpine2 ──[VLAN 20, 802.1Q tag 20]──┘
                    │
        CHR ether2: vlan10 (192.168.10.1), vlan20 (192.168.20.1)
                    │  DHCP: dhcp10 (pool10), dhcp20 (pool20)

CHR (/interface vlan — подинтерфейсы с тегами 10/20; адреса шлюзов; два DHCP-сервера со своими пулами 10.100-10.199 / 20.100-20.199).

Клиенты (Linux): ip link add link eth0 name eth0.N type vlan id N — подинтерфейс, помечающий кадры тегом; адрес из соответствующей сети, шлюз — адрес CHR в этом VLAN. Хост-наблюдатель получил аналогичные тегированные интерфейсы (virbr-lab.10/.20) для доступа в оба сегмента.

Ключевой инцидент лабы: изоляция «не завелась» без firewall ​

Тест изоляции провален на первом проходе: alpine1 (VLAN 10) пинговал alpine2 (VLAN 20) (~0.8 мс).

Причина (разобрана в главе «VLAN и изоляция» учебника):

  • VLAN изолирует только L2: коммутатор не смешивает кадры с разными тегами;
  • но CHR — маршрутизатор с интерфейсом в ОБОИХ VLAN; connected-маршруты есть в обе сети, и forward между ними работает по умолчанию;
  • клиенты достигали друг друга «через дверь»: alpine1 → шлюз vlan10 → CHR маршрутизирует → vlan20 → alpine2. L2-изоляция при этом нигде не нарушалась.

Решение — второй слой изоляции, L3:

routeros
/ip firewall filter add chain=forward src-address=192.168.10.0/24 dst-address=192.168.20.0/24 action=drop comment="isolate-10->20"
/ip firewall filter add chain=forward src-address=192.168.20.0/24 dst-address=192.168.10.0/24 action=drop comment="isolate-20->10"

Два правила, а не одно: drop действует строго по направлению src→dst, ответный трафик первому правилу не подпадает.

Итоговые проверки ​

ПроверкаОжиданиеФакт
alpine1 → 192.168.20.12❌ 100% loss✅ 100% loss
alpine1 → ya.ru✅ 0% loss✅ ~17 мс
alpine2 → ya.ru✅ 0% loss✅ ~22 мс
DHCP в каждом VLANадрес из своего пула✅ (lease'ы по подсетям)

Уроки ​

  1. Изоляция = L2 (теги) + L3 (политика маршрутизатора). VLAN без firewall-правил соединяет сети через роутер сильнее, чем плоский L2 — клиенты даже не подозревают о разделении.
  2. Drop-правила направленные; «зеркальность» требуется задавать явно (или через address-list одним правилом).
  3. Тегирование на хосте (Linux ip link … type vlan, на Windows — драйвер NIC) позволяет участвовать в нескольких VLAN с одного физического порта; в боевых сетях это роль свитча (access/trunk-порты), а не клиента.
  4. Побочный эффект для портфолио: tcpdump с фильтром vlan показывает теги 802.1Q в кадрах — наглядное доказательство понимания L2.

Открытые хвосты ​

  • alpine1/alpine2 фактически «домашние» в untagged-сети тоже (udhcpc на eth0 возвращал .100.x после реконфигурации) — для строгой сегментации выключить untagged-адреса на клиентах (killall udhcpc + flush eth0) или настроить порты как access на свитче. В лабе не критично, отмечено в кейсе №5.