ERR_ADDRESS_UNREACHABLE, No route to host и Network is unreachable: когда до сервера нет маршрута
Chrome пишет ERR_ADDRESS_UNREACHABLE, curl и ssh — «No route to host» или «Network is unreachable», ping — «Destination Host Unreachable». Это одна ситуация с тремя именами: пакет либо некуда отправить, либо его вернул узел с запретом. Разбираем, откуда берётся каждое сообщение, почему firewalld отдаёт «No route to host» вместо «Connection refused» и какими командами найти виновника.
ERR_ADDRESS_UNREACHABLE (код -109 в Chromium), «No route to host» (EHOSTUNREACH, errno 113 в Linux) и «Network is unreachable» (ENETUNREACH, errno 101) — три формы одной ошибки: у отправителя нет маршрута до адреса назначения, либо пакет по пути упёрся в узел, который вернул ICMP Destination Unreachable. Браузер показывает первое, ядро возвращает второе или третье, а причина сидит на одном из трёх уровней: в таблице маршрутизации клиента, у промежуточного маршрутизатора или в файрволе самого сервера, отвечающем ICMP-запретом. В отличие от ERR_CONNECTION_REFUSED сервер ничего не отклонял на уровне TCP, в отличие от ERR_CONNECTION_TIMED_OUT ошибка приходит сразу, а не через десятки секунд.
Чем отличаются три сообщения: браузер, ядро и ICMP
«Network is unreachable» ядро возвращает до отправки пакета: в таблице маршрутизации нет ни одной записи под адрес назначения. «No route to host» приходит после: маршрут был, пакет ушёл, но сосед не ответил на ARP или вернулся ICMP «host unreachable» либо «administratively prohibited». Chromium, по данным файла net_errors_posix.cc, сворачивает EHOSTUNREACH, EHOSTDOWN, ENETUNREACH и EAFNOSUPPORT в один код -109, а на Windows туда же попадают WSAEHOSTUNREACH и WSAENETUNREACH. Сводка на сентябрь 2026:
| Сообщение | Уровень | Что означает | Типичная причина |
|---|---|---|---|
| ERR_ADDRESS_UNREACHABLE | Chromium, -109 | «IP-адрес недостижим: нет маршрута до хоста или сети» (net_error_list.h) | Любая из нижеперечисленных |
| ERR_ADDRESS_INVALID | Chromium, -108 | Адрес или порт невалиден (0.0.0.0, порт 0); errno EADDRNOTAVAIL | 0.0.0.0 в hosts или в DNS |
| Network is unreachable | ENETUNREACH 101; WSAENETUNREACH 10051 | Маршрута нет вообще — пакет не покинул машину | Нет default route, IPv6-адрес без маршрута, упавший VPN |
| No route to host | EHOSTUNREACH 113; WSAEHOSTUNREACH 10065 | Маршрут есть, но сосед не ответил на ARP или пришёл ICMP код 1 либо 13 | Хост выключен в локалке; firewalld с icmp-host-prohibited |
| Packet filtered | ICMP тип 3, код 13 | Доставка запрещена административно | firewalld, nftables reject, ACL провайдера |
| «Общий сбой» / «Заданный узел недоступен» | ping в Windows | Стеку нечем отправить пакет / получен host unreachable | IPv6 без связности, выключенный адаптер / хост в локалке молчит |
Как ICMP Destination Unreachable превращается в errno
Маршрутизатор, который не может доставить пакет, возвращает отправителю ICMP тип 3 с кодом причины — так устроен RFC 792, а RFC 1812 уточняет правила для маршрутизаторов. Ядро Linux находит по этому пакету сокет и переводит код в errno по таблице icmp_err_convert из net/ipv4/icmp.c; для сокета в состоянии SYN_SENT вызов connect() завершается сразу, без повторных SYN.
| ICMP тип 3, код | Кто отправляет | errno в Linux | Текст ошибки |
|---|---|---|---|
| 0 — net unreachable | Маршрутизатор без маршрута к сети вообще (RFC 1812, 4.3.3.1) | ENETUNREACH | Network is unreachable |
| 1 — host unreachable | Последний маршрутизатор: сеть знает, хост не отвечает на ARP | EHOSTUNREACH | No route to host |
| 3 — port unreachable | Сам хост: закрытый UDP-порт, iptables REJECT без параметров | ECONNREFUSED | Connection refused |
| 13 — administratively prohibited (устаревший аналог — 10) | Файрвол: nftables reject admin-prohibited (13), iptables icmp-host-prohibited (10), ACL маршрутизатора | EHOSTUNREACH | No route to host |
| ICMPv6 тип 1, код 0 / 3 / 1 | No route / address unreachable / admin prohibited (RFC 4443) | ENETUNREACH / EHOSTUNREACH / EACCES | Network is unreachable / No route to host / Permission denied |
Практический вывод: «No route to host» в Linux — это и код 1 (хоста нет), и коды 10 и 13 (хост есть, файрвол запретил). Различить их можно по дампу или по выводу ping: код 13 печатается как «Packet filtered», код 10 — как «Destination Host Prohibited». По IPv6 запрет выглядит иначе — «Permission denied», потому что ICMPv6 код 1 ядро переводит в EACCES.
Что проверить на своём компьютере за две минуты
Первая команда — ip route get с адресом сайта: она отвечает, знает ли ядро, куда слать пакет, и через какой интерфейс. Вторая — тот же запрос через curl -4 и curl -6 по отдельности: половина «необъяснимых» ERR_ADDRESS_UNREACHABLE — это IPv6, который у клиента есть на бумаге, но не работает.
$ ip route get 203.0.113.10 # пример вывода: маршрут есть, пойдёт через шлюз 192.168.1.1 203.0.113.10 via 192.168.1.1 dev wlan0 src 192.168.1.23 uid 1000 $ ip route get 203.0.113.10 # пример вывода: маршрута нет вообще — default route пропал RTNETLINK answers: Network is unreachable $ ip route show default # пусто — DHCP не выдал шлюз или его снёс VPN-клиент $ ip -6 route show default # пусто при наличии глобального IPv6-адреса — IPv6 «полуживой»
Сценарий с IPv6 — самый частый дома и в офисах после смены роутера: сайт публикует AAAA-запись, у клиента есть глобальный IPv6-адрес от router advertisement, но выхода в IPv6-интернет нет. Браузеры реализуют Happy Eyeballs (RFC 8305): предпочитают IPv6, при неудаче переключаются на IPv4 с рекомендуемой задержкой 250 мс. Если IPv6-попытка падает мгновенно с ENETUNREACH, переключение почти незаметно; если пакеты уходят в никуда — страница открывается с задержкой; в программах без Happy Eyeballs (curl без флагов, скрипты) ошибка вылезает наружу.
$ curl -6 -sv https://example.com/ -o /dev/null # пример вывода: по IPv6 маршрута нет * Trying [2001:db8::10]:443... * Immediate connect fail for 2001:db8::10: Network is unreachable curl: (7) Failed to connect to example.com port 443 $ curl -4 -sv https://example.com/ -o /dev/null # пример вывода: по IPv4 всё в порядке * Trying 203.0.113.10:443... * Connected to example.com (203.0.113.10) port 443
Разница между «-6 не работает, -4 работает» и «оба не работают» определяет всё дальнейшее: в первом случае чините IPv6 у себя, во втором — идёте по таблице причин. Полезно прогнать и ping: по формулировке ответа видно, кто именно отказал.
$ ping -c 3 203.0.113.10 # пример вывода 1: маршрута нет — пакет не отправлен ping: connect: Network is unreachable # пример вывода 2: маршрут в локалку есть, но хост не отвечает на ARP. # «From» — ваш собственный адрес: ядро сдалось после ~3 с From 192.168.1.23 icmp_seq=1 Destination Host Unreachable # пример вывода 3: отказал промежуточный маршрутизатор 10.20.0.1 From 10.20.0.1 icmp_seq=1 Destination Net Unreachable # пример вывода 4: ICMP код 13 — файрвол на 203.0.113.10 или перед ним From 203.0.113.10 icmp_seq=1 Packet filtered $ ip neigh show 192.168.1.1 # пример вывода: шлюз не отвечает на ARP — проблема в локальной сети 192.168.1.1 dev wlan0 FAILED
Причины на клиенте, в сети и на сервере
Причины делятся на три группы по месту потери маршрута: клиент, сеть между сторонами и сервер вместе с его файрволом. Клиентские дают ошибку на всех сайтах сразу или на всех IPv6-сайтах; сетевые — из одного региона или провайдера; серверные — у всех посетителей одновременно.
| Где | Причина | Как проверить | Как исправить |
|---|---|---|---|
| Клиент | Нет default route: DHCP не выдал шлюз, статика без gateway | ip route show default пустой; route print без строки 0.0.0.0 | Переполучить адрес по DHCP или прописать шлюз |
| Клиент | IPv6 полуживой: адрес есть, связности нет | curl -6 падает, curl -4 работает | Починить IPv6 на роутере или отключить на адаптере до починки |
| Клиент | VPN затянул маршруты (0.0.0.0/1 и 128.0.0.0/1) и упал, не отдав их назад | ip route get показывает dev tun0 или wg0, туннеля нет | Корректно остановить VPN-клиент, перезапустить сеть |
| Клиент | hosts с неверным адресом: 0.0.0.0 или старый IP из локалки | getent hosts example.com отличается от dig +short | Удалить запись из hosts |
| Сеть | Шлюз не отвечает на ARP: роутер завис, дубль IP | ip neigh show — FAILED или INCOMPLETE у шлюза | Перезагрузить роутер, найти второе устройство с тем же адресом |
| Сеть | Провайдер или магистраль потеряли префикс сервера | mtr обрывается с !N у провайдера; с телефона через мобильную сеть сайт открывается | Обращение к провайдеру с трассой; владельцу сайта — к хостеру |
| Сеть | Blackhole: адрес занулён оператором после DDoS или по ошибке | Трасса упирается в один узел у всех; хостер подтверждает null-route | Ждать снятия, сменить IP, включить защиту от DDoS |
| Сервер | firewalld или iptables с REJECT --reject-with icmp-host-prohibited: порт не открыт в зоне | firewall-cmd --list-all без порта; в ping «Packet filtered» или «Destination Host Prohibited» | firewall-cmd --permanent --add-service=https и --reload |
| Сервер | Неверный шлюз на VPS после миграции или смены сети | Через консоль хостера: ip route get 8.8.8.8 показывает не тот шлюз | Исправить gateway в netplan или ifcfg |
| Сервер | Интерфейс DOWN или blackhole-маршрут в собственной таблице | ip -br addr; ip route | grep blackhole | ip link set eth0 up; удалить запись и найти, кто её добавил |
Где обрывается путь, показывает трассировка: в mtr и traceroute пропавший маршрут выглядит как узел с пометкой !N (net unreachable), !H (host unreachable) или !X (admin prohibited), после которого хопов нет. Как читать mtr и WinMTR целиком — в статье про mtr и WinMTR, база — в разборе трассировки маршрута.
$ mtr -rwzc 20 203.0.113.10 # пример вывода: 4-й хоп у провайдера возвращает net unreachable — # дальше префикс сервера никому не известен HOST: laptop Loss% Snt Last Avg Best Wrst StDev 1. AS??? 192.168.1.1 0.0% 20 1.1 1.2 0.9 2.4 0.3 2. AS64500 100.64.0.1 0.0% 20 4.8 5.1 4.2 9.7 1.1 3. AS64500 10.20.0.1 0.0% 20 6.3 6.9 5.8 12.0 1.4 4. AS64500 10.20.0.9 !N 0.0% 20 6.5 6.7 6.0 8.1 0.5
Почему firewalld отвечает No route to host вместо Connection refused
Потому что firewalld по умолчанию отклоняет пакеты не TCP-сбросом и не ICMP port unreachable, а ICMP «host prohibited». В исходниках firewalld (файл ipXtables.py) плейсхолдер %%REJECT%% раскрывается в REJECT --reject-with icmp-host-prohibited для IPv4 и icmp6-adm-prohibited для IPv6; бэкенд nftables использует reject with icmpx type admin-prohibited. Оба варианта ядро клиента переводит в EHOSTUNREACH, и администратор, только что поднявший nginx на CentOS Stream, Rocky, AlmaLinux или Fedora, видит «No route to host» при живом сервере и рабочей сети.
# На сервере: что открыто в активной зоне
$ sudo firewall-cmd --list-all
# пример вывода: 443 не открыт — всё, кроме ssh и dhcpv6, отбивается
public (active)
target: default
interfaces: eth0
services: cockpit dhcpv6-client ssh
ports:
# Как это выглядит в правилах (бэкенд iptables)
$ sudo iptables -L INPUT -n | tail -2
# пример вывода
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ctstate NEW
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
# Бэкенд nftables (по умолчанию начиная с firewalld 0.6)
$ sudo nft list chain inet firewalld filter_IN_public | tail -2
# пример вывода
reject with icmpx admin-prohibited
# Исправление
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --reload
Обратная ситуация тоже встречается: REJECT без параметра отправляет icmp-port-unreachable, и клиент получает «Connection refused», хотя порт слушается — админ ищет упавший сервис, а виноват файрвол. Чем refused отличается от unreachable в деталях — в статье про ERR_CONNECTION_REFUSED.
REJECT, DROP и ICMP-prohibited: один файрвол — три разные ошибки
Одно и то же запрещающее правило показывает клиенту REFUSED, TIMED_OUT или «No route to host» в зависимости от того, что файрвол отправляет в ответ. Это единственная причина, по которой три разные ошибки Chrome могут иметь одно исправление — открыть порт.
| Действие файрвола | Что уходит клиенту | errno / текст | Chrome | Через сколько |
|---|---|---|---|---|
| DROP | Ничего | ETIMEDOUT, Connection timed out | ERR_CONNECTION_TIMED_OUT (-118) | После повторов SYN: до 127 с в Linux при tcp_syn_retries=6, около 21 с в Windows |
| REJECT --reject-with tcp-reset | TCP RST | ECONNREFUSED, Connection refused | ERR_CONNECTION_REFUSED (-102) | Один RTT |
| REJECT (по умолчанию icmp-port-unreachable) | ICMP 3/3 | ECONNREFUSED, Connection refused | ERR_CONNECTION_REFUSED (-102) | Один RTT |
| REJECT --reject-with icmp-host-prohibited (firewalld) | ICMP 3/10 (iptables) или 3/13 (nftables) | EHOSTUNREACH, No route to host | ERR_ADDRESS_UNREACHABLE (-109) | Один RTT |
| REJECT --reject-with icmp-net-unreachable | ICMP 3/0 | ENETUNREACH, Network is unreachable | ERR_ADDRESS_UNREACHABLE (-109) | Один RTT |
| ip6tables REJECT icmp6-adm-prohibited | ICMPv6 1/1 | EACCES, Permission denied | ERR_ACCESS_DENIED (-10) | Один RTT |
Windows и macOS: route print, netstat -rn и «Общий сбой»
На Windows аналог ip route — route print, на macOS — netstat -rn; в обоих ищут маршрут по умолчанию и шлюз рядом с ним. В русской Windows «General failure» показывается как «Общий сбой» (стеку нечем отправить пакет: нет маршрута или интерфейса, чаще по IPv6), а «Destination host unreachable» — как «Заданный узел недоступен».
C:\> route print -4 | findstr /C:"0.0.0.0"
# пример вывода: маршрут по умолчанию через 192.168.1.1, метрика 25
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.23 25
# строки с 0.0.0.0 нет — шлюз не получен
C:\> ping 203.0.113.10
# пример вывода: ответ от собственного адреса — шлюз не отвечает на ARP
Ответ от 192.168.1.23: Заданный узел недоступен.
C:\> ping -6 example.com
# пример вывода: IPv6-адрес есть, маршрута нет
PING: сбой передачи. Общий сбой.
$ netstat -rn -f inet | head -4
# macOS, пример вывода: default через 192.168.1.1 на en0
Destination Gateway Flags Netif
default 192.168.1.1 UGScg en0
Симптом → команда → что увидите → вывод
Диагностика в порядке от быстрого к медленному: команды на своей машине, трассировка, проверка с сервера. Каждая строка исключает одну гипотезу.
| Симптом | Команда | Что увидите | Вывод |
|---|---|---|---|
| Не открывается ни один сайт | ip route show default / route print | Пусто или шлюз из чужой подсети | Нет default route: DHCP, статика, VPN |
| Часть сайтов с задержкой, часть с ошибкой | curl -6 -sv и curl -4 -sv | -6 падает или висит, -4 работает | IPv6 без связности |
| Мгновенный «No route to host» в локальной сети | ip neigh show; arp -a | FAILED / INCOMPLETE у нужного адреса | ARP: хост выключен, кабель, VLAN, дубль IP |
| Один сайт недоступен только из вашей сети | mtr -rwzc 20 IP; проверка с телефона | !N или !H у провайдера; с телефона открывается | Маршрут потерян у провайдера |
| Сайт недоступен отовсюду, SSH работает | firewall-cmd --list-all; iptables -L INPUT -n | Порта нет; правило REJECT с icmp-host-prohibited | Открыть порт в файрволе |
Как понять, пропал маршрут у всех или только у части сети
Разовая проверка с одного компьютера не отличает файрвол на сервере (недоступен для всех), потерянный префикс у магистрали (недоступен для региона) и IPv6 у вас дома (недоступен только вам). Ответ даёт одновременная проверка из нескольких сетей: не отвечают отовсюду — ищите на сервере и у хостера; из части точек — у магистрального оператора или в регионе.
Пруфен выполняет проверку ping и проверку TCP-порта с интервалом от 2 минут из 20 точек мониторинга — 17 в России, а также Минск, Астана и Испания. Во вкладке «По локациям» видно, откуда маршрут пропал: красная строка по всем точкам — сервер или его аплинк, красные строки в двух-трёх городах одного оператора — сетевой инцидент, о котором нужно писать не хостеру, а провайдеру. Список точек и их адреса — на странице локаций мониторинга; адреса пригодятся, чтобы разрешить их в firewalld и не получить «Packet filtered» от собственного сервера.
Пруфен присылает уведомление в Email, Telegram или Макс, как только проверка перестала проходить, и второе — когда доступность восстановилась. Если ресурс так и не поднялся, подключается голосовой звонок. Время обнаружения равно интервалу проверки. Бесплатный план включает 5 проверок — хватит на ping до сервера, порт 443 и главную страницу.
Частые вопросы
Чем ERR_ADDRESS_UNREACHABLE отличается от ERR_CONNECTION_REFUSED?
REFUSED (-102) означает, что SYN дошёл до машины и она ответила RST или ICMP port unreachable: маршрут в порядке, закрыт порт. UNREACHABLE (-109) — пакет либо не был отправлен из-за отсутствия маршрута, либо вернулся с ICMP host/net unreachable или administratively prohibited. Файрвол может отправить любой из этих ответов, поэтому обе ошибки на свежем сервере начинают проверять с firewall-cmd --list-all.
Почему после включения firewalld появляется No route to host, хотя сервер пингуется?
Зона public по умолчанию пропускает ICMP echo, ssh и dhcpv6-client, а всё остальное отклоняет через REJECT --reject-with icmp-host-prohibited. Ping проходит, а на SYN к порту 443 сервер отвечает ICMP типа 3 с кодом 10 или 13, что ядро клиента переводит в EHOSTUNREACH. Добавьте сервис в зону: firewall-cmd --permanent --add-service=https, затем --reload. Это особенность именно firewalld: ufw в Debian и Ubuntu по умолчанию использует DROP, и то же самое правило там даст таймаут.
Ошибка только по IPv6 — что делать?
Как пользователь: проверьте ip -6 route show default; при пустом выводе и наличии глобального адреса роутер раздаёт префикс без аплинка — обновите прошивку, отключите IPv6 на роутере или временно на адаптере. Как владелец сервера: публикуйте AAAA-запись только при рабочем IPv6 (ping -6 и curl -6 с внешней машины) и откройте порт в ip6tables или firewalld отдельно — правила для двух семейств независимы. Сломанный IPv6 на сервере хуже отсутствующего: часть клиентов получит задержку в каждом соединении, а клиенты без Happy Eyeballs — ошибку.
Помогает ли перезагрузка роутера?
Помогает в трёх случаях: зависший роутер не отвечает на ARP, переполнена его таблица соседей или NAT, роутер раздал некорректный IPv6-префикс после переподключения к провайдеру. Не помогает, если маршрут потерян у провайдера, на сервере стоит firewalld без открытого порта или в hosts прописан неверный адрес. Проверка перед перезагрузкой занимает десять секунд: ping шлюза и ip neigh show — если шлюз отвечает и запись REACHABLE, роутер ни при чём.