Caddy не занимает порты 80 и 443 без прав
Веб-серверы, работающие от непривилегированного пользователя, не могут занять порты ниже тысячи без отдельной возможности. Выдать её правильнее, чем запускать службу от root: у процесса, доступного из сети, прав должно быть минимум.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Нет возможности занимать привилегированные порты
Пользователь службы непривилегированный, а порт ниже тысячи требует особого разрешения.
-
Возможность выдана, но обрезана границей
Граница возможностей действует поверх выданных. Если нужной в ней нет, выдача не работает.
-
Порт занят другим веб-сервером
Отказ доступа и занятость порта дают разные сообщения, но оба останавливают запуск.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщение об отказе при открытии слушателя.
journalctl -u caddy -n 30 --no-pagerПользователь и возможности службы.
systemctl show caddy -p User -p AmbientCapabilities -p CapabilityBoundingSetКто занимает веб-порты.
sudo ss -tlnp | grep -E ":80|:443"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Пользователь службы непривилегированный, а порт ниже тысячи требует особого разрешения.
- Как проверить
-
Посмотрите возможности службы и сообщение об отказе.
systemctl show caddy -p User -p AmbientCapabilities -p CapabilityBoundingSet 2>/dev/null journalctl -u caddy -n 20 --no-pager | grep -i "permission denied"
- Как исправить
-
Выдайте службе возможность занимать привилегированные порты и оставьте её в границе возможностей. Одной строки недостаточно, если граница возможностей сужена.
[Service] AmbientCapabilities=CAP_NET_BIND_SERVICE CapabilityBoundingSet=CAP_NET_BIND_SERVICE
- Почему происходит
- Граница возможностей действует поверх выданных. Если нужной в ней нет, выдача не работает.
- Как проверить
-
Посмотрите оба списка.
systemctl show caddy -p AmbientCapabilities -p CapabilityBoundingSet 2>/dev/null
- Как исправить
- Добавьте нужную возможность в границу возможностей. Это частая ловушка: параметры выглядят похоже, а работают вместе.
- Почему происходит
- Отказ доступа и занятость порта дают разные сообщения, но оба останавливают запуск.
- Как проверить
-
Посмотрите, кто держит порт.
sudo ss -tlnp | grep -E ":80|:443"
- Как исправить
- Остановите прежний веб-сервер или разведите службы по портам. Два сервера на одном порту работать не могут.
Пример вывода
Нет возможности занимать привилегированные порты. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
caddy[7900]: run: loading initial config: loading new config: http app module: start: listening on :443: listen tcp :443: bind: permission denied
systemd[1]: caddy.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: caddy.service: Failed with result 'exit-code'.
Связанные ошибки
- bind: Permission denied при привязке к порту Отказ при привязке к порту: обычно порт ниже 1024 у службы от непривилегированного пользователя. Как дать возможность CAP_NET_BIND_SERVICE.
- status=218/CAPABILITIES в systemd Код 218/CAPABILITIES: не удалось применить набор возможностей процесса из CapabilityBoundingSet= или AmbientCapabilities=.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Apache: could not bind to address Apache не занимает порт: конфликт с nginx, порт занят, нет прав на привилегированный порт.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
- BIND: порт 53 занят systemd-resolved named не может занять порт 53: его держит локальный разрешатель имён. Как развести их по адресам.
- Configuration file is marked executable Предупреждение о правах: unit-файл помечен исполняемым. Откуда берётся и почему это стоит исправить.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
Где встречается чаще всего
Источники
-
systemd.exec(5)
AmbientCapabilities= и CapabilityBoundingSet=. - Документация Caddy: запуск службой
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено службой от непривилегированного пользователя без выданной возможности.