ISC DHCP 与 Active Directory 安全动态 DNS 更新

ISC DHCP 与 Active Directory 安全动态 DNS 更新

我正在尝试用 ISC DHCP 替换 Windows Server DHCP。为此,我需要能够促进支持和不支持动态 DNS 记录注册的客户端更新 DNS 记录。

Active Directory/DNS 在 Server 2012 R2 上以 2012 R2 林/域功能级别运行。 DNS 正向和反向查找区域仅接受安全动态更新。

我一直未能找到有关如何将 ISC DHCP 集成到 AD DNS 环境中的指南。配置文件如下,但我在使用 ISC DHCP 时注意到的是,未加入域的客户端不会在正向/反向查找区域中为其注册 A 记录。对于加入域的客户端,它们将在正向查找区域中注册 A 记录,但不会在反向查找区域中注册。正向查找区域正在使用 DNSSEC。

ddns-updates on;
ddns-update-style standard;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;

group {
  option routers 10.10.20.1;
  option subnet-mask 255.255.255.0;
  option domain-search "example.local";
  option domain-name-servers 10.10.20.2, 10.10.20.3;
  option broadcast-address 10.10.20.255;
  ddns-domainname "example.local";
  ddns-rev-domainname "in-addr.arpa.";
  authoritative;
  allow unknown-clients;
  authoritative;

  subnet 10.10.20.0 netmask 255.255.255.0 {
    range 10.10.20.30 10.10.20.150;
  }

  ... certain IP reservations for hosts ...
}

完成上述配置后,正如预期的那样,DHCPD 被 DNS 拒绝更新/创建记录:

Unable to add forward map from device.example.local to 10.10.20.56: REFUSED

答案1

这可以通过 ISC DHCP 触发器来完成。仅限 IPv4 的脚本和设置信息可从ISC DHCPd:针对安全 Microsoft DNS 的动态 DNS 更新

有一个支持 IPv4 和 IPv6 的替代脚本,但使用与上述脚本相同的前提,可在dns-krbnsupdate.sh

问题的基本症结是 MS DNS 使用 Kerberos 进行身份验证来更新 DNS 记录,而 ISC DHCP 开箱即用地支持 TSIG [for BIND]。

上面的脚本相当冗长,所以我不会在这里发布它们,但基本步骤是:

使用 生成密钥表ktutil。这适用于作为 Active Directory 中“DnsUpdateProxy”成员的域用户。您应该能够在 Windows 或 Linux 上执行此操作(但必须将密钥表复制到运行 ISC DHCP 的服务器)。

为您的域/DNS 服务器配置上述脚本。

添加在dhcpd.conf.如果使用 IPv4/IPv6 脚本,则需要调整“执行”行:

提交时:

execute("/etc/dhcp/ddnsupdate6.sh", "add", ClientIP, "-h", ClientName, "-m", ClientMac);

发布时:

execute("/etc/dhcp/ddnsupdate6.sh", "delete", ClientIP, "-m", ClientMac);

到期时:

execute("/etc/dhcp/ddnsupdate6.sh", "delete", ClientIP);

最后,请注明您使用的是 MIT Kerberos 还是 Heimdal。对于 Debian Jesse,我使用 Kerberos 并取消注释该KRB5MIT行。

完成后,您可以启动isc-dhcp-server并监视(默认日志记录)/var/log/syslog

您应该看到类似以下内容的日志条目:

Mar 23 23:19:34 localhost dhcpd: execute_statement argv[0] = /etc/dhcp/ddnsupdate6.sh
Mar 23 23:19:34 localhost dhcpd: execute_statement argv[1] = add
Mar 23 23:19:34 localhost dhcpd: execute_statement argv[2] = 10.10.20.56
Mar 23 23:19:34 localhost dhcpd: execute_statement argv[3] = -h
Mar 23 23:19:34 localhost dhcpd: execute_statement argv[4] = HostName
Mar 23 23:19:34 localhost dhcpd: execute_statement argv[5] = -m
Mar 23 23:19:34 localhost dhcpd: execute_statement argv[6] = <MAC_Addr>
Mar 23 23:19:34 localhost dhcpd: DHCPREQUEST for 10.10.20.56 from <MAC_Addr> (HostName) via eth0
Mar 23 23:19:34 localhost dhcpd: IPv4!
Mar 23 23:19:34 localhost dhcpd: DHCPACK on 10.10.20.56 to <MAC_Addr> (HostName) via eth0
Mar 23 23:19:34 localhost dhcpd: DDNS: adding records for 10.10.20.56 (hostname.nauplius.local) succeeded

如果您看到类似以下内容的行:

DDNS:添加 10.10.20.51(主机名.nauplius.local)的记录失败:nsupdate 状态 2

这可能意味着密钥表中指定的用户没有 DNS 记录的权限,如果该用户最初没有创建记录(例如,您没有使用代理用户代表 DHCP 更新 DNS),则可能会发生这种情况。随着 DNS 记录过期,这种情况应该会消失,除非加入域的 Windows 客户端会自动更新自己的记录。

您可以通过 Windows 上的 DNS MMC 并检查相关 A/AAAA 记录的安全选项卡来验证这一点。如果您看到 HOSTNAME$,则 Windows 客户端已在 DNS 中注册,而 ISC DHCP 将无法进行注册(我个人认为这没有问题)。否则,您应该看到密钥表中指定的用户对 A/AAAA 记录具有读/写权限。

相关内容