Настройка маршрутизации между VLAN на Linux: Router on a Stick с iptables | AdminWiki

Настройка маршрутизации между VLAN на Linux: Router on a Stick с iptables

28 июля 2026 10 мин. чтения

Маршрутизация между 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.

Поделиться:
Сохранить гайд? В закладки браузера