Настройка Linux-сервера как маршрутизатора между сетями: пошаговое руководство | AdminWiki

Настройка Linux-сервера как маршрутизатора между сетями: пошаговое руководство

07 сентября 2026 11 мин. чтения

Что такое Linux-маршрутизатор и когда он нужен

Linux-сервер можно превратить в маршрутизатор между двумя или несколькими сетями. Для этого нужно назначить IP-адреса сетевым интерфейсам, включить IP forwarding, добавить маршруты на узлах сети и разрешить транзитный трафик в firewall. Для выхода внутренней сети в интернет потребуется правило NAT.

Минимальная рабочая схема использует сервер с двумя интерфейсами: eth0 подключен к внешней сети 192.168.1.0/24, а eth1 обслуживает внутреннюю сеть 192.168.2.0/24. На сервере достаточно назначить адреса 192.168.1.2/24 и 192.168.2.1/24, включить net.ipv4.ip_forward=1 и настроить правила пересылки.

Внешняя сеть 192.168.1.0/24
        |
   eth0: 192.168.1.2
   Linux-сервер
   eth1: 192.168.2.1
        |
Внутренняя сеть 192.168.2.0/24

Клиенты внутренней сети используют 192.168.2.1 как шлюз. Для двустороннего обмена внешней сети нужен обратный маршрут через 192.168.1.2 либо маршрут по умолчанию, указывающий на этот адрес.

  • Linux-маршрутизатор подходит для лабораторных стендов, небольших офисов, VPN-шлюзов и изолированных сегментов.
  • Сервер должен иметь два физических интерфейса, VLAN-интерфейсы или другое сетевое подключение к каждому сегменту.
  • Каждая сеть должна использовать собственную подсеть. Два интерфейса с адресами из одной подсети обычно указывают на ошибку проектирования.
  • Аппаратный маршрутизатор проще запустить, а Linux дает больше контроля над firewall, NAT, журналированием и дополнительными сервисами.

Для временного стенда можно использовать VDS или VPS с доступом к двум сетям. При выборе облачной инфраструктуры проверьте поддержку приватной сети и второго интерфейса, например в Timeweb Cloud.

Подготовка системы: включаем IP forwarding

Ядро Linux по умолчанию принимает пакеты для самого сервера, но не пересылает их между интерфейсами. Параметр net.ipv4.ip_forward меняет это поведение. Пока его значение равно 0, маршруты и правила firewall сами по себе не обеспечат связь между сетями.

Временное включение через sysctl

Такой способ удобен для проверки схемы. Настройка действует до перезагрузки:

sudo sysctl -w net.ipv4.ip_forward=1
sysctl net.ipv4.ip_forward

В рабочем выводе второй команды должно быть значение net.ipv4.ip_forward = 1. Проверить параметр можно и напрямую:

cat /proc/sys/net/ipv4/ip_forward

Постоянное включение после перезагрузки

Создайте отдельный файл sysctl, чтобы настройка не затерялась при обновлении основного файла:

sudoedit /etc/sysctl.d/99-router.conf
net.ipv4.ip_forward = 1

Примените параметры без перезагрузки:

sudo sysctl --system
sysctl net.ipv4.ip_forward

Допустим и вариант с /etc/sysctl.conf: добавьте туда строку net.ipv4.ip_forward=1 и выполните sudo sysctl -p. Для IPv6 используется отдельный параметр:

sudo sysctl -w net.ipv6.conf.all.forwarding=1

IPv6 forwarding требует отдельной проверки правил nftables и маршрутов. Если внешний IPv6-шлюз должен раздаваться через Router Advertisement, проверьте значение net.ipv6.conf.eth0.accept_ra: при включенном forwarding автоматическое принятие объявлений может быть отключено.

Настройка сетевых интерфейсов

Сначала определите реальные имена интерфейсов. В современных системах они часто выглядят как ens18 или enp1s0, поэтому нельзя без проверки подставлять eth0 и eth1.

ip -br link
ip -br addr

В примерах ниже используются имена eth0 и eth1. Замените их на значения из вывода команды.

Временная настройка с помощью ip

Назначьте адреса интерфейсам и поднимите их:

sudo ip addr add 192.168.1.2/24 dev eth0
sudo ip addr add 192.168.2.1/24 dev eth1
sudo ip link set eth0 up
sudo ip link set eth1 up

Если eth0 подключен к сети с upstream-шлюзом 192.168.1.1, задайте маршрут по умолчанию:

sudo ip route replace default via 192.168.1.1 dev eth0

Команда изменяет таблицу маршрутизации сразу, но не сохраняет адреса после перезагрузки. Перед заменой default route проверьте доступ к серверу через консоль или out-of-band управление, иначе можно потерять SSH-сессию.

Маска /24 соответствует 255.255.255.0 и дает 254 обычных адреса в каждой подсети. Адрес маршрутизатора не должен совпадать с адресом клиента, шлюза или другого устройства.

Постоянная настройка через конфигурационные файлы

В Ubuntu с Netplan базовая конфигурация может выглядеть так:

network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 192.168.1.2/24
      routes:
        - to: default
          via: 192.168.1.1
    eth1:
      addresses:
        - 192.168.2.1/24

Сохраните YAML в файле из каталога /etc/netplan/, затем проверьте и примените конфигурацию:

sudo netplan try
sudo netplan apply

Команда netplan try полезна при удаленной работе: конфигурация подтверждается отдельно и может быть автоматически отменена при потере доступа. Подробная схема для Debian и Ubuntu с Netplan, systemd-networkd, NAT и nftables приведена в статье о создании маршрутизатора на Debian и Ubuntu.

При использовании ifupdown добавьте настройки в /etc/network/interfaces:

auto eth0
iface eth0 inet static
    address 192.168.1.2
    netmask 255.255.255.0
    gateway 192.168.1.1

auto eth1
iface eth1 inet static
    address 192.168.2.1
    netmask 255.255.255.0

Выберите один менеджер сети для конкретного интерфейса. Одновременное управление NetworkManager, Netplan, ifupdown и systemd-networkd может приводить к смене адресов и маршрутов после перезапуска службы.

Проверьте соседний шлюз и устройство во внутренней сети:

ip -br addr
ip route show
ping -c 3 192.168.1.1
ping -c 3 192.168.2.10

Если шлюз не отвечает, проверьте кабель, VLAN, состояние порта, маску и ARP. К маршрутизации между подсетями переходите после того, как каждый интерфейс видит свой сегмент.

Добавление статических маршрутов

Linux автоматически создает маршруты для подсетей, которые назначены непосредственно интерфейсам. В описанной схеме в таблице появятся маршруты к 192.168.1.0/24 через eth0 и к 192.168.2.0/24 через eth1.

Статическая запись нужна, когда целевая сеть находится за другим маршрутизатором. Например, сеть 10.20.0.0/24 доступна через шлюз 192.168.1.1 в направлении eth0.

Временное добавление маршрутов

Добавьте маршрут командой ip route add:

sudo ip route add 10.20.0.0/24 via 192.168.1.1 dev eth0

При повторном запуске сценария удобнее использовать replace, чтобы команда не завершалась ошибкой из-за существующей записи:

sudo ip route replace 10.20.0.0/24 via 192.168.1.1 dev eth0

Шлюз 192.168.1.1 должен быть доступен непосредственно через eth0. Проверка конкретного решения ядра выполняется так:

ip route get 10.20.0.15

Постоянные маршруты

В Netplan маршрут к удаленной сети добавляется в секцию нужного интерфейса:

network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 192.168.1.2/24
      routes:
        - to: default
          via: 192.168.1.1
        - to: 10.20.0.0/24
          via: 192.168.1.1
    eth1:
      addresses:
        - 192.168.2.1/24

В конфигурации ifupdown можно применить маршрут после поднятия интерфейса:

auto eth0
iface eth0 inet static
    address 192.168.1.2
    netmask 255.255.255.0
    gateway 192.168.1.1
    post-up ip route add 10.20.0.0/24 via 192.168.1.1 dev eth0
    pre-down ip route del 10.20.0.0/24 via 192.168.1.1 dev eth0

Для обычного обмена между двумя непосредственно подключенными сетями отдельный маршрут на самом сервере не нужен. Обратные маршруты понадобятся на соседних маршрутизаторах и клиентах. Например, хост из сети 192.168.1.0/24 может получить маршрут так:

sudo ip route add 192.168.2.0/24 via 192.168.1.2

На хосте из сети 192.168.2.0/24 обратный путь выглядит так:

sudo ip route add 192.168.1.0/24 via 192.168.2.1

Команды и варианты таблиц маршрутизации собраны в шпаргалке по ip route, iptables и policy routing.

Настройка межсетевого экрана для контроля трафика

Даже при включенном forwarding пакет может быть отброшен цепочкой forward. Для маршрутизатора нужно явно разрешить нужные направления, пропустить ответы на уже установленные соединения и оставить запрет для остальных пакетов.

Базовые правила nftables для маршрутизатора

Пример ниже разрешает внутренней сети выход через eth0, сохраняет ответы по conntrack и допускает обмен с сетью на eth0. Правило для SSH ограничивает управление адресами внешней подсети, его нужно заменить на вашу management-сеть.

table inet router_filter {
    chain input {
        type filter hook input priority filter; policy drop;
        iifname "lo" accept
        ct state established,related accept
        ip protocol icmp accept
        ip saddr 192.168.1.0/24 tcp dport 22 accept
    }

    chain forward {
        type filter hook forward priority filter; policy drop;
        ct state established,related accept
        iifname "eth1" oifname "eth0" ip saddr 192.168.2.0/24 accept
        iifname "eth0" oifname "eth1" ip daddr 192.168.2.0/24 accept
    }

    chain output {
        type filter hook output priority filter; policy accept;
    }
}

table ip router_nat {
    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
        oifname "eth0" ip saddr 192.168.2.0/24 masquerade
    }
}

Сохраните правила в /etc/nftables.conf, проверьте синтаксис и загрузите их:

sudo nft -c -f /etc/nftables.conf
sudo nft -f /etc/nftables.conf
sudo systemctl enable --now nftables

Если внутренняя сеть должна только выходить наружу, входящее правило eth0 -> eth1 лучше удалить или ограничить конкретными адресами и портами. Для чистой маршрутизации между двумя доверенными сетями оставьте оба направления, но задайте минимальный набор разрешенных протоколов.

Настройка NAT для доступа в интернет

Правило masquerade подменяет исходный адрес клиента на адрес внешнего интерфейса. Ответ интернет-шлюза возвращается Linux-серверу, а conntrack сопоставляет его с внутренним соединением.

NAT нужен, когда upstream-маршрутизатор не знает маршрут к 192.168.2.0/24. Для обычной маршрутизации между корпоративными подсетями NAT часто вреден: он скрывает исходный адрес и усложняет ACL, аудит и диагностику. В таком случае добавьте обратный маршрут на upstream-шлюзе.

В системах, где применяется iptables, аналогичные временные правила выглядят так:

sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -s 192.168.2.0/24 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j MASQUERADE

Не смешивайте независимые наборы nftables и iptables без понимания того, где именно они подключены к сетевому стеку. После изменения правил проверьте счетчики:

sudo nft list ruleset
sudo iptables -L FORWARD -n -v
sudo iptables -t nat -L POSTROUTING -n -v

Проверка маршрутизации и прохождения пакетов

Проверяйте путь поэтапно: сначала адрес интерфейса, затем соседний шлюз, потом адрес маршрутизатора во второй сети и только после этого удаленный сервис. Такая последовательность отделяет проблему канального уровня от ошибки маршрутизации и firewall.

Диагностика с помощью ping и traceroute

На Linux-сервере выполните базовые проверки:

ip addr show dev eth0
ip addr show dev eth1
ip route show
ip route get 192.168.2.10
ping -c 3 192.168.1.1
ping -c 3 192.168.2.10

С клиента во внешней сети проверьте адрес 192.168.2.10, а с клиента во внутренней сети, адрес 192.168.1.50. Для трассировки используйте:

traceroute -n 192.168.2.10
traceroute -n 192.168.1.50

Первым переходом для внутреннего клиента должен быть 192.168.2.1. Если трассировка останавливается на первом переходе, проверьте шлюз клиента, forwarding и цепочку forward. Если запрос доходит до удаленной сети, но ответ не возвращается, ищите обратный маршрут или настройку NAT.

Анализ трафика с tcpdump

Запустите захват на внутреннем интерфейсе и создайте ping с клиента:

sudo tcpdump -ni eth1 'host 192.168.2.10'
sudo tcpdump -ni eth0 'host 192.168.2.10'

Запрос должен появиться на eth1, затем на eth0. Ответ должен пройти в обратном направлении. Интерпретация результатов:

  • Пакетов нет на eth1, проблема находится у клиента, в VLAN, ARP или подключении.
  • Пакеты есть на eth1, но нет на eth0, проверьте IP forwarding и правила forward.
  • Запрос виден на eth0, но ответа нет, проверьте маршрут на удаленном шлюзе и наличие обратного пути.
  • Ответ приходит на eth0, но не выходит через eth1, проверьте conntrack, firewall и адрес назначения.

Полный порядок проверки с командами ip addr, ip route, ping, traceroute, ss, tcpdump и nft приведен в руководстве по диагностике Linux-маршрутизатора.

Сохранение конфигурации после перезагрузки

Для стабильной работы после reboot нужно сохранить четыре группы настроек: IP forwarding, адреса интерфейсов, маршруты и firewall. Временные команды ip addr, ip route и sysctl -w сами по себе после перезагрузки исчезают.

  1. Параметр forwarding храните в /etc/sysctl.d/99-router.conf и применяйте через sudo sysctl --system.
  2. Адреса интерфейсов и default route сохраняйте в Netplan, ifupdown или systemd-networkd.
  3. Удаленные маршруты описывайте в том же сетевом менеджере, который поднимает интерфейс.
  4. Правила nftables храните в /etc/nftables.conf и включите службу nftables при загрузке.

Минимальный файл systemd-networkd для внутреннего интерфейса /etc/systemd/network/20-eth1.network:

[Match]
Name=eth1

[Network]
Address=192.168.2.1/24

Для внешнего интерфейса добавьте отдельный файл:

[Match]
Name=eth0

[Network]
Address=192.168.1.2/24

[Route]
Destination=0.0.0.0/0
Gateway=192.168.1.1

systemd-networkd не следует запускать одновременно с другим менеджером, который управляет теми же интерфейсами. После выбора схемы управления включите нужную службу и проверьте ее состояние:

sudo systemctl enable --now systemd-networkd
systemctl status systemd-networkd --no-pager

Перед перезагрузкой сохраните доступ к консоли. После sudo reboot проверьте конфигурацию теми же командами:

sysctl net.ipv4.ip_forward
ip -br addr
ip route show
sudo nft list ruleset
ping -c 3 192.168.2.10

Типичные ошибки и их решение

СимптомПричинаПроверка и исправление
Пакеты не проходят между интерфейсамиnet.ipv4.ip_forward равен 0Выполните sysctl net.ipv4.ip_forward, затем включите forwarding и проверьте повторно.
Сервер видит только одну сетьИнтерфейс выключен, адрес назначен не тому устройству или неверна VLANСверьте ip -br link, ip -br addr, состояние коммутаторного порта и тегирование.
Связь работает в одну сторонуНа удаленном сегменте нет обратного маршрутаДобавьте маршрут к исходной подсети через адрес Linux-сервера или настройте NAT для интернет-доступа.
Хосты считают адреса локальнымиОдинаковые или слишком широкие маски подсетиУбедитесь, что сети используют разные диапазоны, например 192.168.1.0/24 и 192.168.2.0/24.
Интернет из LAN недоступенНет default route, NAT или разрешения в цепочке forwardПроверьте ip route, счетчики nft и правило masquerade.
После перезагрузки настройки пропалиИспользовались только временные командыСохраните параметры в sysctl и конфигурации выбранного сетевого менеджера, затем протестируйте reboot.
SSH-сессия оборвалась после изменения маршрутаИзменен default route или удален разрешающий firewall ruleВосстановите доступ через консоль, проверьте маршрут до management-сети и разрешите SSH только из доверенного сегмента.
Адрес периодически конфликтуетОдинаковый IP назначен двум устройствамПроверьте адрес командой sudo arping -D -I eth1 192.168.2.1 и найдите дубликат по MAC-адресу.

При сложной схеме с несколькими провайдерами, VLAN или VPN одной таблицы main может быть недостаточно. Тогда пригодятся отдельные таблицы маршрутизации, ip rule, контроль MTU и маркировка пакетов.

Заключение: ваш Linux-маршрутизатор готов

Рабочая конфигурация строится в таком порядке: подключите и адресуйте интерфейсы, включите net.ipv4.ip_forward=1, проверьте таблицу маршрутизации, добавьте обратные маршруты, разрешите транзит в nftables и включите NAT только при необходимости. После этого проверьте путь через ping, traceroute и tcpdump.

Для продакшен-среды зафиксируйте конфигурацию в sysctl и сетевом менеджере, ограничьте правила firewall по адресам и портам, сохраните доступ к консоли и выполните проверку после перезагрузки. Следующими шагами могут стать динамическая маршрутизация, VLAN 802.1Q, policy routing, VPN-туннели и более точные правила фильтрации.

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