Protocol not supported при создании сокета
Сообщение Protocol not supported (номер 93, EPROTONOSUPPORT) означает, что запрошенный протокол недоступен. У служб это обычно отключённый IPv6 или ограничение семейств адресов в unit-файле.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
IPv6 отключён, а программа его запрашивает
Программа создаёт сокет этого семейства и получает отказ. Часть программ переходит на IPv4, часть падает.
-
Семейство запрещено ограничением unit-файла
Параметр ограничения семейств адресов режет доступные варианты. Программа получает отказ при создании сокета.
-
Протокол недоступен в контейнере
Среды исполнения контейнеров могут ограничивать семейства сокетов своими профилями.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Ограничение семейств адресов у службы.
systemctl show myapp.service -p RestrictAddressFamiliesОтключён ли IPv6 на уровне ядра.
sysctl net.ipv6.conf.all.disable_ipv6Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Программа создаёт сокет этого семейства и получает отказ. Часть программ переходит на IPv4, часть падает.
- Как проверить
-
Посмотрите состояние IPv6.
sysctl net.ipv6.conf.all.disable_ipv6 ip -6 addr | head
- Как исправить
- Либо включите IPv6, либо настройте программу на использование только IPv4. Отключать IPv6 на уровне ядра стоит осознанно: часть служб рассчитывает на его петлевой адрес.
- Почему происходит
- Параметр ограничения семейств адресов режет доступные варианты. Программа получает отказ при создании сокета.
- Как проверить
-
Посмотрите ограничение.
systemctl show myapp.service -p RestrictAddressFamilies
- Как исправить
- Добавьте нужное семейство в список или уберите ограничение.
- Почему происходит
- Среды исполнения контейнеров могут ограничивать семейства сокетов своими профилями.
- Как проверить
-
Определите окружение.
systemd-detect-virt --container journalctl -u myapp.service -n 20 --no-pager | grep -i protocol
- Как исправить
- Ослабьте профиль контейнера или используйте доступное семейство.
Пример вывода
Программа запрашивает IPv6 при отключённом IPv6. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
myapp[4500]: error: socket(AF_INET6, SOCK_STREAM, 0): protocol not supported
myapp[4500]: falling back to IPv4
Связанные ошибки
- status=232/ADDRESS_FAMILIES в systemd Код 232/ADDRESS_FAMILIES: не удалось применить ограничение семейств адресов из RestrictAddressFamilies=.
- Network is unreachable в журнале службы Сеть недостижима: нет маршрута, интерфейс не поднят, отключён IPv6 при попытке им воспользоваться.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- openvpn: Cannot open TUN/TAP dev /dev/net/tun Служба не может открыть устройство туннеля: нет модуля, нет устройства в контейнере или мешает изоляция unit-файла.
- status=225/NETWORK в systemd Код 225/NETWORK: не удалось создать сетевое пространство имён для службы при PrivateNetwork=yes или NetworkNamespacePath=.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Broken pipe в журнале службы Запись в закрытый канал или соединение: клиент отключился, обработчик завершился, конвейер разорван.
Источники
- socket(2): ошибка EPROTONOSUPPORT
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено отключением IPv6 параметром ядра.