Маршрутизация между VLAN на Linux-сервере через саб-интерфейсы - это проверенный способ связать изолированные сегменты сети без покупки дорогого L3-коммутатора. Один физический порт сервера принимает тегированный трафик 802.1Q, а операционная система создает виртуальные интерфейсы для каждого VLAN. В этом руководстве вы получите готовую, проверенную конфигурацию на 2026 год: от создания саб-интерфейсов до настройки iptables для межсегментного экранирования.
Схема Router on a Stick решает конкретную задачу: нужно разграничить трафик бухгалтерии, отдела разработки и гостевого Wi-Fi, а бюджет на железо ограничен. Linux-сервер с двумя-четырьмя ядрами справляется с гигабитными потоками, попутно фильтруя пакеты на уровне ядра. Все инструкции проверены на Debian 12 и Ubuntu 24.04 LTS, актуальны для ядер 6.x и включают современные методы настройки через iproute2 и systemd-networkd.
Что такое Router on a Stick и когда его применять
Router on a Stick - архитектура, при которой один физический интерфейс маршрутизатора обслуживает несколько VLAN. Коммутатор отправляет на этот порт кадры с тегами 802.1Q, а маршрутизатор создает виртуальные саб-интерфейсы, по одному на каждый VLAN. Каждый саб-интерфейс получает IP-адрес из своей подсети и выступает шлюзом по умолчанию для хостов этого VLAN.
Когда этот подход оправдан:
- В сети до 100-150 хостов с суммарным межузловым трафиком до 1 Гбит/с. Процессор сервера обрабатывает пакетную пересылку, и при превышении нагрузки начинается рост задержек.
- Требуется гибкая фильтрация трафика между сегментами. iptables на Linux дает контроль над каждым пакетом: запретить SSH из гостевого VLAN, разрешить только HTTP/HTTPS к серверам приложений, логировать подозрительную активность.
- Бюджет не позволяет приобрести L3-коммутатор с поддержкой межвлановой маршрутизации на скорости портов. Сервер с Linux выполняет ту же функцию, добавляя возможности файрвола.
L3-коммутатор выигрывает в сценариях с высокими требованиями к пропускной способности. Он выполняет маршрутизацию на аппаратном уровне (ASIC), обеспечивая линейную скорость на всех портах. Но когда нужна глубокая инспекция пакетов или гибкие политики доступа, Linux-сервер становится предпочтительным выбором. Подробное сравнение аппаратной и программной маршрутизации с примерами конфигураций для обоих подходов вы найдете в руководстве по маршрутизации между VLAN на Linux и L3-коммутаторах.
Подготовка сервера: установка пакетов и настройка VLAN-интерфейсов
На чистом Debian 12 или Ubuntu 24.04 LTS установите необходимые пакеты. Для работы с VLAN на уровне ядра и утилит требуется пакет vlan, для мостов - bridge-utils. В современных дистрибутивах модуль ядра 8021q уже включен, но явная установка не помешает.
apt update && apt install vlan bridge-utils iptables-persistent -y
modprobe 8021q
Проверьте загрузку модуля:
lsmod | grep 8021q
Вывод должен содержать строку с 8021q. Модуль загружен, ядро готово обрабатывать тегированные кадры.
Создание VLAN-интерфейсов с помощью iproute2
Утилита ip из пакета iproute2 - стандартный инструмент управления сетевыми интерфейсами в Linux с 2020-х годов. Устаревший vconfig остается в репозиториях, но использовать его не рекомендуется: он не поддерживает часть современных возможностей ядра и не интегрируется с systemd-networkd.
Создайте саб-интерфейс для VLAN 10 на физическом интерфейсе eth0:
ip link add link eth0 name eth0.10 type vlan id 10
ip addr add 192.168.10.1/24 dev eth0.10
ip link set eth0.10 up
Разбор команд:
ip link add link eth0 name eth0.10 type vlan id 10- создает виртуальный интерфейс eth0.10, привязанный к физическому eth0, с VLAN ID 10. Ядро будет принимать кадры с тегом 10 и передавать их этому интерфейсу.ip addr add 192.168.10.1/24 dev eth0.10- назначает IP-адрес шлюза для подсети VLAN 10.ip link set eth0.10 up- поднимает интерфейс.
Повторите для остальных VLAN. Для VLAN 20:
ip link add link eth0 name eth0.20 type vlan id 20
ip addr add 192.168.20.1/24 dev eth0.20
ip link set eth0.20 up
Проверьте созданные VLAN-интерфейсы:
cat /proc/net/vlan/config
Вывод покажет таблицу с VLAN ID, именем интерфейса и родительским устройством. Дополнительно убедитесь, что интерфейсы подняты и имеют IP:
ip -br addr show eth0.10
ip -br addr show eth0.20
Настройка сетевых мостов для VLAN (опционально)
Мост объединяет VLAN-интерфейс с виртуальными интерфейсами виртуальных машин или контейнеров. Этот сценарий типичен для KVM, LXC или Proxmox VE, где гость должен находиться в конкретном VLAN, а хост выполняет маршрутизацию. Подробнее о маршрутизации в средах виртуализации рассказано в гайде по настройке vSwitch и Linux Bridge в VMware, Proxmox и KVM.
Создайте мост br10 и добавьте в него VLAN-интерфейс:
brctl addbr br10
brctl addif br10 eth0.10
ip link set br10 up
Теперь назначьте IP-адрес на мост, а не на VLAN-интерфейс:
ip addr add 192.168.10.1/24 dev br10
При запуске виртуальной машины ее виртуальный сетевой интерфейс (tap) добавляется в этот же мост. Гость получает адрес из подсети 192.168.10.0/24 и использует 192.168.10.1 как шлюз. Хост маршрутизирует трафик между мостами разных VLAN.
Проверьте конфигурацию моста:
brctl show br10
Включение IP-маршрутизации и базовая проверка связности
Ядро Linux по умолчанию не пересылает пакеты между интерфейсами. Включите IP-форвардинг:
sysctl -w net.ipv4.ip_forward=1
Для сохранения после перезагрузки добавьте строку в /etc/sysctl.conf или создайте отдельный файл в /etc/sysctl.d/:
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.d/99-vlan-routing.conf
sysctl -p /etc/sysctl.d/99-vlan-routing.conf
Проверьте текущее состояние:
sysctl net.ipv4.ip_forward
Вывод должен быть net.ipv4.ip_forward = 1.
Теперь настройте хосты в VLAN. Для теста возьмите две машины: одна в VLAN 10 с адресом 192.168.10.10, вторая в VLAN 20 с адресом 192.168.20.10. На каждой пропишите шлюз по умолчанию - IP саб-интерфейса сервера в ее VLAN. На коммутаторе порт, к которому подключен сервер, должен быть настроен как транк (trunk) с разрешенными VLAN 10 и 20. Порты клиентов - как доступ (access) в соответствующих VLAN.
С хоста 192.168.10.10 выполните ping на 192.168.20.10. Если маршрутизация работает, пакеты проходят. Если нет - переходите к разделу диагностики.
Проверьте таблицу маршрутизации на сервере:
ip route
Вы должны увидеть записи для 192.168.10.0/24 dev eth0.10 и 192.168.20.0/24 dev eth0.20. Ядро автоматически добавляет маршруты к напрямую подключенным сетям при назначении IP-адреса на интерфейс.
Настройка iptables для межсетевого экранирования между VLAN
Смысл разделения на VLAN - изоляция. Маршрутизация без фильтрации сводит эту изоляцию на нет. iptables позволяет точно определить, какой трафик и между какими сегментами разрешен. Политика по умолчанию для цепочки FORWARD - DROP. Весь транзитный трафик запрещен, разрешения добавляются явно.
Базовая политика: запрет всего, кроме явно разрешенного
Установите политику по умолчанию и разрешите уже установленные соединения:
iptables -P FORWARD DROP
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Модуль conntrack отслеживает состояние соединений. Правило ESTABLISHED,RELATED пропускает ответные пакеты уже разрешенных сессий. Без него пришлось бы открывать порты в обе стороны для каждого протокола.
Разрешите трафик внутри одного VLAN, если он проходит через сервер (например, при использовании мостов):
iptables -A FORWARD -i eth0.10 -o eth0.10 -j ACCEPT
iptables -A FORWARD -i eth0.20 -o eth0.20 -j ACCEPT
Примеры правил для типовых сценариев
Разрешить ICMP (ping) между VLAN 10 и VLAN 20 - полезно для диагностики:
iptables -A FORWARD -i eth0.10 -o eth0.20 -p icmp -j ACCEPT
iptables -A FORWARD -i eth0.20 -o eth0.10 -p icmp -j ACCEPT
Разрешить хостам из VLAN 10 обращаться к веб-серверу в VLAN 20 по HTTP и HTTPS:
iptables -A FORWARD -i eth0.10 -o eth0.20 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0.10 -o eth0.20 -p tcp --dport 443 -j ACCEPT
Разрешить DNS-запросы из VLAN 10 к серверу DNS в VLAN 20:
iptables -A FORWARD -i eth0.10 -o eth0.20 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth0.10 -o eth0.20 -p tcp --dport 53 -j ACCEPT
Запретить доступ к SSH (порт 22) из гостевого VLAN 30 в любой другой VLAN. Гостевой VLAN должен иметь доступ только в интернет, но не к внутренним ресурсам:
iptables -A FORWARD -i eth0.30 -o eth0.10 -p tcp --dport 22 -j DROP
iptables -A FORWARD -i eth0.30 -o eth0.20 -p tcp --dport 22 -j DROP
Сохраните правила, чтобы они пережили перезагрузку:
iptables-save > /etc/iptables/rules.v4
Пакет iptables-persistent, установленный ранее, автоматически подхватит этот файл при загрузке.
Для более сложных политик маршрутизации, включая NAT и защиту от DDoS, обратитесь к руководству по настройке политик маршрутизации в iptables, nftables и firewalld. Там разобраны сценарии с SNAT/DNAT и многоканальной балансировкой.
Диагностика и решение типичных проблем
Пакеты не ходят между VLAN. Причина в 90% случаев - одна из четырех: не включен форвардинг, не поднят VLAN-интерфейс, неверный VLAN ID на коммутаторе, iptables роняет пакеты. Методичная проверка по шагам экономит часы.
Использование tcpdump для анализа VLAN-трафика
tcpdump показывает, доходят ли тегированные кадры до физического интерфейса сервера. Запустите захват на eth0 с фильтром по VLAN:
tcpdump -i eth0 -e vlan
Ключ -e выводит заголовки канального уровня, включая VLAN-теги. Вы увидите строки вида:
12:34:56.789012 00:11:22:33:44:55 > 00:aa:bb:cc:dd:ee, ethertype 802.1Q (0x8100), length 64: vlan 10, p 0, ethertype IPv4, 192.168.10.10 > 192.168.20.10: ICMP echo request
Если кадры с тегами приходят, проблема на стороне сервера (интерфейс, маршрутизация, iptables). Если нет - проверяйте конфигурацию коммутатора: порт должен быть в режиме trunk, нужные VLAN должны быть разрешены (allowed vlan).
Для фильтрации по конкретному VLAN ID используйте выражение:
tcpdump -i eth0 -e 'vlan 10'
Проверка правил iptables и логирование
Просмотрите текущие правила и счетчики срабатываний:
iptables -L FORWARD -v -n
Ключ -v показывает счетчики пакетов и байт для каждого правила. Если счетчик нужного правила не растет при тестовом ping, пакеты либо не доходят до цепочки FORWARD, либо попадают под другое правило.
Добавьте логирующее правило в конец цепочки FORWARD, чтобы видеть все пакеты, которые не попали под разрешающие правила:
iptables -A FORWARD -j LOG --log-prefix 'VLAN-FWD-DROP: ' --log-level 4
Просмотр логов в реальном времени:
tail -f /var/log/syslog | grep VLAN-FWD-DROP
Лог покажет IP-адреса источника и назначения, порты, интерфейсы. Это прямой ответ на вопрос, что именно блокируется.
Частые ошибки:
- Не включен IP-форвардинг. Проверьте
sysctl net.ipv4.ip_forward. - VLAN-интерфейс не поднят.
ip link show eth0.10должен выводить state UP. - Неверный VLAN ID. На коммутаторе порт в access VLAN 10, а на сервере создан интерфейс для VLAN 20. Сверьте конфигурации.
- На хосте не прописан шлюз по умолчанию или прописан неверный IP саб-интерфейса сервера.
- iptables в цепочке FORWARD имеет политику DROP без разрешающих правил для нужного трафика.
Автоматизация и сохранение конфигурации после перезагрузки
Команды ip link и ip addr, выполненные вручную, исчезают после перезагрузки. Для production-среды конфигурация должна быть персистентной. Современный способ - systemd-networkd, который входит в базовую поставку systemd и не требует дополнительных пакетов.
Настройка VLAN через systemd-networkd
Создайте два файла для каждого VLAN: .netdev (описание виртуального устройства) и .network (сетевая конфигурация). Файлы размещаются в /etc/systemd/network/.
Файл /etc/systemd/network/10-vlan10.netdev:
[NetDev]
Name=eth0.10
Kind=vlan
[VLAN]
Id=10
Файл /etc/systemd/network/10-vlan10.network:
[Match]
Name=eth0.10
[Network]
Address=192.168.10.1/24
Аналогично для VLAN 20: создайте 10-vlan20.netdev с Id=20 и 10-vlan20.network с Address=192.168.20.1/24.
Включите и запустите systemd-networkd:
systemctl enable systemd-networkd
systemctl start systemd-networkd
Проверьте статус:
networkctl status eth0.10
Вывод покажет состояние интерфейса, IP-адрес и родительское устройство.
Альтернативные методы - настройка через /etc/network/interfaces (Debian/Ubuntu) или Netplan (Ubuntu 18.04+). systemd-networkd предпочтительнее: он унифицирован для всех дистрибутивов с systemd, конфигурация декларативна и легко версионируется в Git. Для хранения применяйте облачные серверы Timeweb Cloud с автоматическим бэкапом конфигураций.
Правила iptables сохраняются пакетом iptables-persistent. После редактирования правил выполните:
iptables-save > /etc/iptables/rules.v4
При загрузке сервис netfilter-persistent восстановит правила из этого файла.
Полученная конфигурация - законченное решение для малого офиса или лабораторной среды. Один физический сервер выполняет маршрутизацию между VLAN и фильтрацию трафика, не требуя дорогостоящего L3-оборудования. При росте нагрузки схема масштабируется добавлением второго сервера и протокола VRRP для отказоустойчивости шлюза. Для тех, кто строит инфраструктуру на базе TrueNAS, будет полезно руководство по настройке маршрутизации между VLAN в TrueNAS Scale.