Маршрутизация Linux определяет, через какой сетевой интерфейс и шлюз отправлять пакеты. Современный инструмент — команда ip из пакета iproute2.
Основные команды ip
# Показать все IP-адреса
ip addr show
ip a # краткая форма
# Показать таблицу маршрутизации
ip route show
ip r # краткая форма
# Показать маршрут до конкретного хоста
ip route get 8.8.8.8
# ARP-таблица (соответствие IP → MAC)
ip neigh show
Временные изменения (до перезагрузки)
# Добавить IP-адрес на интерфейс
sudo ip addr add 192.168.1.100/24 dev eth0
# Удалить IP-адрес
sudo ip addr del 192.168.1.100/24 dev eth0
# Добавить маршрут через конкретный шлюз
sudo ip route add 10.0.0.0/8 via 192.168.1.1
# Добавить дефолтный шлюз
sudo ip route add default via 192.168.1.1
# Удалить маршрут
sudo ip route del 10.0.0.0/8
# Включить/выключить интерфейс
sudo ip link set eth0 up
sudo ip link set eth0 down
Постоянные маршруты через Netplan (Ubuntu 22.04+)
# /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.1.10/24
routes:
- to: default
via: 192.168.1.1
- to: 10.0.0.0/8
via: 10.0.0.1
metric: 100
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
sudo netplan apply
Два интерфейса с разными шлюзами
# /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0: # Основной (интернет)
dhcp4: false
addresses: [1.2.3.4/24]
routes:
- to: default
via: 1.2.3.1
eth1: # Приватная сеть
dhcp4: false
addresses: [10.0.0.10/24]
routes:
- to: 10.0.0.0/8
via: 10.0.0.1
ifconfig устарела и не установлена по умолчанию в Ubuntu 20.04+. Используйте ip addr и ip route — они поддерживают IPv6 и современные возможности ядра.Разбор типичных ошибок маршрутизации
"RTNETLINK answers: Network is unreachable" при добавлении маршрута через шлюз — означает, что указанный шлюз недостижим напрямую, то есть не находится в одной подсети с адресом интерфейса.
sudo ip route add 10.0.0.0/8 via 192.168.1.1
RTNETLINK answers: Network is unreachable
Проверьте, что на интерфейсе уже есть адрес из той же подсети, что и шлюз: ip addr show dev eth0. Если шлюз 192.168.1.1, а на интерфейсе только адрес 10.0.0.5/24, маршрут добавить не получится, пока не появится адрес из сети 192.168.1.0/24.
После netplan apply интернет пропадает полностью — почти всегда синтаксическая ошибка отступов в YAML (YAML критичен к пробелам) либо конфликт с NetworkManager/systemd-networkd, который управляет тем же интерфейсом.
sudo netplan apply
Error in network definition //etc/netplan/01-netcfg.yaml: invalid indentation
Проверьте синтаксис перед применением: sudo netplan try — команда покажет ошибку и автоматически откатит изменения через 120 секунд, если вы не подтвердите их, что спасает от потери SSH-доступа при опечатке.
Способы настройки маршрутов: сравнение
| Способ | Постоянство | Где применяется | Синтаксис |
|---|---|---|---|
| ip route add | До перезагрузки | Любой Linux с iproute2 | Команда CLI |
| Netplan (YAML) | Постоянно | Ubuntu 18.04+ | YAML-декларация |
| /etc/network/interfaces | Постоянно | Debian, старый Ubuntu | Ключ-значение |
| NetworkManager (nmcli) | Постоянно | Desktop-дистрибутивы, RHEL/CentOS | CLI или GUI |
Когда статических маршрутов недостаточно
- Топология сети часто меняется (несколько провайдеров, резервные каналы) — нужна динамическая маршрутизация (BGP, OSPF) через FRRouting или Bird, а не список статических записей.
- Нужен автоматический failover между провайдерами — статический маршрут не переключится сам при падении линка, для этого нужны специальные механизмы мониторинга и скрипты или протоколы маршрутизации.
- Сервер обслуживает десятки VLAN с независимой маршрутизацией — ручное управление через
ip routeили Netplan становится трудноподдерживаемым, стоит смотреть в сторону выделенного роутера или FRRouting.
Проверка результата
- Проверьте применённые маршруты:
ip route showдолжен содержать нужную запись с правильным шлюзом и метрикой. - Проверьте связность через конкретный маршрут:
ip route get 10.0.0.5должен показать, через какой интерфейс и шлюз пойдёт пакет. - Убедитесь, что настройки переживут перезагрузку:
sudo netplan generate && sudo reboot, затем повторитеip route show. - Проверьте оба интерфейса при мультигоминге:
ping -I eth0 8.8.8.8иping -I eth1 10.0.0.1должны проходить независимо друг от друга.
Перед настройкой маршрутов полезно разобраться с масками подсетей — см. статью про CIDR, а общий механизм трансляции адресов описан в статье про NAT.