«Nexthop has invalid gateway» при добавлении статического маршрута: почему шлюз должен быть «рядом» и как сделать маршрут постоянным

Что было. На 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.