- Вопрос или проблема
- Ответ или решение
- Почему использование интерфейса 0.0.0.0 вызывает сбой при перезапуске unbound.service?
- Понимание назначения интерфейса 0.0.0.0
- Причина сбоя у unbound.service
- Что делать дальше?
- 1. Измените порт Unbound:
- 2. Запустите Unbound:
- 3. Проверьте работу Unbound на новом порту:
- 4. Отключите systemd-resolved:
- 5. Перезапустите службы:
- Заключение
Вопрос или проблема
unbound.service
работает без ошибок, когда используются эти 3 файла по умолчанию (созданные после установки unbound):
root@DNS:/etc/unbound# cat unbound.conf
# Файл конфигурации Unbound для Debian.
#
# См. страница man unbound.conf(5).
#
# См. /usr/share/doc/unbound/examples/unbound.conf для закомментированного
# файла конфигурации в качестве ссылки.
#
# Следующая строка включает дополнительные файлы конфигурации из
# директории /etc/unbound/unbound.conf.d.
include-toplevel: "/etc/unbound/unbound.conf.d/*.conf"
root@DNS:/etc/unbound# cat unbound.conf.d/remote-control.conf
remote-control:
control-enable: yes
# по умолчанию интерфейс управления работает на 127.0.0.1 и ::1 и порту 8953
# также возможно использовать сокет unix
control-interface: /run/unbound.ctl
root@DNS:/etc/unbound# cat unbound.conf.d/root-auto-trust-anchor-file.conf
server:
# Следующая строка настроит unbound для выполнения криптографической
# проверки DNSSEC с использованием корневого опорного узла.
auto-trust-anchor-file: "/var/lib/unbound/root.key"
Тем не менее, когда эти 3 файла удаляются и содержимое /etc/unbound/unbound.conf
изменяется на следующее
# Файл конфигурации unbound.conf(5) для unbound(8).
server:
directory: "/etc/unbound"
username: unbound
# убедитесь, что unbound может получить доступ к энтропии изнутри chroot.
# например, на linux используйте эти команды (на BSD используется devfs(8)):
# mount --bind -n /dev/urandom /etc/unbound/dev/urandom
# и mount --bind -n /dev/log /etc/unbound/dev/log
#chroot: "/etc/unbound"
# logfile: "/etc/unbound/unbound.log" #раскомментируйте, чтобы использовать файл журнала.
pidfile: "/etc/unbound/unbound.pid"
# verbosity: 1 # раскомментируйте и увеличьте, чтобы получить больше информации в журнале.
# слушать на всех интерфейсах, отвечать на запросы из локальной подсети.
interface: 0.0.0.0
interface: ::0
access-control: 10.0.0.0/8 allow
#access-control: 2001:DB8::/64 allow
unbound.service
не удается перезапустить с помощью service unbound restart
. например.
root@DNS:/etc/unbound# service unbound restart
Ошибка для unbound.service произошла, потому что управляющий процесс завершился с кодом ошибки.
Смотрите "systemctl status unbound.service" и "journalctl -xeu unbound.service" для получения подробностей.
root@DNS:/etc/unbound# systemctl status unbound.service
× unbound.service - Сервер DNS Unbound
Loaded: загружен (/usr/lib/systemd/system/unbound.service; отключен; предустановка: включена)
Active: неудача (Результат: код выхода) с понедельника 2024-10-28 16:01:59 UTC; 18с назад
Продолжительность: 50мин 13.453с
Документы: man:unbound(8)
Процесс: 3385 ExecStartPre=/usr/libexec/unbound-helper chroot_setup (код=вышел, статус=0/УСПЕХ)
Процесс: 3388 ExecStartPre=/usr/libexec/unbound-helper root_trust_anchor_update (код=вышел, статус=0/УСПЕХ)
Процесс: 3391 ExecStart=/usr/sbin/unbound -d -p $DAEMON_OPTS (код=вышел, статус=1/НЕУДАЧА)
Процесс: 3393 ExecStopPost=/usr/libexec/unbound-helper chroot_teardown (код=вышел, статус=0/УСПЕХ)
Основной PID: 3391 (код=вышел, статус=1/НЕУДАЧА)
CPU: 168мс
Oct 28 16:01:59 DNS systemd[1]: unbound.service: Запланированная задача перезапуска, счетчик перезапусков равен 5.
Oct 28 16:01:59 DNS systemd[1]: unbound.service: Запрос на запуск повторен слишком быстро.
Oct 28 16:01:59 DNS systemd[1]: unbound.service: Не удалось с результатом 'код выхода'.
Oct 28 16:01:59 DNS systemd[1]: Не удалось запустить unbound.service - Сервер DNS Unbound.
Для отладки я закомментировал каждую строку, а затем раскомментировал каждую строку, пока unbound.service
не остановился при перезапуске. Я обнаружил, что строка interface: 0.0.0.0
является причиной ошибки. Я не могу понять, почему 0.0.0.0
вызывает эту проблему. Почему этот IP-адрес вызывает эту проблему?
Система:
- Версия Unbound: 1.19.2
- ОС: Linux DNS 6.1.63 #218 SMP Чт Ноя 30 20:48:04 CST 2023 aarch64 aarch64 aarch64 GNU/Linux в Ubuntu Server 24.04.1
- Вывод
unbound -V
:
root@DNS::/etc/unbound# unbound -V
Версия 1.19.2
Строка конфигурации: --build=aarch64-linux-gnu --prefix=/usr --includedir=${prefix}/include --mandir=${prefix}/share/man --infodir=${prefix}/share/info --sysconfdir=/etc --localstatedir=/var --disable-option-checking --disable-silent-rules --libdir=${prefix}/lib/aarch64-linux-gnu --runstatedir=/run --disable-maintainer-mode --disable-dependency-tracking --with-pythonmodule --with-pyunbound --enable-subnet --enable-dnstap --enable-systemd --enable-cachedb --with-libhiredis --with-libnghttp2 --with-chroot-dir= --with-dnstap-socket-path=/run/dnstap.sock --disable-rpath --with-pidfile=/run/unbound.pid --with-libevent --enable-tfo-client --with-rootkey-file=/usr/share/dns/root.key --disable-flto --enable-tfo-server
Связанные библиотеки: libevent 2.1.12-stable (использует epoll), OpenSSL 3.0.13 30 Янв 2024
Связанные модули: dns64 python cachedb subnetcache respip validator iterator
Доступна функция TCP Fastopen
Лицензия BSD, см. LICENSE в исходном пакете для подробностей.
Сообщайте о ошибках на [email protected] или https://github.com/NLnetLabs/unbound/issues
Обновление:
root@DNS:/etc/unbound# unbound -d -vv -c /etc/unbound/unbound.conf
[1730176049] unbound[4263:0] уведомление: Начало работы unbound 1.19.2.
[1730176049] unbound[4263:0] ошибка: не удается привязать сокет: Адрес уже используется для 0.0.0.0 порт 53
[1730176049] unbound[4263:0] фатальная ошибка: не удалось открыть порты
ошибка: не удается привязать сокет: Адрес уже используется для 0.0.0.0 порт 53
Это скорее всего связано с тем, что systemd-resolved
слушатель DNS-стуб слушает на том же адресе / порту (как также указывалось в вашем предыдущем вопросе).
Логическим курсом действий было бы:
- Настроить Unbound для запуска на другом порту (даже высоком, просто для тестирования), добавив, скажем,
port: 3000
в/etc/unbound/unbound.conf
; - Завершить конфигурацию Unbound;
- Запустить Unbound:
systemctl start unbound
- Проверить разрешение DNS на порту #3000 с помощью
dig -p3000 [...]
; - Когда всё будет работать, отключить слушатель
systemd-resolved
, удалитьport: 3000
из/etc/unbound/unbound.conf
и перезапустить какsystemd-resolved
, так и Unbound.
Чтобы отключить слушатель systemd-resolved
, создайте директорию /etc/systemd/resolved.conf.d
, содержащую файл с именем, например, 10-disable-listener.conf
, содержащий следующее:
[Resolve]
DNSStubListener=no
Затем, чтобы перезапустить как systemd-resolved
, так и Unbound:
systemctl restart systemd-resolved unbound
Ответ или решение
Почему использование интерфейса 0.0.0.0 вызывает сбой при перезапуске unbound.service?
При конфигурации DNS-сервера Unbound важно внимательно следить за интерфейсами и портами, которые он использует. Ваш опыт с ошибкой, возникающей при установке интерфейса на 0.0.0.0
, на самом деле имеет логическое объяснение, основанное на том, как работает сеть и ее конфликты. Давайте рассмотрим эту проблему детально.
Понимание назначения интерфейса 0.0.0.0
Интерфейс 0.0.0.0
служит специальным значением в сетевой конфигурации, обозначающим, что служба может принимать соединения на всех доступных сетевых интерфейсах. Это означает, что Unbound будет слушать запросы DNS на всех сетевых адресах устройства. В теории, это правильный подход для DNS-сервисов, которые должны обслуживать запросы от клиентов из разных сетевых сегментов.
Причина сбоя у unbound.service
Тем не менее, ваш вывод указывает на сообщение об ошибке:
error: can't bind socket: Address already in use for 0.0.0.0 port 53
Это объясняет, что Unbound не может привязать свой сокет к адресу 0.0.0.0
на порту 53
, потому что этот порт уже занят другой службой. В вашем случае, скорее всего, это связано с включённым systemd-resolved
.
systemd-resolved
— это служба, которая по умолчанию включена в большинстве современных дистрибутивов Linux и предоставляет возможности локального DNS-резолвинга, используя порт 53
. Когда Unbound пытается запустить свой DNS-сервер на том же порту и адресе, происходит конфликт, из-за чего и возникает ошибка.
Что делать дальше?
1. Измените порт Unbound:
Для решения этой проблемы можно временно изменить порт, на котором работает Unbound. Например, добавьте строку в конфигурационный файл Unbound под server:
:
port: 3000
2. Запустите Unbound:
После изменения порта выполните команду для перезапуска Unbound:
systemctl start unbound
3. Проверьте работу Unbound на новом порту:
Используйте утилиту dig
для проверки работы DNS на новом порту:
dig -p 3000 @localhost example.com
4. Отключите systemd-resolved:
Как только вы убедитесь, что Unbound работает должным образом на новом порту, альтернативный подход — отключить systemd-resolved
, чтобы избежать конфликта. Создайте директорию конфигурации и файл, который отключит слушателя:
mkdir -p /etc/systemd/resolved.conf.d
echo -e "[Resolve]\nDNSStubListener=no" > /etc/systemd/resolved.conf.d/10-disable-listener.conf
5. Перезапустите службы:
После этого перезагрузите обе службы:
systemctl restart systemd-resolved unbound
Заключение
Проблема с интерфейсом 0.0.0.0
в конфигурации Unbound возникает из-за конфликта с другим процессом (в данном случае systemd-resolved
), занимающим тот же порт. Поняв источник конфликта и применив предложенные методы, вы сможете успешно перезапустить Unbound и обеспечить его корректное функционирование в вашей сетевой среде.