Настройка статических маршрутов в Linux: полное практическое руководство | AdminWiki

Настройка статических маршрутов в Linux: полное практическое руководство

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

Зачем нужны статические маршруты и когда их использовать

Статический маршрут - это правило, вручную добавленное в таблицу маршрутизации ядра Linux. Оно указывает, через какой шлюз или интерфейс отправлять пакеты в конкретную сеть или на конкретный хост. В отличие от динамической маршрутизации, где маршрутизаторы обмениваются информацией через протоколы OSPF или BGP, статические маршруты не требуют дополнительного ПО и не создают служебного трафика.

Типичные сценарии, в которых статическая маршрутизация оправдана:

  • Доступ к изолированной подсети, не анонсируемой основным шлюзом. Например, сервер в дата-центре должен видеть подсеть офиса через VPN-туннель.
  • Настройка резервного шлюза с более высокой метрикой. Основной трафик идёт через быстрый канал, а при его отказе - через резервный.
  • Оптимизация трафика: часть подсетей направляется через выделенный канал, остальной трафик - через маршрут по умолчанию.
  • Временная маршрутизация на этапе миграции или отладки, когда поднимать динамический протокол нецелесообразно.

В небольших и средних сетях с предсказуемой топологией статические маршруты остаются простым и надёжным методом управления трафиком. Они прозрачны, легко аудируются и не зависят от стабильности работы демонов маршрутизации. Если вы настраиваете сегментацию сети или разделение трафика по нескольким провайдерам, начните с базовых принципов IP-маршрутизации - это сэкономит время на отладке.

Просмотр текущей таблицы маршрутизации

Перед любыми изменениями проверьте, какие маршруты уже активны. Основной инструмент - команда ip route show из пакета iproute2. Вывод для типичного сервера с одним интерфейсом выглядит так:

default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100

Первая строка - маршрут по умолчанию: все пакеты, для которых нет более точного совпадения, уходят на шлюз 192.168.1.1 через интерфейс eth0. Вторая строка - маршрут к локальной сети, созданный ядром автоматически при назначении IP-адреса. Поле proto kernel указывает на источник, scope link означает, что сеть доступна напрямую без шлюза.

Для детального анализа используйте флаг -d или фильтрацию. Команда ip route show 10.0.0.0/8 выведет только маршруты, попадающие в указанный префикс. Если нужна информация о конкретном пути, который пройдёт пакет до заданного адреса, применяйте ip route get 8.8.8.8 - она покажет выбранный шлюз, интерфейс и кэшированный маршрут.

Устаревшая утилита route -n также выводит таблицу, но её формат менее информативен и не поддерживает policy routing. Используйте её только на старых системах, где ip недоступен. Флаг -n отключает DNS-резолвинг, ускоряя вывод. Колонки: Destination, Gateway, Genmask, Flags, Metric, Iface. Запись с Destination 0.0.0.0 - маршрут по умолчанию.

Добавление статических маршрутов с помощью ip route

Команда ip route add добавляет запись в таблицу маршрутизации. Базовый синтаксис: ip route add <сеть/хост> via <шлюз> [dev <интерфейс>] [metric <число>]. Все маршруты, добавленные таким способом, действуют до перезагрузки сетевой службы или сервера. Для постоянной конфигурации потребуется сохранить их через механизмы дистрибутива - об этом в следующем разделе.

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

Самый частый случай: сервер должен получить доступ к удалённой подсети через промежуточный шлюз. Предположим, офисная сеть 192.168.10.0/24 находится за маршрутизатором с адресом 10.0.0.1. Сервер расположен в сети 10.0.0.0/24. Команда для добавления маршрута:

ip route add 192.168.10.0/24 via 10.0.0.1

После выполнения пакеты в сеть 192.168.10.0/24 пойдут через указанный шлюз. Если интерфейсов несколько и нужно явно задать исходящий, добавьте dev eth1. Параметр metric задаёт приоритет: чем меньше число, тем выше приоритет маршрута. При наличии нескольких путей до одной сети ядро выбирает маршрут с наименьшей метрикой.

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

Для точечной маршрутизации к одному узлу используется маска /32. Сценарий: критически важный сервер мониторинга 10.20.30.40 должен быть доступен через выделенный канал с интерфейсом eth2 и шлюзом 172.16.0.1. Команда:

ip route add 10.20.30.40/32 via 172.16.0.1 dev eth2

Такой маршрут имеет наивысшую точность совпадения и всегда приоритетнее маршрутов до сети. Проверьте результат через ip route get 10.20.30.40 - вывод покажет выбранный шлюз и интерфейс.

Настройка маршрута по умолчанию

Маршрут по умолчанию определяет шлюз для всего трафика, не совпавшего с другими записями. Добавление выполняется командой:

ip route add default via 192.168.1.254

Если маршрут по умолчанию уже существует, повторное добавление с тем же шлюзом вызовет ошибку RTNETLINK answers: File exists. Чтобы изменить шлюз, сначала удалите старый маршрут: ip route del default, затем добавьте новый. Будьте осторожны при удалённой работе: смена шлюза по умолчанию может мгновенно разорвать SSH-сессию. Всегда проверяйте альтернативный способ доступа к серверу - через консоль хостера или out-of-band management.

Использование устаревшей команды route

Утилита route из пакета net-tools считается устаревшей, но до сих пор встречается в легаси-скриптах и минималистичных окружениях. Синтаксис добавления маршрута до сети:

route add -net 192.168.10.0 netmask 255.255.255.0 gw 10.0.0.1

Для маршрута до хоста:

route add -host 10.20.30.40 gw 172.16.0.1

Маршрут по умолчанию:

route add default gw 192.168.1.254

Просмотр таблицы без DNS-резолвинга: route -n. Удаление маршрута: route del -net 192.168.10.0 netmask 255.255.255.0. Команда route не поддерживает policy routing, несколько таблиц маршрутизации и расширенные атрибуты. Во всех новых проектах используйте ip route. Если вы работаете с гетерогенной средой, где встречаются и Linux, и Windows, посмотрите шпаргалку по маршрутизации в Windows - принципы те же, синтаксис отличается.

Сохранение статических маршрутов после перезагрузки

Маршруты, добавленные через ip route add, теряются при перезагрузке или рестарте сетевой службы. Для постоянной конфигурации каждый дистрибутив предлагает свой механизм. Ниже - проверенные методы для трёх основных семейств.

Debian и Ubuntu: настройка через /etc/network/interfaces

Классический способ для систем с ifupdown. В файле /etc/network/interfaces добавьте директивы up в секцию интерфейса:

auto eth0
iface eth0 inet static
    address 10.0.0.100
    netmask 255.255.255.0
    gateway 10.0.0.1
    up ip route add 192.168.10.0/24 via 10.0.0.1
    up ip route add 10.20.30.40/32 via 172.16.0.1 dev eth2

Команды после up выполняются при поднятии интерфейса. Для сложных конфигураций создайте скрипт в /etc/network/if-up.d/ - он запустится автоматически при активации любого интерфейса. Не забудьте выставить права на выполнение: chmod +x /etc/network/if-up.d/static-routes.

Debian и Ubuntu: современный способ с Netplan

Начиная с Ubuntu 18.04, Netplan стал стандартным менеджером сетевых конфигураций. Файлы в формате YAML находятся в /etc/netplan/. Пример конфигурации с двумя статическими маршрутами:

network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 10.0.0.100/24
      routes:
        - to: 192.168.10.0/24
          via: 10.0.0.1
        - to: 10.20.30.40/32
          via: 172.16.0.1
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]

После редактирования примените конфигурацию: netplan apply. Для проверки синтаксиса перед применением используйте netplan try - изменения откатятся через 120 секунд, если вы не подтвердите их. Netplan генерирует бэкенд-конфигурацию для systemd-networkd или NetworkManager, поэтому маршруты сохраняются между перезагрузками. Подробнее о связке Netplan и systemd-networkd читайте в руководстве по настройке маршрутизации в Linux 2026.

CentOS и RHEL: настройка через файлы маршрутов

В дистрибутивах на базе RHEL конфигурация сети хранится в /etc/sysconfig/network-scripts/. Для каждого интерфейса можно создать файл маршрутов: route-<интерфейс>. Например, для eth0 создайте /etc/sysconfig/network-scripts/route-eth0:

192.168.10.0/24 via 10.0.0.1
10.20.30.40/32 via 172.16.0.1 dev eth2

Формат: одна запись на строку, синтаксис совпадает с аргументами ip route add. Для маршрута по умолчанию используйте файл /etc/sysconfig/network с параметром GATEWAY= или отдельный файл route-eth0 со строкой default via 192.168.1.254. После изменений перезапустите сеть: systemctl restart network или nmcli connection reload.

CentOS и RHEL: использование NetworkManager

NetworkManager через утилиту nmcli позволяет управлять маршрутами без правки файлов вручную. Просмотр текущих соединений: nmcli connection show. Добавление статического маршрута к существующему соединению:

nmcli connection modify eth0 +ipv4.routes "192.168.10.0/24 10.0.0.1"
nmcli connection up eth0

Параметр +ipv4.routes добавляет запись, не удаляя существующие. Для удаления конкретного маршрута используйте -ipv4.routes. Проверка сохранённых маршрутов: nmcli connection show eth0 | grep ipv4.routes. NetworkManager хранит конфигурацию в /etc/NetworkManager/system-connections/, и все изменения сохраняются после перезагрузки.

Практический пример: сегментация сети с помощью статических маршрутов

Рассмотрим типовую задачу: сервер выполняет роль шлюза между двумя изолированными подсетями. Интерфейс eth0 подключён к сети управления 10.0.1.0/24, интерфейс eth1 - к технологической сети 10.0.2.0/24. Задача: обеспечить доступ с любого хоста из сети управления к устройствам в технологической сети. IP-форвардинг на сервере уже включён (net.ipv4.ip_forward=1).

Шаг 1. Настройка адресов на сервере-шлюзе. Файл /etc/netplan/01-netcfg.yaml:

network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 10.0.1.1/24
    eth1:
      addresses:
        - 10.0.2.1/24

Шаг 2. На клиенте в сети управления (10.0.1.50) добавьте маршрут до технологической сети через сервер-шлюз:

ip route add 10.0.2.0/24 via 10.0.1.1

Шаг 3. На клиенте в технологической сети (10.0.2.100) добавьте обратный маршрут:

ip route add 10.0.1.0/24 via 10.0.2.1

Шаг 4. Проверка связности с клиента 10.0.1.50:

ping 10.0.2.100
ip route get 10.0.2.100

Вывод ip route get покажет, что пакет уходит через шлюз 10.0.1.1. Если ping не проходит, проверьте цепочку: не блокирует ли трафик локальный файрвол (iptables -L -n -v), включён ли форвардинг на шлюзе, корректны ли обратные маршруты на целевом хосте. Для постоянной конфигурации на клиентах используйте методы сохранения из предыдущего раздела. Этот же подход масштабируется на сценарии с несколькими провайдерами - детали разобраны в статье по настройке статической маршрутизации с ip route.

Типичные ошибки и их устранение

«Network is unreachable». Причина: шлюз, указанный в маршруте, недоступен с данного сервера. Ядро не может отправить пакет, потому что не знает, как достичь самого шлюза. Решение: проверьте, что шлюз находится в одной из directly connected сетей сервера. Команда ip route show покажет все локальные подсети. Если шлюз должен быть доступен через другой маршрут, сначала добавьте маршрут до сети шлюза.

«RTNETLINK answers: File exists». Маршрут с такими же параметрами уже существует. Проверьте текущую таблицу: ip route show <префикс>. Если нужно изменить шлюз, сначала удалите старую запись: ip route del <префикс>. Для замены маршрута по умолчанию используйте ip route replace default via <новый шлюз> - это атомарная операция, которая не оставляет систему без шлюза.

Неверный шлюз или интерфейс. Опечатка в IP-адресе шлюза или указание интерфейса, который не поднят. Симптом: пакеты уходят, но ответы не возвращаются. Диагностика: ip route get <целевой адрес> покажет выбранный путь. tcpdump -i <интерфейс> -n icmp поможет увидеть, уходят ли пакеты и приходят ли ответы.

Конфликт метрик. Два маршрута до одной сети с одинаковой метрикой приводят к непредсказуемому поведению: ядро может балансировать трафик между ними или выбрать неоптимальный путь. Назначайте метрики явно: ip route add 10.0.0.0/8 via 192.168.1.1 metric 100. Маршрут с меньшей метрикой приоритетнее.

Маршрут добавлен, но трафик идёт не туда. Проверьте порядок просмотра таблиц маршрутизации: ip rule show. Если настроен policy routing, пакет может попасть в альтернативную таблицу, где действуют другие правила. Для отладки используйте ip route get <адрес> from <исходный IP> iif <входящий интерфейс> - это симулирует маршрутизацию для конкретного пакета с учётом всех правил.

Заключение: лучшие практики и дальнейшие шаги

Статические маршруты - фундаментальный инструмент управления трафиком в Linux. Три правила, которые сэкономят вам часы отладки: всегда проверяйте таблицу маршрутизации до и после изменений командой ip route show, сохраняйте конфигурацию через штатные механизмы дистрибутива, используйте ip route get для проверки реального пути пакета.

Для небольших сетей статических маршрутов достаточно. Когда топология усложняется, количество подсетей растёт, а требования к отказоустойчивости повышаются, переходите к динамической маршрутизации. Протоколы OSPF и BGP автоматически адаптируются к изменениям топологии и снижают риск ошибок ручного конфигурирования. Начните с руководства по принципам маршрутизации IP-пакетов - там разобраны алгоритмы выбора пути и практическая настройка на реальном оборудовании.

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

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