Быстро, доступно, безопасно!
Магазин готовых сайтов

Настройка вторичного 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%)