Когда нужна статическая маршрутизация между VLAN и подсетями
Статическая маршрутизация между VLAN подходит небольшим офисным сетям: 3-10 VLAN, до 200 хостов, одна точка маршрутизации, предсказуемая топология. В этих условиях OSPF и BGP добавляют служебный трафик и усложняют разбор инцидентов, а выигрыша не дают.
Рабочих схем две. «Маршрутизатор на палочке» (router on a stick): один физический интерфейс роутера работает trunk-портом, для каждого VLAN создан sub-интерфейс с тегом 802.1Q. L3-коммутатор: держит SVI для каждого VLAN и маршрутизирует трафик между сегментами аппаратно.
Ниже пошаговые конфигурации для обеих схем, эталонные таблицы маршрутов для роутера, коммутатора и L3-коммутатора, разбор чёрных дыр из-за маршрута на одном устройстве и чек-лист проверки связности по уровням L1, L2, L3.
Чем статическая маршрутизация отличается от динамической в контексте VLAN
Статический маршрут не перестраивается при изменении топологии. Запись в таблице маршрутизации меняется только вручную. Взамен вы получаете полный контроль над путями, нулевой оверхед на служебные пакеты и предсказуемое поведение при разборе инцидентов.
Порог применимости: 3-10 VLAN и одна точка маршрутизации. В этом диапазоне статика проще и надёжнее динамических протоколов. Переходить на OSPF стоит, когда сегментов больше десяти, появляется второй маршрутизатор для резервирования, топология меняется чаще раза в квартал или нужна автоматическая перестройка при отказе линка.
Цена решения статикой видна на простом примере. Добавили VLAN 40 с подсетью 192.168.40.0/24. Маршрут к ней придётся прописать вручную на каждом устройстве, которому нужен доступ в этот сегмент. При динамической маршрутизации анонс ушёл бы сам.
Что понадобится перед настройкой: адресация, шлюзы, план VLAN
План адресации для примеров этой статьи:
| VLAN ID | Подсеть | Шлюз | Назначение |
|---|---|---|---|
| VLAN 10 | 192.168.10.0/24 | 192.168.10.1 | Пользователи |
| VLAN 20 | 192.168.20.0/24 | 192.168.20.1 | Серверы |
| VLAN 30 | 192.168.30.0/24 | 192.168.30.1 | Management |
Что подготовить до первой команды:
- VLAN ID и подсети для каждого сегмента;
- адрес шлюза по умолчанию для каждого VLAN;
- CLI-доступ к роутеру и коммутатору;
- свободный порт на обоих устройствах под trunk.
Ключевое правило: шлюз по умолчанию на хостах должен указывать на интерфейс маршрутизации, то есть на sub-интерфейс роутера или SVI коммутатора. Ставить шлюзом физический access-порт коммутатора нельзя: L2-порт не маршрутизирует и не отвечает на ARP за другой сегмент.
Схема 1: «маршрутизатор на палочке» - конфигурация и таблица маршрутов
Топология: роутер соединён с коммутатором одним физическим линком в режиме trunk. На роутере для каждого VLAN создаётся sub-интерфейс с инкапсуляцией 802.1Q. Хосты подключены к access-портам коммутатора в своих VLAN и отправляют весь трафик за пределы сегмента на IP своего sub-интерфейса.
Настройка sub-интерфейсов на роутере (Cisco IOS, Linux, MikroTik)
Cisco IOS:
interface GigabitEthernet0/0.10 description VLAN10_USERS encapsulation dot1Q 10 ip address 192.168.10.1 255.255.255.0 ! interface GigabitEthernet0/0.20 description VLAN20_SERVERS encapsulation dot1Q 20 ip address 192.168.20.1 255.255.255.0 ! interface GigabitEthernet0/0.30 description VLAN30_MGMT encapsulation dot1Q 30 ip address 192.168.30.1 255.255.255.0
Linux (vlan-интерфейсы):
ip link add link eth0 name eth0.10 type vlan id 10 ip link add link eth0 name eth0.20 type vlan id 20 ip link add link eth0 name eth0.30 type vlan id 30 ip addr add 192.168.10.1/24 dev eth0.10 ip addr add 192.168.20.1/24 dev eth0.20 ip addr add 192.168.30.1/24 dev eth0.30 ip link set eth0.10 up ip link set eth0.20 up ip link set eth0.30 up sysctl -w net.ipv4.ip_forward=1
MikroTik:
/interface vlan add name=vlan10 vlan-id=10 interface=ether1 /interface vlan add name=vlan20 vlan-id=20 interface=ether1 /interface vlan add name=vlan30 vlan-id=30 interface=ether1 /ip address add address=192.168.10.1/24 interface=vlan10 /ip address add address=192.168.20.1/24 interface=vlan20 /ip address add address=192.168.30.1/24 interface=vlan30 /ip settings set ip-forward=yes
Для Linux не забудьте включить форвардинг: без net.ipv4.ip_forward=1 ядро не станет передавать пакеты между vlan-интерфейсами. Расширенные сценарии маршрутизации между VLAN на Linux с правилами iptables и nftables разобраны в отдельном руководстве.
Native VLAN на trunk-порту коммутатора должен совпадать с настройкой нетегированного трафика на роутере. По умолчанию native VLAN равен 1. Если на роутере нет sub-интерфейса без тега, оставьте native VLAN 1 и не передавайте по нему пользовательские данные. На физическом интерфейсе роутера не должно быть IP-адреса, когда он несёт только тегированный трафик: иначе роутер получит адрес в native VLAN и начнёт отвечать на ARP в нём.
Настройка trunk-порта на коммутаторе
Сторона коммутатора в сторону роутера:
interface GigabitEthernet0/1 description TO_ROUTER switchport trunk encapsulation dot1q switchport mode trunk switchport trunk allowed vlan 10,20,30 switchport trunk native vlan 1
Access-порты для хостов настраиваются в своих VLAN:
interface GigabitEthernet0/2 description PC_VLAN10 switchport mode access switchport access vlan 10
Native VLAN mismatch - частая причина потери management-трафика. Проверить согласованность тега с обеих сторон trunk помогает:
show interfaces trunk
Вывод показывает режим (trunking), список allowed VLAN и native VLAN. Если native VLAN на двух концах не совпадает, нетегированные кадры уходят в другой сегмент, и коммутатор перестаёт отвечать по управляющему адресу.
Таблица маршрутов роутера и коммутатора: что должно быть
После поднятия sub-интерфейсов на роутере появляются connected-маршруты. Default route добавляется вручную:
| Destination | Тип | Interface | Next-hop |
|---|---|---|---|
| 192.168.10.0/24 | connected | Gi0/0.10 | - |
| 192.168.20.0/24 | connected | Gi0/0.20 | - |
| 192.168.30.0/24 | connected | Gi0/0.30 | - |
| 0.0.0.0/0 | static | Gi0/0 | ISP next-hop |
Коммутатор в этой схеме не маршрутизирует. Ему нужен только шлюз для собственного управления:
| Destination | Тип | Next-hop |
|---|---|---|
| 0.0.0.0/0 | static | 192.168.30.1 |
Здесь 192.168.30.1 - адрес роутера в management VLAN. Коммутатор не знает о других подсетях: весь трафик за пределами своей management-подсети он отправляет на роутер, а решение о дальнейшем пути принимает роутер.
Проверить таблицу маршрутов на любой из платформ:
show ip route route -n ip route show
Пропускная способность trunk-линка задаёт потолок для всего межсегментного трафика: все VLAN делят один физический порт. Типичные параметры: MTU 1500, скорость 1 или 10 Гбит/с, native VLAN 1. При росте трафика между VLAN этот линк становится узким местом, и тогда переходят к схеме на L3-коммутаторе.
Схема 2: L3-коммутатор - SVI, ip routing и статические маршруты
Топология: L3-коммутатор держит SVI для каждого VLAN, хосты подключены access-портами, шлюзом по умолчанию для хостов служит IP SVI. Маршрутизация между VLAN идёт внутри коммутатора, во внешнюю сеть - через отдельный роутер.
Создание SVI и включение ip routing
Базовая конфигурация L3-коммутатора Cisco:
ip routing ! vlan 10 vlan 20 vlan 30 ! interface Vlan10 description VLAN10_USERS ip address 192.168.10.1 255.255.255.0 no shutdown ! interface Vlan20 description VLAN20_SERVERS ip address 192.168.20.1 255.255.255.0 ! interface Vlan30 description VLAN30_MGMT ip address 192.168.30.1 255.255.255.0
SVI поднимается при двух условиях: VLAN существует в базе коммутатора, и хотя бы один порт в этом VLAN находится в состоянии up. Если SVI висит в down, маршрутизация между VLAN не работает, даже когда IP-адрес назначен. Проверка:
show ip interface brief show ip route connected
Разницу между SVI и routed port и готовые конфигурации для Inter-VLAN на Cisco Catalyst разбирает руководство по SVI и routed ports.
Статические маршруты на L3-коммутаторе и внешнем роутере
На L3-коммутаторе нужен default route в сторону внешнего роутера:
ip route 0.0.0.0 0.0.0.0 10.0.0.2
Адрес 10.0.0.2 - интерфейс внешнего роутера в транзитной подсети 10.0.0.0/30. На внешнем роутере прописываются обратные маршруты к каждой внутренней подсети:
ip route 192.168.10.0 255.255.255.0 10.0.0.1 ip route 192.168.20.0 255.255.255.0 10.0.0.1 ip route 192.168.30.0 255.255.255.0 10.0.0.1
Адрес 10.0.0.1 - интерфейс L3-коммутатора в транзитной подсети (routed port). Без обратного маршрута на роутере ответный трафик из внешней сети до внутренних VLAN не вернётся: пакет дойдёт до роутера и будет отброшен. Это и есть чёрная дыра.
Таблица маршрутов L3-коммутатора: эталон
| Prefix | Тип | Interface | Next-hop |
|---|---|---|---|
| 192.168.10.0/24 | connected | Vlan10 | - |
| 192.168.20.0/24 | connected | Vlan20 | - |
| 192.168.30.0/24 | connected | Vlan30 | - |
| 0.0.0.0/0 | static (S*) | - | 10.0.0.2 |
Connected-маршруты появляются автоматически при поднятии SVI. Статический default route добавляется вручную. В формате Cisco IOS этот маршрут помечается звёздочкой: S* 0.0.0.0/0 [1/0] via 10.0.0.2.
Почему маршрут на одном устройстве приводит к чёрным дырам
Маршрут должен существовать на обоих концах пути. Когда он настроен только на одном устройстве, обратный трафик не находит путь и отбрасывается. Классический случай: на L3-коммутаторе есть default route в сторону роутера, а на роутере нет маршрута к 192.168.20.0/24.
Что происходит с пакетом из внешней сети в хост VLAN 20. Пакет доходит до роутера. Роутер ищет в таблице маршрутизации запись для 192.168.20.0/24, не находит её и отправляет пакет по своему default route обратно в сторону интернета либо отбрасывает с ICMP unreachable. Хост в VLAN 20 ответа не получает.
В traceroute это выглядит так: последний отвечающий хоп - роутер, дальше идут таймауты. Этот признак отличает чёрную дыру от полного отказа связи.
Как диагностировать чёрную дыру: ping, traceroute, show ip route
Порядок проверки:
- ping с хоста в VLAN 20 до внешнего адреса. Если проходит, значит исходящий путь и NAT работают.
- ping с внешнего адреса до хоста в VLAN 20. Если не проходит, проблема в обратном пути.
- traceroute с внешнего адреса. Последний хоп показывает, где теряется трафик.
- show ip route на роутере. Отсутствие записи для 192.168.20.0/24 подтверждает причину.
Решение: добавить статический маршрут на роутере. Дополнительные команды для Linux: ip route get 192.168.20.5 покажет, какой маршрут будет выбран, а tcpdump -i any icmp позволит увидеть, доходят ли ICMP-пакеты до узла.
Асимметричная маршрутизация и stateful firewall
Трафик может теряться даже при наличии маршрутов на всех устройствах. Причина - асимметричная маршрутизация: запрос уходит по одному пути, ответ возвращается по другому. Stateful-файрвол в такой ситуации отбрасывает ответ, потому что он не соответствует известной сессии.
Пример: два маршрута равной стоимости к одной подсети на разных устройствах, и запрос уходит через одно, а ответ приходит через другое. В небольшой офисной сети это встречается редко, но при резервировании каналов и нескольких uplink становится частой проблемой. Решение: оставить один путь, настроить session persistence или осознанно разрешить асимметрию. Механику и готовые конфигурации для диагностики разбирает материал по асимметричной маршрутизации.
Как читать таблицу маршрутов и находить ошибки
Формат вывода show ip route: код маршрута, префикс и маска, next-hop, интерфейс, административная дистанция (AD) и метрика. Код показывает, откуда взялся маршрут, а AD определяет приоритет между источниками при одинаковой длине префикса.
Коды маршрутов и что они значат
| Код | Значение | Откуда берётся |
|---|---|---|
| C | connected | Подсеть на интерфейсе |
| L | local | Адрес самого интерфейса (/32) |
| S | static | Настроен вручную |
| S* | default static | Маршрут по умолчанию, 0.0.0.0/0 |
| O | OSPF | Получен по OSPF (для сравнения) |
Connected-маршруты имеют приоритет над static при равной длине префикса: AD connected равен 0, AD static по умолчанию 1. Если к 192.168.20.0/24 есть и connected, и static запись, трафик пойдёт по connected.
Longest prefix match на практике
При выборе маршрута побеждает самый длинный префикс. Есть default route 0.0.0.0/0 и static route 192.168.20.0/24. Пакет к 192.168.20.5 уйдёт по /24, потому что этот префикс длиннее. Если static route указывает на неверный next-hop, трафик уйдёт в никуда, хотя адрес получателя существует.
Проверить, какой маршрут реально выбран:
show ip route 192.168.20.5 ip route get 192.168.20.5 route print
Правило простое: перед поиском ошибки в конфигурации проверяйте, какой маршрут выбрала система для конкретного адреса. Основы выбора пути и работу таблиц маршрутизации на Cisco, Linux и L3-коммутаторах разбирает руководство по маршрутизации IP-пакетов. Когда в Linux нужно несколько таблиц маршрутизации под разные интерфейсы, помогает профиль маршрутизации для нескольких интерфейсов.
Чек-лист проверки связности между VLAN и подсетями
Проверяйте по порядку, от физики к маршрутизации. Останавливайтесь на первом шаге, где норма не выполняется.
- Физические линки. Cisco: show interfaces status. Linux: ip link show. Норма: интерфейсы в состоянии up, ошибок нет.
- Trunk-порт. Cisco: show interfaces trunk. Норма: режим trunking, в allowed VLAN входят 10, 20, 30, native VLAN совпадает с обеих сторон.
- SVI и sub-интерфейсы. show ip interface brief. Норма: каждый интерфейс в состоянии up/up.
- Таблицы маршрутов на всех устройствах. show ip route, ip route show, route -n. Норма: connected-маршруты для каждого VLAN, default route в сторону нужного next-hop.
- Шлюз по умолчанию на хостах. Windows: ipconfig. Linux: ip route. Норма: шлюз равен IP SVI или sub-интерфейса в этом VLAN.
- ARP. Cisco: show arp. Linux: arp -a или ip neigh. Норма: записи для адресов шлюзов, без дублей.
- ping между VLAN и до внешнего адреса. Норма: проходит в обе стороны.
- traceroute в обе стороны. Норма: полный путь без таймаутов на промежуточных хопах.
- ACL и firewall. Cisco: show access-lists. Linux: iptables -L -v -n или nft list ruleset. Норма: нет правил, блокирующих нужные подсети.
- MAC-таблица коммутатора. show mac address-table. Норма: MAC-адреса хостов видны в правильных VLAN.
Проверка L2: trunk, native VLAN, MAC-таблица
Команды L2: show interfaces trunk, show vlan brief, show mac address-table. Норма для trunk: статус trunking, согласованный native VLAN, allowed VLAN включает все рабочие сегменты. Признак проблемы на L2: MAC-адреса хостов не появляются в MAC-таблице в нужном VLAN, хотя порт в состоянии up.
Проверка L3: маршруты, ARP, ping, traceroute
Команды L3: show ip route, show arp, ping, traceroute. Норма: connected-маршруты для всех VLAN, static default route, ARP-записи для шлюзов. Признак проблемы на L3: ping идёт в одну сторону и не идёт в обратную, traceroute обрывается на роутере. Результаты удобно фиксировать в таблице: узел, команда, ожидаемый результат, фактический результат.
Типичные ошибки и как их избежать
Большинство отказов связи между VLAN сводится к семи причинам. По каждой ниже есть симптом и решение.
- Маршрут только на одном устройстве. Симптом: односторонний ping, traceroute обрывается. Решение: добавить обратный static route.
- Неверная маска подсети. Симптом: часть адресов недоступна, трафик уходит не туда. Решение: сверить маску на интерфейсе и в маршрутах.
- Не включён ip routing на L3-коммутаторе. Симптом: SVI есть, но трафик между VLAN не ходит. Решение: выполнить ip routing.
- Native VLAN mismatch на trunk. Симптом: потеря management-трафика, коммутатор недоступен по сети. Решение: согласовать native VLAN на обоих концах.
- Шлюз на хосте указывает на физический порт коммутатора. Симптом: хост видит свою подсеть, но не выходит за её пределы. Решение: указать шлюзом SVI или sub-интерфейс.
- ACL блокирует трафик между VLAN. Симптом: ping не проходит только между конкретными подсетями. Решение: проверить show access-lists и правила firewall.
- Дублирование подсетей на разных интерфейсах. Симптом: часть трафика уходит не туда, нестабильная связь. Решение: сделать план адресации уникальным для каждого сегмента.
Симптом -> причина -> решение: таблица быстрой диагностики
| Симптом | Причина | Решение |
|---|---|---|
| ping не проходит в одну сторону | Нет обратного маршрута | Добавить static route на втором устройстве |
| SVI в состоянии down | VLAN не создан или порт не в этом VLAN | Создать VLAN, проверить access-порт |
| Хост не получает IP по DHCP | Нет DHCP relay через сегмент | Настроить ip helper-address на SVI |
| Трафик между VLAN не идёт | Не включён ip routing | Выполнить ip routing на L3-коммутаторе |
| Потерян доступ к управлению коммутатором | Native VLAN mismatch | Согласовать native VLAN на trunk |
DHCP в схеме с несколькими VLAN требует отдельного шага: сервер в одном сегменте не увидит широковещательные запросы из другого. На SVI или sub-интерфейсе нужен ip helper-address с адресом DHCP-сервера.
Что выбрать: «маршрутизатор на палочке» или L3-коммутатор
Обе схемы совместимы со статической маршрутизацией и дают одинаковый результат при небольшом числе сегментов. Разница в производительности, стоимости и точках отказа.
L3-коммутатор маршрутизирует между VLAN аппаратно и не ограничивает межсегментный трафик одним физическим линком. «Маршрутизатор на палочке» упирается в пропускную способность trunk-порта, зато работает на уже имеющемся оборудовании и проще в настройке для двух-трёх VLAN.
Сравнительная таблица топологий
| Критерий | «Маршрутизатор на палочке» | L3-коммутатор (SVI) |
|---|---|---|
| Пропускная способность | Ограничена одним trunk-линком, все VLAN делят его полосу | Аппаратная маршрутизация, каждый порт работает на своей скорости |
| Стоимость | Дешевле, если роутер уже есть | Выше, нужен коммутатор с поддержкой L3 |
| Масштабируемость | Падает при росте числа VLAN и трафика | Растёт вместе с числом портов и VLAN |
| Отказоустойчивость | Единая точка отказа: роутер и trunk-линк | Выше, при наличии резервных коммутаторов |
| Сложность настройки | Проще для 2-3 VLAN | Требует понимания SVI и ip routing |
| Типичный сценарий | Малый офис, до 3 VLAN, есть свободный роутер | Офис от 4 VLAN, рост межсегментного трафика |
Практическое правило выбора: до трёх VLAN и при ограниченном бюджете берите «маршрутизатор на палочке», от четырёх VLAN и при заметном трафике между сегментами - L3-коммутатор. Начинать стоит с плана адресации, затем поднять интерфейсы маршрутизации, прописать маршруты на всех устройствах и пройти чек-лист из десяти пунктов. Такой порядок исключает чёрные дыры ещё на этапе настройки.