Что было. На Ubuntu 22.04 администратор хотел направить трафик к одному адресу (условно 198.51.100.15) через удалённый маршрутизатор в другой сети. Команда ip route add 198.51.100.15/32 via 203.0.113.200 отвечала Error: Nexthop has invalid gateway, старая route add говорила «сеть недоступна».
Почему. Адрес следующего перехода (via) должен быть достижим напрямую, то есть лежать в подсети одного из интерфейсов машины. Ядро не примет маршрут через шлюз, к которому у него самого нет прямого пути. Здесь 203.0.113.200 находился за другим маршрутизатором, и с точки зрения сервера это «шлюз за шлюзом».
Решение. Маршрут прописали через ближайший локальный маршрутизатор, который уже знал, как добраться дальше: ip route add 198.51.100.15/32 via 198.51.100.62 dev enp6s18. Заработало, автор подтвердил. Правило простое: via всегда сосед по сегменту, а куда он отправит пакет дальше, его забота.
Как сделать маршрут постоянным. Команда ip route живёт до перезагрузки. На серверной Ubuntu с netplan добавьте в конфигурацию интерфейса:
routes:
- to: 198.51.100.15/32
via: 198.51.100.62
затем netplan try (откатится сам через 120 секунд, если вы потеряли доступ) и netplan apply. На системах с NetworkManager то же самое через nmcli connection modify <имя> +ipv4.routes "198.51.100.15/32 198.51.100.62".
Проверка. ip route get 198.51.100.15 покажет, каким маршрутом и через какой шлюз пойдёт пакет. traceroute -n 198.51.100.15 покажет, доходит ли он до цели.
Типичные ошибки рядом.
- Маршрут добавлен на неправильный интерфейс (
dev), и соседний шлюз на нём недостижим. - Два маршрута к одной сети с одинаковой метрикой из разных источников (DHCP и статика).
- Обратный маршрут: у целевой сети нет пути назад к вашему серверу,
pingмолчит, хотя маршрут «правильный». Проверять с обеих сторон. - На виртуальной машине с несколькими сетевыми интерфейсами шлюз по умолчанию должен быть только один; для остальных сетей нужны точечные маршруты, как в этом случае.
Описание маршрутов в netplan есть в документации netplan.