在 DNS 服务器上动态注册主机名(通过 DHCP)

在 DNS 服务器上动态注册主机名(通过 DHCP)

我想建立一个小型网络,其中中央 DHCP 服务器将 IPv4 地址出租给客户端。客户端已经设置了主机名,并应将其通告给中央 DNS 服务器,这样服务器和所有客户端都可以使用该主机名找到彼此。DNS 服务器将解析域“my.domain”的 LAN 地址,并指向所有其他域(互联网)的外部 DNS 服务器。

在我当前的设置中,我有两个盒子:10.0.100.1是服务器(Ubuntu 22.04),其中托管 DHCP 和 DNS。10.0.100.2配置为客户端(Fedora 35)(DHCP 在我的测试阶段发送这个固定 IP)。

这是客户端(10.0.100.2)配置:

$ cat /etc/hostname
clienthost

$ cat /etc/systemd/network/20-wired.network
[Match]
Name=enp0s31f6

[Network]
LinkLocalAddressing=ipv4
DHCP=ipv4
SendHostname=true

[DHCPv4]
UseDomains=true

$ resolvectl
Global
    Protocols: LLMNR=resolve -mDNS -DNSoverTLS DNSSEC=no/unsupported
resolv.conf mode: stub

Link 2 (enp0s31f6)
  Current Scopes: DNS LLMNR/IPv4
    Protocols: +DefaultRoute +LLMNR -mDNS -DNSoverTLS DNSSEC=no/unsupported
Current DNS Server: 10.0.100.1
    DNS Servers: 10.0.100.1
    DNS Domain: my.domain

IP10.0.100.2已正确分配。客户端可以使用其 IP、主机名或 FQDN ping 服务器 ( 10.0.100.1)。我还可以在 tcpdump 中看到主机名已发送到 DHCP 服务器(选项 81 客户端 FQDN)。到目前为止一切顺利。

一旦初始设置开始工作,DHCP 服务器配置就应该更改,以便分配一定范围内的 IP。因此,将来我不会为客户端分配固定的 IP 地址。我将跳过此处显示 rndc 密钥文件。它们是相同的,并放置在配置的位置。服务器配置如下:

$ cat /etc/hostname
serverhost

$ cat /etc/systemd/network/20-wired.network
[Match]
Name=enp0s31f6

[Network]
LinkLocalAddressing=ipv4
Address=10.0.100.1/16
Gateway=10.0.1.1
DNS=10.0.100.1

[DHCPv4]
UseDomains=my.domain

$ cat /etc/default/isc-dhcp-server
INTERFACESv4="enp0s31f6"

$ cat /etc/dhcp/dhcpd.conf
include "/etc/dhcp/ddns-keys/my-domain.key";
default-lease-time 7200;
max-lease-time 28800;
ddns-updates on;
ddns-update-style standard;
ddns-domainname "my.domain.";
allow-unknown-clients;
authoritative;
zone my.domain. {
    primary 10.0.100.1;
    key ddns-mydomain;
}

zone 10.0.in-addr.arpa. {
    primary 10.0.100.1;
    key ddns-mydomain;
}

# only serve the single client box specifically during test phase
subnet 10.0.0.0 netmask 255.255.0.0 {}
host testhost {
  hardware ethernet 00:00:00:00:00:00;
  fixed-address 10.0.100.2;
  option subnet-mask 255.255.0.0;
  option routers 10.0.1.1;
  option domain-name-servers 10.0.100.1;
  option domain-name "my.domain";
  filename "pxelinux.0";
}

$ cat /etc/bind/named.conf
include "/etc/bind/keys/my.domain.key";
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

$ cat /etc/bind/named.conf.options
acl "internal" {
    127.0.0.1;
    10.0.0.0/16;
};

options {
    directory "/var/cache/bind";

    recursion yes;
    allow-recursion { internal; };
    listen-on { 10.0.100.1; };
    allow-transfer { none; };

    allow-query { internal; };
    allow-query-cache { internal; };

    forwarders {
        1.1.1.1;
    };

    listen-on-v6 { any; };
};

$ cat /etc/bind/named.conf.local
zone "my.domain" {
    type master;
    file "/etc/bind/zones/db.my.domain";
    update-policy { grant ddns-mydomain name my.domain ANY; };
    allow-transfer { none; };
};

zone "0.10.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.0.10";
    update-policy { grant ddns-mydomain name my.domain ANY; };
    allow-transfer { none; };
};

$ cat /etc/bind/zones/db.my.domain
$TTL    86400
@   IN  SOA serverhost.my.domain. admin.my.domain. (
                  3     ; Serial
              28800     ; Refresh
               3600     ; Retry
              28800     ; Expire
              43200 )   ; Negative Cache TTL
;

; name servers - NS records
    IN  NS  serverhost.my.domain.

; A records
serverhost.my.domain.   IN  A   10.0.100.1

$ cat /etc/bind/zones/db.10.0
$TTL    86400
@   IN  SOA serverhost.my.domain. admin.my.domain. (
                  3     ; Serial
              28800     ; Refresh
               3600     ; Retry
              28800     ; Expire
              43200 )   ; Negative Cache TTL
;

; name servers - NS records
    IN  NS  serverhost.my.domain.

; PTR records
100.1   IN  PTR serverhost.my.domain.   ; 10.0.100.1

我认为这些应该是所有相关配置。如果您还需要其他配置,请告诉我。

这里的问题是,10.0.100.1 (serverhost)我只能clienthost通过其 IP 进行ping 10.0.100.2,而无法通过其主机名或 FQDN 进行 ping。不幸的是,我不知道从哪里开始调试以查看客户端主机名是否已发送到 DNS 服务器并注册。

可能还有一条不相关的附注:运行命令dhcp-list-leaseserver-host返回一个空列表。日志显示了 DHCPACK,10.0.100.2但它从未出现在此特定输出中(这本来很有趣,因为有一个“主机名”列)。

编辑:看来密钥可能还是很重要的。最初,我使用 手动创建了一个密钥rndc-confgen -a -b 512,然后将该文件复制到/etc/dhcp/rndc-keys/。目前,我使用 生成了一个新密钥,ddns-confgen -a -b 512并将该密钥放在 和/etc/bind/keys/my.domain.key/etc/dhcp/ddns-keys/my.domain.key(并更新了相应配置文件中的包含语句)。我仍然有 rndc 密钥,/etc/bind/rndc.key正如日志所示,bind9 也会拾取该密钥。

编辑2:手动运行nsupdate如下所示:

$ nsupdate -D -k /etc/bind/keys/my.domain.key
> update add clienthost.my.domain 7200 A 10.0.100.2
> send
[...]
Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: REFUSED, id:  39064
;; flags: qr; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; ZONE SECTION:
;my.domain.         IN  SOA

;; TSIG PSEUDOSECTION:
ddns-mydomain.      0   ANY TSIG    hmac-sha256. 1652972427 300 32 4e/XXXXXXXXXXXXXXXXXXXXXXXX/bmg= 39064 NOERROR 0

在手动更新期间,日志显示

client @0x7f61d8004cb8 10.0.100.1#39791/key ddns-mydomain: updating zone 'my.domain/IN': update failed: rejected by secure update (REFUSED)

相关内容