BIND в systemd: почему named не запускается
У BIND самая частая причина отказа — конфликт за порт 53 с локальным разрешателем имён systemd-resolved. Вторая — ошибки в зонах: сервер разбирает их при запуске и отказывается стартовать при неверной записи.
О службе
На современных системах порт 53 на адресе 127.0.0.53 занимает systemd-resolved. Пока он работает, BIND не сможет занять порт 53 на всех адресах. Решают либо отключением локального разрешателя, либо привязкой BIND к конкретным адресам.
BIND проверяет конфигурацию и зоны отдельными командами: named-checkconf и named-checkzone. Обе стоит выполнять до перезапуска: ошибка в одной зоне останавливает весь сервер, а не только эту зону.
Третья особенность — права. BIND работает от отдельного пользователя и нуждается в доступе к каталогу зон и к каталогу для файлов состояния. При ручной правке зон под root служба перестаёт стартовать до возврата владельца.
Как устроена
| Имя unit | named.service или bind9.service в зависимости от дистрибутива |
|---|---|
| Проверка конфигурации | named-checkconf и named-checkzone ЗОНА ФАЙЛ |
| Конфликт за порт 53 | с systemd-resolved на 127.0.0.53 — самая частая причина отказа |
| Права | каталог зон и /var/cache/bind должны принадлежать пользователю службы |
| Перезагрузка зон | rndc reload — без перезапуска сервера |
Частые ошибки
7 записей базы отмечены за этой службой.
Сообщения журнала
- Address already in use при запуске службыПорт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- bind: Permission denied при привязке к портуОтказ при привязке к порту: обычно порт ниже 1024 у службы от непривилегированного пользователя. Как дать возможность CAP_NET_BIND_SERVICE.
- No such file or directory в журнале службыСлужба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
Коды выхода
- status=1/FAILURE в systemdКод 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
Ошибки служб
- BIND: порт 53 занят systemd-resolvednamed не может занять порт 53: его держит локальный разрешатель имён. Как развести их по адресам.
- systemd-resolved: resolv.conf заменён обычным файломРазрешение имён работает частично: поиск по домену и разные серверы по интерфейсам перестают действовать.
Коды выхода этой службы
Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.
| status | Что означает у этой службы | Куда смотреть |
|---|---|---|
1/FAILURE |
ошибка в конфигурации, в зоне или занятый порт 53. | разбор |
Диагностика
Проверка основной конфигурации: печатает файл и строку с ошибкой.
sudo named-checkconfПроверка отдельной зоны: серийный номер, записи, синтаксис.
sudo named-checkzone example.org /etc/bind/db.example.orgКто занимает порт 53 — обычно systemd-resolved.
sudo ss -tulnp | grep :53Состояние службы под тем именем, которое есть в вашем дистрибутиве.
systemctl status named --no-pager -l || systemctl status bind9 --no-pager -lПараметры unit, которые тут важны
- User=работа от отдельного пользователя bind или named
- ExecReload=перезагрузка зон через rndc без перезапуска
- LimitNOFILE=нужен при большом числе зон и запросов
Источники
- Документация BIND 9
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)