Рейтинг:0

Динамически регистрировать имена хостов на DNS-сервере (через DHCP)

флаг nl

Я хочу создать небольшую сеть, в которой центральный DHCP-сервер сдает в аренду IPv4-адреса клиентам. У клиентов уже установлены имена хостов, и они должны объявить их центральному DNS-серверу, чтобы и сервер, и все клиенты могли найти друг друга с этим именем хоста. DNS-сервер будет разрешать LAN-адреса домена «my.domain» и указывать на внешний DNS-сервер для всех других доменов (интернет).

В моей текущей настройке у меня есть два поля: 10.0.100.1 это сервер (Ubuntu 22.04), на котором размещены DHCP и DNS. 10.0.100.2 настроен как клиент (Fedora 35) (DHCP отправляет этот фиксированный IP-адрес на этапе тестирования).

Это клиент(10.0.100.2) конфигурация:

$ кот /etc/имя хоста
клиентхост

$ cat /etc/systemd/network/20-wired.network
[Соответствовать]
Имя = enp0s31f6

[Сеть]
LinkLocalAddressing=ipv4
DHCP=ipv4
SendHostname=true

[DHCPv4]
Уседомаинс=истина

$ разрешение
Глобальный
    Протоколы: LLMNR=resolve -mDNS -DNSoverTLS DNSSEC=нет/не поддерживается
Режим resolv.conf: заглушка

Ссылка 2 (enp0s31f6)
  Текущие области: DNS LLMNR/IPv4
    Протоколы: +DefaultRoute +LLMNR -mDNS -DNSoverTLS DNSSEC=нет/не поддерживается
Текущий DNS-сервер: 10.0.100.1
    DNS-серверы: 10.0.100.1
    DNS-домен: my.domain

IP 10.0.100.2 правильно назначается. Клиент может пинговать сервер (10.0.100.1) с его IP-адресом, именем хоста или полным доменным именем. Я также вижу в tcpdump, что имя хоста отправляется на DHCP-сервер (опция 81 Client FQDN). Все идет нормально.

Предполагается, что конфигурация DHCP-сервера будет изменена после того, как первоначальная настройка будет работать, в сторону выдачи IP-адресов из диапазона. Так что в будущем у меня не будет фиксированных IP-адресов для клиентов. Я не буду показывать здесь файлы ключей rndc. Они идентичны и размещены в настроенных местах. Сервер настроен следующим образом:

$ кот /etc/имя хоста
серверхост

$ cat /etc/systemd/network/20-wired.network
[Соответствовать]
Имя = enp0s31f6

[Сеть]
LinkLocalAddressing=ipv4
Адрес=10.0.100.1/16
Шлюз=10.0.1.1
DNS=10.0.100.1

[DHCPv4]
UseDomains=мой.домен

$ cat /etc/default/isc-dhcp-сервер
ИНТЕРФЕЙСv4="enp0s31f6"

$ кошка /etc/dhcp/dhcpd.conf
включить "/etc/dhcp/ddns-keys/my-domain.key";
время аренды по умолчанию 7200;
максимальное время аренды 28800;
ddns-обновления включены;
стандартный стиль обновления ddns;
ddns-domainname "мой.домен.";
разрешить-неизвестных-клиентов;
авторитетный;
зона мой.домен. {
    основной 10.0.100.1;
    ключ ddns-мойдомен;
}

зона 10.0.в-адрес.арпа. {
    основной 10.0.100.1;
    ключ ddns-мойдомен;
}

# обслуживать только один клиентский ящик специально на этапе тестирования
подсеть 10.0.0.0 сетевая маска 255.255.0.0 {}
хост тестовый хост {
  аппаратный Ethernet 00:00:00:00:00:00;
  фиксированный адрес 10.0.100.2;
  опция маска подсети 255.255.0.0;
  вариант маршрутизатора 10.0.1.1;
  вариант доменных имен-серверов 10.0.100.1;
  вариант доменного имени "my.domain";
  имя файла "pxelinux.0";
}

$ кошка /etc/bind/named.conf
включить "/etc/bind/keys/my.domain.key";
включить "/etc/bind/named.conf.options";
включить "/etc/bind/named.conf.local";
включить "/etc/bind/named.conf.default-zones";

$ кот /etc/bind/named.conf.options
acl "внутренний" {
    127.0.0.1;
    10.0.0.0/16;
};

параметры {
    директория "/var/cache/bind";

    рекурсия да;
    разрешить рекурсию {внутренний; };
    слушать { 10.0.100.1; };
    разрешить передачу {нет; };

    разрешить запрос {внутренний; };
    разрешить-запрос-кэш {внутренний; };

    экспедиторы {
        1.1.1.1;
    };

    слушать на v6 { любой; };
};

$ кошка /etc/bind/named.conf.local
зона "мой.домен" {
    тип мастер;
    файл "/etc/bind/zones/db.my.domain";
    политика обновления { предоставить имя ddns-mydomain my.domain ЛЮБОЕ; };
    разрешить передачу {нет; };
};

зона "0.10.in-addr.arpa" {
    тип мастер;
    файл "/etc/bind/zones/db.0.10";
    политика обновления { предоставить имя ddns-mydomain my.domain ЛЮБОЕ; };
    разрешить передачу {нет; };
};

$ кошка /etc/bind/zones/db.my.domain
86400 долларов США
@ IN SOA serverhost.my.domain. admin.мой.домен. (
                  3; Серийный
              28800 ; Обновить
               3600 ; Повторить попытку
              28800 ; Срок действия
              43200 ) ; Отрицательный TTL кэша
;

; серверы имен — записи NS
    В NS серверхост.мой.домен.

; записи
серверхост.мой.домен. В А 10.0.100.1

$ кошка /etc/bind/zones/db.10.0
86400 долларов США
@ IN SOA serverhost.my.domain. admin.мой.домен. (
                  3; Серийный
              28800 ; Обновить
               3600 ; Повторить попытку
              28800 ; Срок действия
              43200 ) ; Отрицательный TTL кэша
;

; серверы имен — записи NS
    В NS серверхост.мой.домен.

; PTR-записи
100.1 В PTR serverhost.my.domain. ; 10.0.100.1

Я думаю, что должны быть все соответствующие настройки. Пожалуйста, дайте мне знать, если вам нужно что-то еще.

Проблема здесь в том, что, находясь на 10.0.100.1 (хост сервера) я могу только пинговать клиентхост через свой IP 10.0.100.2 но ни по имени хоста, ни по полному доменному имени.К сожалению, я не знаю, с чего начать отладку, чтобы увидеть, отправляется ли имя хоста клиента на DNS-сервер и регистрируется или нет.

Возможно, потенциально несвязанное примечание: выполнение команды DHCP-список-аренда на сервер-хост возвращает пустой список. Журналы показывают DHCPACK для 10.0.100.2 но он никогда не появляется в этом конкретном выводе (что было бы интересно, потому что есть столбец «имя хоста»).

Редактировать: похоже, что ключ может быть важен в конце концов. Первоначально я вручную создал ключ с rndc-confgen -a -b 512, а затем скопировал этот файл в /etc/dhcp/rndc-ключи/. В настоящее время я сгенерировал новый ключ с ddns-confgen -a -b 512 и поместил ключ в оба /etc/bind/keys/мой.домен.ключ И в /etc/dhcp/ddns-keys/мой.домен.ключ (и обновил операторы включения в соответствующих файлах конфигурации). У меня все еще есть ключ rndc под /etc/bind/rndc.key который также подхвачен bind9, как показывают журналы.

Редактировать2: Ручной запуск нобдате выглядит следующим образом:

$ nsupdate -D -k /etc/bind/keys/мой.домен.ключ
> обновить добавить clienthost.my.domain 7200 A 10.0.100.2
> отправить
[...]
Ответ на запрос обновления:
;; ->>HEADER<<- код операции: UPDATE, статус: REFUSED, id: 39064
;; флаги: qr; ЗОНА: 1, ПРЕДВАРИТЕЛЬНЫЙ ЗАПРОС: 0, ОБНОВЛЕНИЕ: 0, ДОПОЛНИТЕЛЬНО: 1
;; РАЗДЕЛ ЗОНЫ:
;мой.домен. В СОА

;; ПСЕВДОРАЗДЕЛ TSIG:
ddns-мойдомен. 0 ЛЮБОЙ TSIG hmac-sha256. 1652972427 300 32 4e/XXXXXXXXXXXXXXXXXXXXXXXX/bmg= 39064 NOERROR 0

А при ручном обновлении логи показывают

client @0x7f61d8004cb8 10.0.100.1#39791/key ddns-mydomain: обновление зоны 'my.domain/IN': обновление не удалось: отклонено безопасным обновлением (ОТКАЗАНО)
Nikita Kipriyanov avatar
флаг za
Есть ли у вас журналы обновлений DNS? Включите его (см. [здесь] (https://serverfault.com/questions/1100116/how-to-log-verbose-details-about-dns-update-queries-in-bind/1100228#1100228)). Также попробуйте протестировать добавление обновлений DNS вручную через `nsupdate` с вашим ключом. Кстати, что такое `rndc.key`? Вы должны создать специальный ключ для динамических обновлений, не используйте автоматический ключ, который используется для утилиты `rndc`.
a.ilchinger avatar
флаг nl
Обновление вручную через `nsupdate` возвращает код состояния REFUSED, но вывод отладки говорит: «проверка tsig прошла успешно».
Nikita Kipriyanov avatar
флаг za
Что в логах в тот же момент времени? И теперь, когда вы видите проблему, начните с ее устранения. Я скажу еще раз, не полагайтесь на этот ключ, сгенерируйте специальный. Когда nsupdate начнет работать с этим ключом как положено, двигайтесь дальше и настройте его в dhcpd.
флаг mx
ваша опция разрешения обновления выглядит неправильно. В настоящее время он позволяет использовать только rndc-keys. Вы можете добавить список соответствия адресов (например, «разрешить обновление { 10.0.0.0/16}») или использовать политику обновления.
a.ilchinger avatar
флаг nl
Я переключился с подкоманды `allow-update` на подкоманду `update-policy` и заставил журнал работать. Я также использовал новый выделенный ключ ddns. Теперь я немного в растерянности. На странице руководства для nsupdate сказано, что ключ, указанный для параметров -k, должен выглядеть как `K{name}.+157.+{random}.private`, что, по моему опыту, похоже на ключ dnssec, которого я не знаю. вообще не пользуюсь.Ключ, который я сгенерировал с помощью `ddns-confgen`, имеет другой формат. В журналах нет указаний на то, что потребуется другой формат ключа.
Nikita Kipriyanov avatar
флаг za
Если вы хотите разрешить ключу обновлять любую запись в зоне, используйте либо `update-policy { Grant mykey zonesub any; }` или `allow-update { key mykey; }`; они работают точно так же. Новые версии BIND поставляются со специальным tsig-keygen, используйте его, если он у вас есть. В противном случае сгенерируйте ключ с помощью «dnssec-keygen -a HMAC-SHA256 -b 256 -n HOST mykey». Оба файла будут содержать один и тот же секрет, просто отформатируйте его правильно, например, `key "mykey" { алгоритм hmac-sha256; секрет ; };`. Ключ, отформатированный таким образом, включается как в DNS, так и в DHCP-серверы: `include "/mykey.key"`.
Nikita Kipriyanov avatar
флаг za
... и тот же ключевой файл в этом формате используется с nsupdate: `nsupdate -k /mykey.key`.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.