Network is unreachable в журнале службы
Сообщение Network is unreachable (номер 101, ENETUNREACH) означает, что ядро не видит пути в нужную сеть. Частый случай на серверах — попытка соединения по IPv6 при отсутствии его настройки.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Попытка соединения по IPv6 без настроенного IPv6
Имя разрешается в адрес IPv6, а машина его не умеет. Программа пробует и получает эту ошибку — иногда молча переходя на IPv4, иногда падая.
-
Интерфейс не поднят
При загрузке или после правки настроек сети интерфейс может быть неактивен.
-
Нет маршрута в нужную сеть
Отсутствует маршрут или шлюз. Отличается от отсутствия маршрута до узла тем, что недостижима вся сеть.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Адреса и маршруты машины.
ip -brief addr && ip routeВ какие адреса разрешается имя, включая IPv6.
getent ahosts имя-узлаРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Имя разрешается в адрес IPv6, а машина его не умеет. Программа пробует и получает эту ошибку — иногда молча переходя на IPv4, иногда падая.
- Как проверить
-
Посмотрите адреса машины и разрешение имени.
ip -6 addr | head getent ahosts имя-узла | head
- Как исправить
- Либо настройте IPv6, либо заставьте программу предпочитать IPv4. Отключать IPv6 целиком стоит осознанно: часть служб рассчитывает на петлевой адрес этого семейства.
- Почему происходит
- При загрузке или после правки настроек сети интерфейс может быть неактивен.
- Как проверить
-
Посмотрите состояние интерфейсов.
ip -brief link ip -brief addr
- Как исправить
- Поднимите интерфейс и проверьте настройки сети. Для служб добавьте ожидание готовности сети.
- Почему происходит
- Отсутствует маршрут или шлюз. Отличается от отсутствия маршрута до узла тем, что недостижима вся сеть.
- Как проверить
-
Посмотрите маршруты.
ip route ip route get адрес
- Как исправить
- Добавьте маршрут в конфигурации сети, а не командой: иначе он исчезнет после перезагрузки.
Пример вывода
Программа пытается соединиться по IPv6. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
myapp[1200]: error: dial tcp [2001:db8::1]:443: connect: network is unreachable
$ ip -6 addr | grep -c inet6
1
Связанные ошибки
- No route to host в журнале службы Нет маршрута до узла: отсутствует шлюз, узел в другой сети, правило брандмауэра отвечает отказом.
- Temporary failure in name resolution в журнале службы Служба не может разрешить имя: не готова сеть, нет сервера имён, мешает изоляция. Разбор при загрузке и в работе.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Broken pipe в журнале службы Запись в закрытый канал или соединение: клиент отключился, обработчик завершился, конвейер разорван.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Connection reset by peer в журнале службы Соединение сброшено другой стороной: обрыв клиента, перезапуск сервера, промежуточное устройство.
Источники
- connect(2): ошибка ENETUNREACH
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено обращением к адресу IPv6 на машине без его настройки.