#Что произошло и как распознать неисправность
Команда named-checkconf завершается без сообщений об ошибке, но systemctl start bind9 или systemctl restart named завершается неудачей. Проверка синтаксиса не проверяет все возможности запуска: проблема может быть в занятом порте 53, правах пользователя named, недоступном файле зоны, блокировке AppArmor/SELinux либо дополнительных настройках службы. Не запускайте сервер многократно с разными правами и не отключайте защитные механизмы. Сначала получите точную причину из systemd и журнала, затем проверьте пробную загрузку зон и доступ к портам.
#Причины и отличительные признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Порт 53 занят другим процессомНапример systemd-resolved, dnsmasq или другой экземпляр named занял тот же адрес и порт. | Журнал сообщает address already in use или not listening. | Развести сервисы по адресам и интерфейсам без выключения локального DNS наугад. |
| Права на файл или каталогУ named нет чтения файла зоны либо записи в нужный runtime-каталог. | Журнал permission denied при конкретном пути. | Восстановить владельца и права только указанного файла согласно схеме пакета. |
| Ошибка внутри зоныСинтаксис общей конфигурации правильный, а данные зоны непригодны к загрузке. | named-checkconf -z или named-checkzone показывает ошибку. | Исправить содержимое зоны из резервной копии. |
| Сбой запуска под ограничениями службыUnit, песочница, AppArmor или SELinux запрещают конкретное действие. | systemd и журнал безопасности содержат запись о запрете. | Согласовать доступ в штатной политике, а не отключать защиту. |
#Пошаговая диагностика и исправление
- Проверьте, какая служба действительно управляет BINDПодключитесь к серверу по SSH под административной учётной записью, выполните
systemctl status bind9 --no-pager. На Debian название может бытьnamed, если первого unit нет: проверьтеsystemctl status named --no-pager. Зафиксируйте Active, Main PID, Exit Code и время последней попытки; не выполняйте restart, пока не выяснили причину. - Откройте журнал ошибок именно этого запускаНа сервере выполните
sudo journalctl -u bind9 -n 120 --no-pagerлибо с-u named, если установлен другой unit. Найдите строкиpermission denied,address already in use,loading configuration,zone,exiting. При ошибке в файле запишите полный путь и номер строки. Не пересылайте журналы с секретами TSIG и адресами внутренней сети третьим лицам. - Проверьте конфигурацию с загрузкой зонВыполните
sudo named-checkconf -z— ключ-zвыполняет пробную загрузку основных зон. Если он находит ошибку, сначала запуститеsudo named-checkzone example.com /etc/bind/db.example.com, подставив реальную зону и путь, чтобы увидеть конкретную строку. Успешная проверка не гарантирует свободу порта и корректные runtime-права. - Узнайте, что слушает порт 53Выполните
sudo ss -lntup '( sport = :53 )'. В выводе увидите TCP/UDP сокеты и процессы (если права позволяют). Если другой DNS-сервис слушает тот же адрес, решите, каким интерфейсом должен пользоваться каждый. Не останавливайте systemd-resolved только ради теста: он может обслуживать сетевые приложения и локальное разрешение имен. - Проверьте существование и права только нужных путейИз журнала возьмите путь файла и проверьте
sudo namei -l /etc/bind/db.example.com, подставив реальный. Команда покажет права каждого родительского каталога. Сравните владельца с тем, под которым запущен named по unitsystemctl cat bind9илиsystemctl cat named. Исправляйте только обнаруженный доступ, не задавайте права 777 и не меняйте владельца всей/etc/bindбез понимания пакета. - Посмотрите настройки ограничений и запуска службыПри появлении сообщений AppArmor или SELinux обратитесь к журналу безопасности и проверьте разрешённый путь зоны; при наличии systemd-сандбокса проверьте
systemctl cat bind9. Если named перенесли в нестандартный каталог, нужно корректно описать доступ в политике и unit, а не бездумно отключить механизм защиты. Сохраните копию изменяемого файла службы и конфигурации. - Исправьте только найденную причину и запустите службуЕсли порт уже занят — согласуйте адреса
listen-onили перенастройте конфликтующий DNS-сервис. Если файл недоступен — восстановите доступ для рабочего пользователя. Перед запуском выполнитеsudo named-checkconf -z; при успехе применитеsudo systemctl start bind9(либоnamed). Если запускаете после изменения unit, системный администратор должен сначала выполнитьsystemctl daemon-reload. - Проверьте реальные ответы и запишите способ откатаВыполните
systemctl is-active bind9иdig @127.0.0.1 example.com SOA, подставив свою зону; в случае нескольких views используйте подходящий интерфейс. Ожидается active и ответ соответствующего сервера. Если вновь failed, не повторяйте перезапуск много раз: восстановите резервную копию, проверьте журнал и сообщите специалисту точную первую ошибку. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Как проверить результат и что делать при неуспехе
Исправлено, когда BIND9 остаётся в состоянии active после запуска, порт слушает на нужном интерфейсе и DNS-запросы дают ожидаемый ответ. Синтаксическая проверка без этих тестов не означает, что неисправность устранена.