Настройка вторичного DNS на NSD
Настройка вторичного DNS на NSD на сервере FreeBSD 14.x.
Настройка сервера на FreeBSD 14.4 -> NSD
В качестве вторичного (secondary) DNS сервера на FreeBSD будем использовать не BIND, а NSD (Name Server Daemon). Этот сервер работает с высокой производительностью и использует меньше ресурсов. Данное ПО распространяется бесплатно в виде открытого исходного кода по лицензии BSD.
Устанавливаем: pkg install nsdсоздаем каталоги: mkdir -p /usr/local/etc/nsdmkdir -p /usr/local/etc/nsd/zonesи устанавливаем на них права и разрешения: chown -R nsd:nsd /usr/local/etc/nsdchown -R nsd:nsd /usr/local/etc/nsd/zoneschmod 710 /usr/local/etc/nsdchmod 750 /usr/local/etc/nsd/zonesредактируем настройки: vim /usr/local/etc/nsd/nsd.conf
Простейший пример файла nsd.conf в минимальной конфигурации. Информация с зонами вынесена в отдельный файл zones.conf для автоматизации работы с ними.
# Пример nsd.conf для вторичного DNS-сервера
server:
server-count: 1
zonesdir: "/usr/local/etc/nsd"
username: nsd
zonesdir: "/usr/local/etc/nsd"
logfile: "/var/log/nsd.log"
remote-control:
control-enable: yes
control-interface: 127.0.0.1
control-port: 8952
server-key-file: "/usr/local/etc/nsd/nsd_server.key"
server-cert-file: "/usr/local/etc/nsd/nsd_server.pem"
control-key-file: "/usr/local/etc/nsd/nsd_control.key"
control-cert-file: "/usr/local/etc/nsd/nsd_control.pem"
key:
name: "Kexample.+157+00000"
algorithm: hmac-md5
secret: "abcdefghijklmnopqrstuv=="
include: "/usr/local/etc/nsd/zones.conf"для добавления новых доменов редактируем файл: vim /usr/local/etc/nsd/zones.confпример файла zones.conf с информацией какие зоны получать ("20.20.20.20" - заменить на IP-адрес первичного (Primary) DNS сервера: zone:
name: "example.com"
zonefile: "/usr/local/etc/nsd/example.com.zone"
request-xfr: AXFR 20.20.20.20 NOKEY
получить все доступные команды для управления nsd: nsd-controlперезагрузить файлы зоны: nsd-control reloadперезагрузить службу: service nsd restartпроверить статус службы: service nsd status
Для справки. Данные о зонах хранятся в этих файлах: /var/db/nsd/nsd.db
/var/db/nsd/xfrd.state
Получаем список зон автоматически
Для упрощения работы с вторичными NS-серверами и исключения ошибок необходимо автоматизировать получение списка зон с Primary DNS сервера, чтобы не вносить каждый домен вручную.
Создаем на ns2 (ns3, ns4 и так далее) пользователя, который будет за это отвечать: pw useradd dnsagent -m -s /bin/sh
Создаем на сервере с ns1, который будет рассылать списки зон, ключ для подключения к ns2 (ns3, ns4 и так далее): ssh-keygen -t ed25519 -f /root/.ssh/dnsagent -C "dnsagent"
Создаем необходимую папку и выставляем на неё соответствующие права и разрешения: mkdir -p /home/dnsagent/.ssh
chown -R dnsagent:dnsagent /home/dnsagent/.ssh
chmod 700 /home/dnsagent/.ssh
Добавляем в файл /home/dnsagent/.ssh/authorized_keys публичный ключ: ssh-ed25519 AAAA... dnsagent
Устанавливаем для файла необходимые права и разрешения: chown dnsagent:dnsagent /home/dnsagent/.ssh/authorized_keys
chmod 600 /home/dnsagent/.ssh/authorized_keys
Теперь можно подключиться к любому ns с помощью скрипта и загрузить файл zones_ns2.conf со списком зон. Пример кода на Perl: my $key = "/root/.ssh/dnsagent";
my $zones_ns2 = '/var/named/zones_ns2.conf';
my $dst_ns2 = "dnsagent\@198.51.100.1:/home/dnsagent/zones_ns2.conf";
system(
"scp",
"-i", $key,
$zones_ns2,
$dst_ns2
) == 0 or die "scp to ns2 failed: $?";
Далее, нам потребуется запустить скрипт, который заменит имеющийся файл /usr/local/etc/nsd/zones.conf на загруженный новый. Но для работы нашего дополнительного скрипта потребуется установить дополнительный пакет doas чтобы наш пользователь dnsagent мог выполнить один разрешённый скрипт от root, не получая полноценный root-доступ: pkg install doas
Редактируем конфигурацию doas: vim /usr/local/etc/doas.conf
Закомментируем всё лишнее и добавим разрешение для нашего пользователя на запуск скрипта обновления (одна строка): permit nopass dnsagent as root cmd /usr/local/sbin/update-zones
Теперь создаем файл скрипта: vim /usr/local/sbin/update-zones
И добавляем в него следующий текст: #!/bin/sh
set -e
NS="$1"
case "$NS" in
ns2|ns3|ns4)
;;
*)
echo "ERROR: invalid ns name: $NS"
exit 1
;;
esac
SRC="/home/dnsagent/zones_${NS}.conf"
DST="/usr/local/etc/nsd/zones.conf"
BAK="/usr/local/etc/nsd/zones.conf.bak"
test -f "$SRC" || {
echo "ERROR: source file not found: $SRC"
exit 1
}
cp "$DST" "$BAK" 2>/dev/null || true
install -o root -g wheel -m 644 "$SRC" "$DST"
if ! nsd-checkconf /usr/local/etc/nsd/nsd.conf; then
cp "$BAK" "$DST"
echo "ERROR: nsd-checkconf failed, old zones.conf restored"
exit 1
fi
nsd-control reconfig
echo "OK: zones.conf updated for $NS"
Пример кода на Perl для запуска с удаленного сервера: system(
"ssh",
"-i", $key,
"dnsagent\@198.51.100.1",
"doas",
"/usr/local/sbin/update-zones",
"ns3"
) == 0 or die "ssh update-zones failed: $?";
Работа сделана. Скрипт сам загрузил необходимые файлы и запустил другой скрипт, который сделал обновление файла со списком зон.
Метки: nsd; dns
Опрос
Адаптирован ли ваш сайт для смартфонов и планшетов? (голосов: 35)
- Да - 4 (11%)

- Нет - 2 (6%)

- Не знаю - 1 (3%)

- Нет сайта - 28 (80%)

