Внешний вид
Кейс №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'ы по подсетям) |
Уроки
- Изоляция = L2 (теги) + L3 (политика маршрутизатора). VLAN без firewall-правил соединяет сети через роутер сильнее, чем плоский L2 — клиенты даже не подозревают о разделении.
- Drop-правила направленные; «зеркальность» требуется задавать явно (или через address-list одним правилом).
- Тегирование на хосте (Linux
ip link … type vlan, на Windows — драйвер NIC) позволяет участвовать в нескольких VLAN с одного физического порта; в боевых сетях это роль свитча (access/trunk-порты), а не клиента. - Побочный эффект для портфолио: tcpdump с фильтром
vlanпоказывает теги 802.1Q в кадрах — наглядное доказательство понимания L2.
Открытые хвосты
- alpine1/alpine2 фактически «домашние» в untagged-сети тоже (udhcpc на eth0 возвращал .100.x после реконфигурации) — для строгой сегментации выключить untagged-адреса на клиентах (killall udhcpc + flush eth0) или настроить порты как access на свитче. В лабе не критично, отмечено в кейсе №5.