■ 河南 刘进京
编者按: 在活动目录域环境下,使用DHCP动态分配IP时,有时也会出现多个主机域名使用相同IP的问题,给网络管理造成困难。本文则是另辟蹊径找到解决该类问题的方法。
在活动目录域环境中,会使用DNS和DHCP服务对IP地址进行管理。很多情况下,在DNS中查看A记录列表时,会发现出现多台设备使用相同IP的情况,给网络管理造成了不利影响。如果是手工为客户机指定IP,出现这样IP冲突问题就不奇怪。例如PC1的IP为192.168.1.100,那么当关机后,在PC2上手工设置相同的IP,当PC2加入域后,在DNS管理器中就会显示这两台主机使用相同IP。但是在使用DHCP动态分配IP时,依然会出现多个主机域名使用相同IP的问题。
之所以会出现上述问题,还需要从DNS和DHCP工作机制谈起。如果使用静态IP地址分配方式,即手工为客户端指派IP的话,那么当其加入到域中,就会自动在DNS中为自己注册A记录和PTR反向记录。
例如,当该客户机(例如PC1)登录到域环境后,管理员在域控上打开DNS控制台,在左侧选择“正向查找区域”→“xxx”项,“xxx”为具体的区域ID,点击工具栏上的刷新按钮,在右侧会看到该机自动注册的A记录。
在该记录的属性窗口中打开“安全”面板,在组和用户列表中选择该机的账号(例如“PC1$”),可以看到其拥有完全控制的权限。点击“高级”按钮,在打开窗口中显示该记录的所有者为“PC1$”。在左侧选择“反向查找区域”-“xxx”,其中的“xxx”为具体的区域ID,在其中会显示该机自动创建的PTR反向记录,在该记录的属性窗口中点击“高级”按钮,会显示其所有者为“PC1$”。
如果开启了DHCP自动分配IP功能后,当客户机获取IP后登录到域环境中后,情况则会发生一些变化,即其可以向DNS服务器自动注册A记录,但是PTR反向记录却是由DHCP服务器为其产生的。
例如PC2使用DHCP得到IP后,登录到域环境。管理员在DNS管理器中按照上述方法查看时,会发现与其对应的A记录的拥有者为“PC2$”,但是反向PTR记录的拥有者却是DHCP服务器。
在DHCP控制台左侧选择“IPv4”→“作用域”项,在其右键菜单上点击“属性”项,在打开窗口中的“DNS”面板中显示默认了选择“仅在DHCP客户端请求时动态更新DNS记录”项。这表示当启用了DHCP自动分配IP后,DHCP会和DNS服务进行交互,帮助客户端注册PTR反向记录。
在默认情况下,“在租用被删除时丢弃A和PTR记录”项处于选择状态,这说明不管采用静态或动态设置IP,A记录的所有者均为客户机自身,所以DHCP服务器没有权限丢弃A记录的,其仅仅可以丢弃后者的PTR记录。
例如,当在PC1上执行“ipconfig /release”命令释放IP地址后,会自动在DNS中删除A和PTR记录。但在PC2上释放IP后,仅可以自动删除A记录,必须依靠DHCP来为其删除PTR记录。
在实际的企业环境,即使所有的客户端都使用DHCP来获取IP,也会在DNS中产生多个指向同一个IP的A记录。产生该问题有多方面原因。当DHCP客户端在DNS中注册了自己的A记录后,当DHCP租约过期(默认为8天)后,DHCP就会对回收其IP,分配给别的客户端使用。
如果某客户端长期关机,例如PC1注册自己的A记录后,很长时间处于关机状态,该A记录会一致保存在DNS数据库中。虽然DNS提供了自动清理功能,但是该功能默认没有打开。实际上,当开启该功能后,会存在一定的风险,这种风险指的是DNS服务器可能会误删记录信息。那么当租约过期后,DHCP服务器将其回收后分配给PC2使用,PC2就会使用该IP注册自己的A记录,这样,两条A记录就会指向相同的IP。那么,当对PC1进行Ping探测时,从表面上看是没有任何问题的,但是在进行访问(例如登录远程桌面等),访问到的却是PC2。
如果在预先规划时,在地址池中的设置IP数量不够,出现众多客户端频繁抢用IP地址的情况,也会造成上述问题。例如当某些设备一段时间没有开机,其之前获取的IP已经分配给了其他主机,那么当其开机获取IP后,必然会注册自己的A记录,这样DNS就会产生多个A记录指向相同IP的状况。
对于规模较大的网络,上述情况很常见。将IP地址和MAC地址绑定,可以解决上述问题,例如在DHCP管理器左侧选择“IPv4→作用域→保留”项,在其右键菜单上点击“新建保留”项,将目标客户端IP和MAC地址绑定起来即可。
但对于数量众多不断变化的客户端来说,该方法操作起来很繁琐,如果打开DHCP作用域属性窗口,在“DHCP客户端租用期限”栏中选择“无限制”项,不再回收已经分配的IP,虽然也可以解决上述问题,但很容易耗尽该作用域中的IP地址。
比较好的方法是在作用域属性窗口中打开“DNS”面板,选择“始终动态更新DNS记录”项,让DHCP服务器为所有的客户端注册A和PTR记录,即A和PTR记录的所有者变成DHCP服务器。当然,对DHCP租期也需要进行合理设置。这样,当租约到期后,当DHCP服务器将对应的IP分配给其他客户端时,就会自动删除之前的A和PTR记录。但是,默认该配置是无效的。
因为在实际的企业网络中,为了防止单点故障,会使用多台DCHP服务器为客户提供服务。例如某客户从DHCP1服务器上获取IP,客户机自动注册A记录,DHCP1服务器为其注册PTR反向记录。当DHCP1服务器出现故障后,该客户就会向DHCP2服务器申请IP,但是原先的PTR记录的所有者为DHCP1服务器,所以DHCP2服务器无权对这些记录进行更改。为此可以打开Active Directory用户和计算机窗口,在其中创建一个普通的域账户(例如“dhcpgl”),其密码设置为永不过期。
之后选择双击名为“DnsUpdateproxy”的 组 账户,在其属性窗口中的“成员”面板中点击“添加”按钮,将上述“dhcpgl”账户添加进来,让其拥有代表客户端向DNS注册记录信息的权限。之后在DHCP管理器左侧选择“IPv4”项,在其属性窗口中的“高级”面板中的“DNS动态更新注册凭据”栏中点击“凭据”按钮,输入上述账户的名称和密码以及域名等信息,点击确定按钮保存配置信息。
如果存在多台DHCP服务器,在每台服务器上都执行同样的配置。如此即可解决上述问题。这样,在客户机上执行“ipconfig /renew”命令获取IP时,在DNS控制台上选择其注册的A或PTR记录,会发现其所有者为上述“dhcpgl”账户。但是,在实际使用时,会发现当客户端的DHCP租期过期后,DHCP服务器仅仅从控制台中删除了对应的IP,没有立即进行清理,对应的IP信息依然保存在DHCP数据库中。这样,过期的IP实际上没有进行真正的回收和重新分配。
对于DHCP服务器来说,其租期过期的宽限期为4小时,数据库清理间隔默认为1小时。也就是说,在默认状态下,当客户的IP租期过期后,要经过5个小时后,DHCP服务器才真正清理和回收,将其分配给其他用户。执行“regedit.exe”程序,在注册表编辑器中打开“HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesDHCPServerParameters”分支,在右侧双击 名 为“DatabaseCleanup Interval”的键值名,里面存储这DHCP数据库清理的间隔值,默认为60分钟,可将其修改合理的时间(例如1分钟)。在右侧窗口新建名为“LeaseExtension”,类 型为DWORD的键值名,作用是控制租期过期的宽限期,例如可以将其值修改为30,这样经过30分钟后,DHCP服务器就会将其标记为可删除状态,再经过预设的清理间隔后,就会将其回收并重分配。
除了利用DHCP服务器,来排除多个A记录使用同一IP的问题外,在DNS控制台中选择主机名,在其属性窗口中的“高级”面板中选择“启用过时记录自动清理”项,虽然可以实现DNS记录的老化和清理功能,不过默认其并没有处于选择状态,这和DNS记录的刷新和清理机制有关。TTL是DNS记录可以在客户端缓存中存储的时间,如果对应的DNS记录中的IP发生了变化,那么客户端缓存的DNS记录就与之匹配了。因此,当TTL时间到期后,客户端就会向DNS服务器发出新的请求,来查询对应的IP地址。
在DNS管理器中点击菜单“查看→高级”项,使其处于选中状态。当双击某条DNS记录时,自其属性窗口中的“生存时间(TTL)”栏中会显示其TTL值(默认为20分钟),管理员可以手动进行修改。当在客户端上执行Ping命名对目标主机进行探测后,执行“ipconfig /displaydns”命令,会显示具体的TTL时间(单位为秒)。DNS时间戳主要用来记录DNS记录创建的时间和后续刷新的状态,可以据此判断DNS记录是否老化。当创建DNS记录后,会产生时间戳信息。客户端会每隔24小时对DNS记录进行刷新,注意刷新可能成功也可能失败。
刷新是客户端对应DNS没有任何变化,仅仅是更新其时间戳信息。对于规模较大的网络中,存在多台DNS服务器,当大量客户端向DNS服务器发起更新请求后,不同DNS服务器之间会复制这些请求信息。这样会产生很大流量,在多数情况下,客户端的计算机名和IP地址都没有发生变化,而仅仅更新对应DNS记录的时间戳信息,在实际上没有太大的意义。如果开启了上述DNS老化和清理功能,就会激活非刷新间隔和刷新间隔两个参数。
对于前者来说,主要用来降低DNS复制流量,避免DNS记录被快速清除。在此期间(默认为7天),如果客户端仅仅是更新时间戳信息,那么DNS服务器是拒绝接受的。对于其他的更改请求,DNS服务器可以接受。
对应地,在刷新间隔(默认为7天)内,DNS服务器是可以接受客户端的时间戳刷新请求的。所以,如果客户端长时间(例如大于14天)处于关机状态,没有执行刷新操作,那么DNS服务器会认为对应的DNS记录是老化的,就会将其从DNS数据库中清除,这就很可能带来风险。当然,对于手工配置的静态DNS记录来说,DNS服务器是不会将其删除的。