Вопрос или проблема
Как настроить мой Ubuntu 15.04 bind9, чтобы он перестал разрешать запросы с IPv6?
Краткий ответ
Я использую bind9 на моей машине с Ubuntu 15.04. Похоже, что мой сервер named пытается разрешить множество запросов, используя IPv6.
29-Jul-2015 01:03:28.926 lame-servers: error (network unreachable) resolving 'vassg.omniroot.com.edgesuite.net/A/IN': 2600:1401:2::2#53
29-Jul-2015 01:03:30.073 lame-servers: error (network unreachable) resolving 'askubuntu.com/A/IN': 2001:503:231d::2:30#53
29-Jul-2015 01:03:30.516 lame-servers: error (network unreachable) resolving 'stackapps.com/A/IN': 2001:503:a83e::2:30#53
29-Jul-2015 01:03:30.533 lame-servers: error (network unreachable) resolving 'stackapps.com/AAAA/IN': 2400:cb00:2049:1::adf5:3b69#53
Поиск в Google привел меня к решению запустить службу named только в режиме IPv4, добавив параметр -4. Я попробовал изменить файл /etc/default/bind9 на следующий:
/etc/default/bind9
# запустить resolvconf?
RESOLVCONF=yes
# параметры запуска для сервера
OPTIONS="-4 -u bind"
Но я всё равно получил много неудачных разрешений через IPv6.
Поэтому я проверил опции, использованные для запуска named с systemd
mippy@heimdal:~/src/servermon$ sudo service bind9 status
● bind9.service - BIND Domain Name Server
Loaded: loaded (/lib/systemd/system/bind9.service; enabled; vendor preset: enabled)
Drop-In: /run/systemd/generator/bind9.service.d
└─50-insserv.conf-$named.conf
Active: active (running) since ężт 2015-07-29 01:11:44 CEST; 25min ago
Docs: man:named(8)
Process: 6879 ExecStop=/usr/sbin/rndc stop (code=exited, status=0/SUCCESS)
Main PID: 6884 (named)
CGroup: /system.slice/bind9.service
└─6884 /usr/sbin/named -f -u bind
Поэтому кажется, что named запущен с командой /usr/sbin/named -f -u bind. Это не то, что я ожидал от своего /etc/default/bind9.
Как я могу настроить named с опцией -4?
Вот процедура для обновления опций named после перехода Ubuntu на systemd:
cp /lib/systemd/system/bind9.service /etc/systemd/system/bind9.service
редактировать
/etc/systemd/system/bind9.service
изменить
ExecStart=/usr/sbin/named -f -u bind
на
ExecStart=/usr/sbin/named -4 -f -u bind
затем
systemctl daemon-reload
service bind9 restart
дважды проверьте, что изменение вступило в силу:
mippy@heimdal:~/src/servermon$ sudo service bind9 status
● bind9.service - BIND Domain Name Server
Loaded: loaded (/etc/systemd/system/bind9.service; enabled; vendor preset: enabled)
Drop-In: /run/systemd/generator/bind9.service.d
└─50-insserv.conf-$named.conf
Active: active (running) since ężт 2015-07-29 11:09:26 CEST; 5min ago
Docs: man:named(8)
Process: 20737 ExecStop=/usr/sbin/rndc stop (code=exited, status=0/SUCCESS)
Main PID: 20742 (named)
CGroup: /system.slice/bind9.service
└─20742 /usr/sbin/named -4 -f -u bind
Для получения дополнительной информации посмотрите эту страницу документации suse. Она должна быть применима и для пользователей Ubuntu. https://www.suse.com/documentation/sled-12/book_sle_admin/data/sec_boot_systemd_custom.html
Неудачные запросы на разрешение адресов IPv6 не указывают на неправильную конфигурацию сервера, а на ошибку конфигурации клиента. Ваш сервер, работающий только с IPv4-адресом, будет все равно получать DNS-запросы (AAAA) для разрешения IPv6. Это стало происходить, когда различные операционные системы начали включать IPv6 по умолчанию несколько лет назад.
Хотя ответ от @Civing, вероятно, сработает, он может не быть самым чистым способом переопределения конфигурации bind9
, потому что копируется вся определение службы systemd, а не только директива ExecStart
, которую нужно переопределить.
Более компактный способ достижения того же результата (для Xenial и позднее) можно найти здесь.
Переменная $OPTIONS в файле службы systemctl для BIND (named) обычно предназначена для установки в отдельном конфигурационном файле, а не непосредственно в файле службы.
Где установить $OPTIONS
Файл окружения (рекомендуется)
Проверьте, включает ли ваш файл службы BIND для systemd (например, /lib/systemd/system/named.service или /etc/systemd/system/named.service) строку:
EnvironmentFile=/etc/default/named
Если да, вы можете установить опции, отредактировав /etc/default/named (или /etc/sysconfig/named на некоторых системах) и добавив:
OPTIONS=”-4 -u bind”
Перезапустите systemd и перезагрузите службу:
sudo systemctl daemon-reexec
sudo systemctl restart named
Непосредственно в файле службы Systemd (менее рекомендуется)
Отредактируйте файл службы systemd, обычно расположенный в /lib/systemd/system/named.service или /etc/systemd/system/named.service:
[Service]
Environment=”OPTIONS=-4 -u bind”
Перезагрузите systemd и перезапустите BIND:
sudo systemctl daemon-reload
sudo systemctl restart named
.
Ответ или решение
Чтобы отключить использование IPv6 в вашем сервере DNS BIND9 на Ubuntu 15.04 и заставить его работать исключительно в IPv4, можно воспользоваться следующими рекомендациями. Это связано с тем, что, несмотря на использование опции -4
в /etc/default/bind9
, ваши изменения, похоже, не применяются из-за особенностей работы системного менеджера служб systemd.
Теория
Ubuntu 15.04 использует systemd для управления службами, включая BIND9. При этом файл /etc/default/bind9
может не использоваться напрямую, так как systemd использует собственные конфигурационные файлы для демонов, такие как /lib/systemd/system/bind9.service
. Для изменения параметров запуска сервиса, таких как переключение на IPv4-режим, необходимо скорректировать именно этот файл или его копию в /etc/systemd/system
.
Основная идея в том, что для применения параметров запуска служб в systemd необходимо корректировать директиву ExecStart
. Эта директива определяет, с какими параметрами запускается сам процесс. В данном случае, требуется дополнить эту директиву параметром -4
, чтобы явно указать на использование только IPv4.
Пример
Пример исправления конфигурации для запуска BIND9 только в режиме IPv4:
-
Скопируйте текущий файл службы из системной директории в директорию для временных конфигураций:
sudo cp /lib/systemd/system/bind9.service /etc/systemd/system/bind9.service
-
Откройте скопированный файл для редактирования:
sudo nano /etc/systemd/system/bind9.service
-
Найдите строку с директивой
ExecStart
и дополните её параметром-4
:ExecStart=/usr/sbin/named -4 -f -u bind
-
Сохраните изменения и закройте текстовый редактор.
-
Перезагрузите конфигурации демонов systemd:
sudo systemctl daemon-reload
-
Перезапустите службу BIND9, чтобы применить изменения:
sudo systemctl restart bind9
-
Проверьте статус службы, чтобы убедиться, что изменения применены успешно:
sudo service bind9 status
Проверьте, что в выводе команды присутствует флаг -4
, что означает, что BIND9 запущен только с использованием IPv4.
Применение
Используя приведённый метод, вы не только устраните ненужные сетевые ошибки, связанные с IPv6, но и значительно упростите администрирование DNS-сервера в сетях, не поддерживающих или не использующих протокол IPv6. Это решение минимизирует ошибки на уровне сети, связанные с недоступностью IPv6, и позволяет сети работать более гладко.
Если ваш сервер продолжает получать запросы на IPv6, это не обязательно указывает на ошибку сервера, но может быть связано с клиентскими устройствами, которые пытаются использовать IPv6. Это в свою очередь может быть связано с конфигурацией отдельных клиентов или устройством, поддерживающим IPv6 по умолчанию. Запуск BIND9 в режиме только IPv4 на сетевом уровне всё равно способен ответить на соответствующие запросы AAAA, просто возвращая записи в рамках доступных возможностей серверной конфигурации.
Таким образом, вы достигаете желаемой функциональности и исключаете ненужные сетевые проблемы, связанные с неверными запросами через IPv6. Надеемся, что предоставленные шаги окажутся полезными в вашем конкретном случае использования и позволят обеспечить стабильную работу вашего DNS-сервера на базе BIND9 в режиме IPv4.