Почему интерфейс: 0.0.0.0 вызывает сбой при перезапуске unbound.service?

Вопрос или проблема

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-стуб слушает на том же адресе / порту (как также указывалось в вашем предыдущем вопросе).

Логическим курсом действий было бы:

  1. Настроить Unbound для запуска на другом порту (даже высоком, просто для тестирования), добавив, скажем, port: 3000 в /etc/unbound/unbound.conf;
  2. Завершить конфигурацию Unbound;
  3. Запустить Unbound:
    systemctl start unbound
    
  4. Проверить разрешение DNS на порту #3000 с помощью dig -p3000 [...];
  5. Когда всё будет работать, отключить слушатель 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 и обеспечить его корректное функционирование в вашей сетевой среде.

Оцените материал
Добавить комментарий

Капча загружается...