Sysadmin
May 22

Настройка DHCP сервера с динамически обновляемым сервером DNS

Сервер DNS занимается преобразованиями доменных имен в IP адрес и наоборот.
Сервер DHCP в сети занимается выдачей IP адресов устройствам. Одновременно с выдачей адресов, он может обновить данные в DNS, обновив данные о появившемся в сети устройстве.

Установка DHCP

Этот пакет скорее всего один из старейших резидентов всевозможных репозиториев. Устанавливаем из стандартного:

apt install isc-dhcp-server bind9utils

Включить в файле /etc/default/isc-dhcp-server интерфейсы для прослушивания:

INTERFACESv4="ens18,eth0,vlan3"

Основной конфигурационный файл /etc/dhcp/dhcpd.conf,

option domain-name "antroot.ru";
option domain-name-servers 10.0.2.2, 10.0.2.3;
authoritative;
subnet 10.0.1.0 netmask 255.255.255.0 {
}
subnet 10.0.2.0 netmask 255.255.255.0 {
}
subnet 10.0.3.0 netmask 255.255.255.0 {
    range 10.0.3.50 10.0.3.99;
    option subnet-mask 255.255.255.0;
    option routers 10.0.3.2;
    option ntp-servers 10.0.3.2;
    option domain-name-servers 10.0.3.2;
    option domain-name "antroot.lan";
    ddns-domainname "antroot.lan";
    default-lease-time 300;
    max-lease-time 600;
}

Немного тюнинга:

authoritative;
allow declines;
update-conflict-detection false;
update-optimization on;
update-static-leases off;

Запуск isc-dhcp-server

systemctl start isc-dhcp-server
systemctl enable isc-dhcp-server
systemctl status isc-dhcp-server

Настройка обновления DNS из DHCP

Включить обновление сервера DNS в dhcpd.conf

ddns-update-style interim;
ddns-domainname "antroot.lan";
allow declines;

Сгенерировать секретные ключи:

  • DHCP_UPDATER - для обновления DNS;
  • dhcp_omapi - для взаимодействия между репликами DHCP сервера.
dnssec-keygen -a HMAC-MD5 -b 512 -n USER DHCP_UPDATER
dnssec-keygen -a HMAC-MD5 -b 512 -n USER DHCP_OMAPI
cat Kdhcp_updater.+*.private | grep ^Key | cut -d ' ' -f2-
cat Kdhcp_omapi.+*.private   | grep ^Key | cut -d ' ' -f2-

и добавить в конфигурационный файл dhcpd.conf под псевдонимом DHCP_UPDATER

key DHCP_UPDATER {
     algorithm HMAC-MD5.SIG-ALG.REG.INT;
     secret S2RoX3bfdXXkYgRlco4rMMM3KzU4MzkwCg==;
}
key dhcp_omapi {
     algorithm hmac-md5;
     secret S2RoBEXfb21hexDFdf5K3zE1NyswMDA2Mgo=;
}

Для включения режима failover понадобится указать порт OMAPI. OMAPI протокол используется, чтобы определять и изменять состояние DHCP сервера.

omapi-port 7911;
omapi-key dhcp_omapi;

Указать зоны, которые необходимо обновлять в dhcpd.conf

zone antroot.lan. {
    primary 10.0.3.2;
    secondary 10.0.3.3;
    key DHCP_UPDATER;
}
zone 3.0.10.in-addr.arpa. {
    primary 10.0.3.2;
    secondary 10.0.3.3;
    key DHCP_UPDATER;
}

Добавить резервный DHCP сервер (опционально)

failover peer "failover-partner" {
     primary;
     address 10.0.1.2;
     port 519;
     peer address 10.0.1.3;
     peer port 520;
     max-response-delay 60;
     max-unacked-updates 10;
     mclt 3600;
     split 128;
     load balance max seconds 3;
}

и указать в подсети pool, который должен реплицироваться:

subnet 10.0.3.0 netmask 255.255.255.0 {
    pool {
        failover peer "failover-partner";
        range 10.0.3.50 10.0.3.99;
        option subnet-mask 255.255.255.0;
        option routers 10.0.3.2;
        option domain-name-servers 10.0.3.2;
        option domain-name "antroot.lan";
        ddns-domainname "antroot.lan";
    }
}

На резервном DHCP сервере все то же самое, за исключением

failover peer "failover-partner" {
     secondary;
     address 10.0.1.3;
     port 520;
     peer address 10.0.1.2;
     peer port 519;
     max-response-delay 60;
     max-unacked-updates 10;
     load balance max seconds 3;
}

Установка DNS сервера

Сервер DNS (Domain Name Services - сервис доменных имен) предназначен для преобразования доменных имен в IP адрес (прямое преобразование) и обратно (обратное преобразование, reverse DNS).
Этот пакет также является основополагающим, и присутствует во всяческих репозиториях.
Установка производится стандартным образом:

apt install -y bind9

Стандартными для Debian/Ubuntu Linux расположениями файлов Bind9 являются

  • /etc/default/bind9 - параметры запуска демона;
  • /etc/bind/ - файлы конфигурации;
  • /var/cache/bind/ - директория обслуживаемых доменных зон.

Четко установившаяся традиция разделения длинных конфигурационных файлов на части здесь может быть использована максимально эффективно при помощи директивы include, где основной файл конфигурации выглядит так

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
include "/etc/bind/named.conf.zones";
include "/etc/bind/named.conf.zones.dynamic";

Для добавления своей динамической в данном случае зоны воспользуемся файлом, например, named.conf.zones.dynamic.
Сгенерируем конфигурацию для обновления зоны:

ddns-confgen -z antroot.lan

Добавим секретный ключ, который создали для DHCP

key DHCP_UPDATER {
    algorithm HMAC-MD5.SIG-ALG.REG.INT;
    secret S2RoX3bfdXXkYgRlco4rMMM3KzU4MzkwCg==;
};

И зоны, прямую и обратную:

zone "antroot.lan" {
    type master;
    file "antroot.lan.hosts";
    masterfile-format text;
    allow-update {
        key DHCP_UPDATER;
        10.0.3.2;
        10.0.3.3;
    };
    notify no;
};

zone "3.0.10.in-addr.arpa" IN {
    type master;
    file "_db.10.0.3";
    masterfile-format text;
    allow-update {
        key DHCP_UPDATER;
        10.0.3.2;
        10.0.3.3;
    };
};

И также необходимо создать мастер-файлы этих зон в директории /var/cache/bind
Мастер файл прямой зоны antroot.lan.hosts

$ORIGIN .
$TTL 86400      ; 1 day
antroot.lan  IN SOA  antroot.lan. admin.antroot.lan. (
                                2021100601 ; serial
                                600        ; refresh (10 minutes)
                                300        ; retry (5 minutes)
                                3600       ; expire (1 hour)
                                600        ; minimum (10 minutes)
                                )
                        NS      ns.antroot.lan.
                        MX      10 mx.antroot.lan.
                        TXT     "antroot.ru server"
                        HINFO   "Pentium-III-1200" "Linux"
                        A       10.0.3.2
$ORIGIN antroot.lan.
ns                      A       10.0.3.2
mx                      A       10.0.3.2
$TTL 300        ; 5 minutes
nas.                    A       10.0.3.8

Мастер файл обратной _db.10.0.3

$ORIGIN .
$TTL 600        ; 10 minutes
3.0.10.in-addr.arpa     IN SOA  mijor.lan. cd.mijor.lan. (
                                34         ; serial
                                600        ; refresh (10 minutes)
                                3600       ; retry (1 hour)
                                86400      ; expire (1 day)
                                3600       ; minimum (1 hour)
                                )
                        NS      localhost.
$ORIGIN 3.0.10.in-addr.arpa.
$TTL 300        ; 5 minutes
90                      PTR     nas.mijor.lan.

Проверка конфигурационных файлов:

named-checkconf /etc/bind/named.conf

Управление DNS через утилиту rndc

Сгенерировать конфигурацию rndc

rndc-confgen > /etc/bind/rndc.conf

следующего содержания:

key "rndc-key" {
      algorithm hmac-md5;
    secret "ABCDEFGHIJKLMNOPQRSTUVWXYZ==";
};
options {
     default-server 127.0.0.1;
     default-port 953;
     default-key "rndc-key";
};

Добавить в /etc/bind/named.conf

include "/etc/bind/rndc.key";
controls {
        inet 127.0.0.1 port 953
        allow { 127.0.0.1; } keys { "rndc-key"; };
    };

После перезапуска bind9 (systemctl restart bind9) можно воспользоваться:

  • rndc status - вывод общего состояния DNS сервера;
  • rndc freeze antroot.lan - заморозка зоны antroot.lan для ручного внесения изменений;
  • rndc thaw antroot.lan - вернуть возможность обновления зоны antroot.lan

Ошибки конфигурации

dhcp_updater: updating zone 'antroot.lan/IN': update unsuccessful: srv1.antroot.lan: 'name not in use' prerequisite not satisfied (YXDOMAIN)

Решение: в dhcpd.conf
заменить ignore client-updates; на allow client-updates;

Forward map from srv1.antroot.lan to xx.xx.xx.xx FAILED: Has an A record but no DHCID, not mine.

DHCP-ID формируется, как хэш, вычисленный из комбинации FQDN машины, MAC адреса. DHCP-ID сохраняется в TXT записи в DNS
Решение: в dhcpd.conf добавить
update-conflict-detection off;

Не разрешаются имена, кроме укзанных своих зон:

Убедитесь, что не включена опция allow-recursion { none; };