Cannot assign requested address при привязке
Сообщение Cannot assign requested address (номер 99, EADDRNOTAVAIL) значит, что служба пытается занять адрес, которого на машине нет. Классический случай при загрузке: служба стартовала раньше, чем интерфейс получил адрес.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Адрес ещё не настроен на интерфейсе
Цель
network.targetозначает лишь, что подсистема сети запущена, а не что адреса получены. Служба, привязанная к конкретному адресу, при старте его не находит. -
Адрес принадлежит другой машине или интерфейсу
В настройках указан адрес, которого на этом сервере нет: перенесли конфигурацию, сменили адресацию, забыли про плавающий адрес кластера.
-
Плавающий адрес кластера ещё не переехал
В отказоустойчивых схемах адрес поднимается только на активном узле. Служба на пассивном узле привязаться к нему не может.
-
Привязка к адресу IPv6 при отключённом IPv6
Если IPv6 выключен параметром ядра, привязка к адресу этого семейства невозможна, хотя в настройках он выглядит допустимым.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Полный список адресов машины в компактном виде: сразу видно, есть ли нужный.
ip -brief addrЖдёт ли служба готовности сети или только её запуска.
systemctl show myapp.service -p After -p Wants | tr " " "\n" | grep -i networkРаботает ли служба ожидания сети: без неё цель network-online.target достигается сразу и ничего не гарантирует.
systemctl status systemd-networkd-wait-online.service NetworkManager-wait-online.service --no-pager | head -12Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Цель
network.targetозначает лишь, что подсистема сети запущена, а не что адреса получены. Служба, привязанная к конкретному адресу, при старте его не находит.
- Как проверить
-
Посмотрите адреса и порядок запуска службы.
ip -brief addr systemctl show myapp.service -p After -p Wants
- Как исправить
-
Дождитесь готовности сети:
Wants=network-online.targetиAfter=network-online.target. Эта цель достигается, когда адреса получены.[Unit] Wants=network-online.target After=network-online.target
- Почему происходит
- В настройках указан адрес, которого на этом сервере нет: перенесли конфигурацию, сменили адресацию, забыли про плавающий адрес кластера.
- Как проверить
-
Сверьте адрес из настроек с фактическими.
ip -brief addr sudo grep -rn "listen\|bind" /etc/myapp/ | head
- Как исправить
- Исправьте адрес или слушайте на всех интерфейсах (0.0.0.0 либо ::). Для плавающего адреса нужен параметр ядра, разрешающий привязку к отсутствующему адресу.
- Почему происходит
- В отказоустойчивых схемах адрес поднимается только на активном узле. Служба на пассивном узле привязаться к нему не может.
- Как проверить
-
Проверьте, поднят ли адрес, и разрешена ли привязка к неместному адресу.
ip addr show | grep -A2 secondary sysctl net.ipv4.ip_nonlocal_bind
- Как исправить
-
Разрешите привязку к отсутствующему адресу:
net.ipv4.ip_nonlocal_bind=1(для IPv6 — соответствующий параметр). Это стандартное решение для балансировщиков и плавающих адресов.echo "net.ipv4.ip_nonlocal_bind = 1" | sudo tee /etc/sysctl.d/99-nonlocal.conf && sudo sysctl --system
- Почему происходит
- Если IPv6 выключен параметром ядра, привязка к адресу этого семейства невозможна, хотя в настройках он выглядит допустимым.
- Как проверить
-
Посмотрите состояние IPv6.
sysctl net.ipv6.conf.all.disable_ipv6 ip -6 addr
- Как исправить
- Либо включите IPv6, либо уберите адреса этого семейства из настроек службы.
Пример вывода
Служба стартовала до получения адреса. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× myapp.service - My application
Active: failed (Result: exit-code) since Mon 2026-09-15 06:00:02 MSK; 3s ago
myapp[2400]: fatal: listen tcp 203.0.113.10:8443: bind: cannot assign requested address
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- bind: Permission denied при привязке к порту Отказ при привязке к порту: обычно порт ниже 1024 у службы от непривилегированного пользователя. Как дать возможность CAP_NET_BIND_SERVICE.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Temporary failure in name resolution в журнале службы Служба не может разрешить имя: не готова сеть, нет сервера имён, мешает изоляция. Разбор при загрузке и в работе.
- nginx: [emerg] host not found in upstream nginx не запускается: не разрешается имя узла из upstream или proxy_pass. Разбор порядка запуска и работы с именами.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Mount process exited, code=exited, status=32: не найдено устройство Монтирование не проходит: устройство или UUID не найдены, неверная файловая система, недоступен сетевой ресурс. Код 32 от команды mount.
Где встречается чаще всего
Источники
-
systemd.special(7)
network.target и network-online.target: чем они отличаются. - bind(2): ошибка EADDRNOTAVAIL
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено привязкой к адресу до готовности сети и на пассивном узле с плавающим адресом.