Пакет уходит — и не возвращается. Сервер видит интернет, но не видит корпоративную подсеть. После перезагрузки маршруты пропали. Всё это решается через таблицу маршрутизации — но только если понимать как она устроена и где хранятся её настройки на разных дистрибутивах.
Как Linux решает куда отправить пакет
Когда приложение отправляет пакет, ядро проверяет таблицу маршрутизации сверху вниз. Первое совпадение адреса назначения с записью в таблице — и пакет уходит через указанный интерфейс и шлюз. Если совпадений нет — используется маршрут по умолчанию (default). Нет и его — пакет теряется с ошибкой Network unreachable.
Таблица маршрутизации — это не какой-то экзотический инструмент. Она работает на каждом сервере и каждом ноутбуке, просто обычно её не трогают.
Посмотреть таблицу маршрутизации
Современный способ через ip:
ip route
Типичный вывод:
default via 192.168.1.1 dev enp2s0 proto static metric 100
192.168.1.0/24 dev enp2s0 proto kernel scope link src 192.168.1.50
10.0.0.0/8 via 10.0.0.1 dev eth1 proto static
Расшифровка полей:
default— маршрут по умолчанию, применяется когда ни один конкретный маршрут не подошёлvia 192.168.1.1— через какой шлюз идёт трафикdev enp2s0— через какой сетевой интерфейсproto static— маршрут добавлен администратором вручную;proto kernel— добавлен ядром автоматически при настройке интерфейсаmetric 100— приоритет: чем меньше число, тем выше приоритет
Подробный вывод со всеми полями:
ip route show table all
Старая команда route тоже работает — показывает таблицу с именами хостов:
route

Если нужны числовые IP вместо имён хостов — добавить флаг -n:
route -n
Подробная таблица через routel:
routel

Современный вариант через ip route:
ip route

Добавить временный маршрут
Маршрут по умолчанию — через какой шлюз уходит весь остальной трафик:
sudo ip route add default via 192.168.1.1
Маршрут до конкретного IP:
sudo ip route add 203.0.113.0/24 via 192.168.1.1
Маршрут через конкретный интерфейс (без указания шлюза):
sudo ip route add 10.0.0.0/8 dev eth1
Маршрут с приоритетом — если есть два пути до одной сети:
sudo ip route add 10.0.0.0/8 via 10.0.0.1 metric 50
sudo ip route add 10.0.0.0/8 via 10.0.0.2 metric 100
Трафик пойдёт через 10.0.0.1 (metric 50 — выше приоритет). При недоступности — автоматически переключится на 10.0.0.2.
Временные маршруты живут до перезагрузки. После
reboot— исчезают.
Удалить маршрут
sudo ip route del default via 192.168.1.1
sudo ip route del 10.0.0.0/8
Постоянные маршруты: Ubuntu и Debian (Netplan)
На Ubuntu 18.04+ и современных Debian конфигурация сети хранится в Netplan — YAML-файлы в /etc/netplan/.
Посмотреть текущий файл:
ls /etc/netplan/
cat /etc/netplan/01-netcfg.yaml
Добавить постоянный маршрут:
network:
version: 2
ethernets:
enp2s0:
dhcp4: true
routes:
- to: 10.0.0.0/8
via: 192.168.1.1
- to: 172.16.0.0/12
via: 192.168.1.1
Применить изменения без перезагрузки:
sudo netplan apply
Постоянные маршруты: Debian старый способ (/etc/network/interfaces)
На системах без Netplan маршруты прописываются в /etc/network/interfaces:
sudo nano /etc/network/interfaces
Добавить строку в секцию нужного интерфейса:
iface enp2s0 inet dhcp
up ip route add 10.0.0.0/8 via 192.168.1.1
up ip route add 172.16.0.0/12 via 192.168.1.1

up означает: выполнить команду при поднятии интерфейса.
Постоянные маршруты: CentOS / RHEL / Rocky Linux
На системах семейства Red Hat маршруты для каждого интерфейса хранятся в отдельных файлах /etc/sysconfig/network-scripts/route-INTERFACE:
sudo nano /etc/sysconfig/network-scripts/route-eth0
Содержимое в формате ip route:
10.0.0.0/8 via 192.168.1.1
172.16.0.0/12 via 192.168.1.1
Или в старом формате:
ADDRESS0=10.0.0.0
NETMASK0=255.0.0.0
GATEWAY0=192.168.1.1
Перезапустить сетевой интерфейс для применения:
sudo nmcli connection reload
sudo nmcli connection up eth0
Два интернет-провайдера: policy routing
Если на сервере два провайдера и нужно чтобы трафик с разных IP-адресов уходил через разные шлюзы — стандартной таблицы маршрутизации недостаточно. Нужен policy routing: отдельные таблицы маршрутов для каждого интерфейса.
Создать дополнительные таблицы в /etc/iproute2/rt_tables:
echo "200 isp1" >> /etc/iproute2/rt_tables
echo "201 isp2" >> /etc/iproute2/rt_tables
Добавить маршруты и правила:
sudo ip route add default via 192.168.1.1 table isp1
sudo ip route add default via 10.0.0.1 table isp2
sudo ip rule add from 192.168.1.50 table isp1
sudo ip rule add from 10.0.0.50 table isp2
Теперь трафик с 192.168.1.50 пойдёт через первого провайдера, с 10.0.0.50 — через второго.
Диагностика: куда уходит пакет
Проверить через какой шлюз уйдёт пакет до конкретного адреса:
ip route get 8.8.8.8
8.8.8.8 via 192.168.1.1 dev enp2s0 src 192.168.1.50
Трассировка маршрута с задержками на каждом хопе:
traceroute 8.8.8.8
На системах где traceroute не установлен:
sudo apt-get install traceroute
Или через встроенный mtr — живая трассировка с обновлением в реальном времени:
mtr 8.8.8.8
Шпаргалка
| Задача | Команда |
|---|---|
| Посмотреть таблицу маршрутизации | ip route |
| Подробный вывод | ip route show table all |
| Добавить маршрут по умолчанию | sudo ip route add default via 192.168.1.1 |
| Маршрут до подсети | sudo ip route add 10.0.0.0/8 via 192.168.1.1 |
| Удалить маршрут | sudo ip route del 10.0.0.0/8 |
| Применить Netplan | sudo netplan apply |
| Перезагрузить NM-конфиг | sudo nmcli connection reload |
| Куда уйдёт пакет | ip route get 8.8.8.8 |
| Трассировка маршрута | traceroute 8.8.8.8 |
| Живая трассировка | mtr 8.8.8.8 |