分享

DNS的麻烦

2012-02-21  99学无涯   |  转藏
   

 尽管DNS服务非常基础也很简单,但也会经常出现一些问题。通常,各种Windows对话框中的不清晰字眼或没有解释说明的选项可能会导致这些问题。下面我们来看看一些常见的经常困扰管理员的DNS问题,以及如何解决它们。

动态更新,并没有更新
Windows允许客户端通过DNS服务器动态更新A和PTR记录,以简化跨域的DNS管理。因此在集成的AD区域里,在组织中分配IP地址时,客户端机器可以使用自己新的IP地址来动态更新AD。不过有时你可能会留意到客户端系统并没有正确地使用新地址更新DNS记录。要保证该更新能顺利进行,必须在DNS服务器上配置允许动态更新。按照以下步骤操作,打开DNS区域的属性设置,在“动态更新”设置处选择“Secure only”,如图1所示。

图1:在DNS服务器上配置允许动态更新

下一步,在客户端上,打开网络适配器的高级TCP/IP设置对话框,切换到DNS选项卡,如图2所示,选中“在DNS中注册此连接的地址”。

图2:在客户端上配置“在DNS中注册连接的地址”

最后,DHCP客户端服务——它不仅仅是DNS客户端服务——可以处理DNS注册,该服务必须在每个系统上运行。即使你没有使用DHCP来分配IP地址,也需要在每台机器上运行DHCP客户端服务,这样才能动态更新DNS记录。
默认设置下,客户端会在以下几个时间更新DNS记录:机器启动时,IP地址或机器名更改后;使用ipconfig /registerdns命令行强制更新时。此外,客户端每24小时会重新注册IP地址。

DNS客户端服务导致性能下降
在DNS客户端服务启动时,它会将hosts文件中的所有入口加载到缓存中。如果hosts文件很大,例如用来阻止一些不希望访问的主机名,此时你会发现这个服务会显著降低系统的性能。这种情况你可能想禁用该服务。
不过,通常禁用DNS客户端服务对DNS查找并没有影响。这时你可能会产生疑惑,为什么要最先运行这个服务呢?
答案是DNS客户端服务对于名称解析来说并不是必需的;它只是让名称解析更为智能和高效。DNS客户端服务的主要目的是为DNS入口点提供本地缓存。实际上,这个服务本身就是一个DNS服务器。它只是简单地将之前解析过的DNS记录缓存下来,以提高以后的查找效率,而不是使用DNS记录数据库来存储。除了缓存之外,该服务还能通过网络位置、速度和可用性对资源记录进行先后排序,从而优化网络连接。
DNS客户端服务还对系统中配置的DNS服务器列表进行管理。和它对资源记录的处理类似,它会根据网络位置、速度和可用性,在DNS服务器列表中选择最优的服务器。

防火墙规则需要优化
通过防火墙将DNS服务器发布到公众网时,你需要建立一套规则来保护你的配置。DNS查询通常由UDP 53端口进入,源端口则通常大于1023。DNS服务器在53端口响应,并回传到客户端之前使用的端口上。大多数的状态防火墙可以处理DNS响应,因此一个简单的规则就基本上可以管理所有请求。
如果查询的响应大于512字节,DNS服务器会告知客户端,响应被截断。然后客户端可以通过扩展DNS(Extended DNS)重新提交该请求,它允许大的UDP响应;或客户端可以通过TCP重新提交请求。如果要允许TCP查询,还需要一个规则允许源端口大于1023的TCP 53端口的流入通信。如果你知道DNS服务器并不会返回超过512字节的查询响应,这个端口就可以关闭。一些DNS服务器使用UDP或TCP 53端口作为服务器间查询的源和目标端口,因此在防火墙上还要再加上这个配置。

Windows是如何查找多台DNS服务器的
默认设置下,Windows首先会在首选网络适配器上查询DNS服务器列表中的第一个。如果该服务器在1秒内没有响应,Windows会将查询发送给系统其它网络适配器上的第一个DNS服务器。如果在两秒内没有响应,Windows会将查询发送给系统中所有网络适配器上配置的所有DNS服务器。如果两秒内仍然没有一台响应,Windows会向所有服务器重发一次查询,并等待4秒。如果有必要,它会再次重发并等待8秒。
Windows会根据网络情况重新调整它查询过的DNS服务器列表。如果没有一台DNS服务器有响应,Windows会认为网络连接失败,30秒内不会再对任何服务器进行请求。如果其中一台DNS服务器返回了拒绝的响应,Windows不会再请求该适配器上的任何其它服务器。此外,Windows可能会根据服务器响应的速度来调整DNS服务器的顺序。
如果要为客户端系统配置很多DNS服务器,你很可能希望一个比Windows GUI界面更高效简单的办法。可以在命令行中试试这些命令。以下命令可以列出客户端上配置的所有DNS服务器:
c:\>netsh interface ip show dns
要清除某个网络适配器上的DNS服务器,输入以下命令(假定网络适配器名为“Local Area Connection”):
c:\>netsh interface ip set DNS "Local Area Connection" static none
要向网络适配器添加DNS服务器,输入以下命令(假定网络适配器名为“Local Area Connection”):
c:\>netsh interface ip set DNS "Local Area Connection" static 192.168.0.1

域中的DNS问题
在进行DNS设置时可能会遗漏某个配置,这个问题在Windows域中很常见。一种快速检测设置的方法是执行对域名的查询,使用以下命令:
c:\>nslookup <yourdomain>
该命令应该会返回一个IP地址列表,它们分别对应到每台DC。如果还返回了其它东西,那你就要检查一下DNS的设置了。
另外一种检测DNS配置的方法是,在任何一台Windows XP或Windows Server 2003系统上执行一个快速网络配置测试。输入以下命令:
c:\>netsh diag show test
该测试会对所有TCP/IP中配置的DNS服务器和网关进行ping测试。如果你有Microsoft Windows Server 2003资源工具包,还可以使用netdiag或dnsdiag命令作为替代命令,如下所示:
C:\>netdiag /test:dns 

C:\>dnsdiag
如果想从外网测试公共的DNS服务器,可以使用以下URL:
。要测试远程DNS服务器是否允许区域转移(Zone Transfers),使用以下命令:
c:\> echo ls -d <targetdomain>
| nslookup - <nameserver>
如果名称服务器允许在域中进行区域转移,它会返回该区域中的所有记录。否则会返回错误。

BIND是缩写,而不是动词
在DNS服务器的属性对话框中,可以找到BIND Secondaries设置。BIND并不是动词——而是Berkeley Internet Name Domain的缩写,它是DNS的一种实现方法,用于在Internet上处理DNS请求。
在执行区域转移时,DNS服务器会使用一种更快的区域转移方法,它可以利用压缩在每条TCP消息中传输多条记录。这种格式与旧版本的BIND并不兼容。如果使用4.9.4之前的BIND版本,你需要选择BIND Secondaries选项。这一选项可以让Windows DNS服务器不使用快速区域转移方法。

何时禁用递归
递归是DNS在域中沿着授权服务器向下遍历的过程。如果你向一台DNS服务器查询域中的某个主机名,而该服务器并不是该域的授权服务器,而且在缓存中也没有该主机记录,这台服务器就会代你在Internet上递归查询其它服务器,从而返回正确的响应。如果服务器没有执行递归,它会告知客户端未知记录或应该去哪里查询该记录。
应该在何时禁用递归呢?需要查看该DNS服务器上所存储的记录的类型。如果DNS服务器记录了域中的所有记录,那就不再需要递归。例如,DC上存储了域中的所有主机,所以DC就没有必要再向其它服务器发送请求。对于存储了所有已知域名记录的公共DNS服务器来说也是一样的。
在那些向本地用户提供DNS查询的服务器上,通常应该开启递归。也就是说,如果要向用户提供Internet访问,那就还需要提供递归DNS服务器,用于解析所有Internet主机名。
注意要保证递归服务器仅对内部有效,对组织外部无效。否则服务器可能被攻击,并可能被用来作为DDoS攻击(Distributed Denial of Service,分布式拒绝服务)的放大器。

阻止Internet主机
下面描述的问题其实并不一定要用DNS,但DNS可以起到一部分作用。可以使用防火墙或代理服务器来阻止用户访问一些不需要的Internet主机,但这些解决方案在有的场景并不适用。例如,某个ISP可能需要阻止某些主机名,同时不想要求客户必须使用代理服务器或加重防火墙的负载。这时可以采用以下的替代方案,在DNS服务器上阻止主机名。
要使用这种方案,首先要准备好要阻止的主机名列表。可以在恶意软件阻止列表的网站上获取到Microsoft DNS服务器格式的列表:。可以直接将这个阻止列表导入到DNS服务器。如果你想重新进行格式调整,可以从hpHosts Online()或Spamassassin Blacklists()获取阻止列表。
另外一种方法是OpenDNS(),这是一个免费的DNS服务,它能提供域名过滤,将已知的钓鱼网站都阻止掉了。要使用OpenDNS,只需要将它的DNS服务器IP地址配置到网络中即可。
注意使用DNS阻止访问的方法只能通过名称来阻止这些列表。无法阻止用户通过IP地址来访问,新增的主机名如果没有在列表中,也不能被阻止掉。

同时使用Round-Robin循环和Netmask Ordering
在Windows DNS服务器上可以同时启用round-robin循环和netmask ordering特性。通常像www.microsoft.com的域名会有很多个IP地址,以便提高负载均衡和性能。这些IP地址对同一台服务器或某个点来说,路径可能不一样,因为它们对应的服务器在地理位置上都是分散的。
对于负载均衡的DNS请求,DNS服务器使用round-robin循环算法在IP地址列表中查找,有效地将通信分布到不同服务器上。利用netmask ordering技术,DNS服务器会试图返回与客户端最近的主机IP地址。DNS服务器通过对IP地址的前8个字节进行判断,并认为相差最少的服务器IP和客户端IP在物理位置上最近。默认情况下,DNS服务器会为处于相同Class C网络的所有主机地址标上优先级,与客户端的处理类似。
尽管看上去好像round robin和netmask ordering无法同时应用,但Windows仍然可以同时启用这两个特性,如图3所示。同时启用这两个选项时,Windows会检查主机的IP列表,找出与客户端IP最相近的。如果Windows找到了匹配的IP,这个IP地址在round robin时的优先级就会最高。这样DNS服务器在为IP地址做round robin循环时,使用的算法是变种的round robin,因为它会偏向于那些看上去离客户端最近的IP地址。

图3:同时启用round robin和netmask ordering特性

在AD中集成DNS
在DC上安装DNS时,可以选择将区域文件存储在AD数据库中,而不是简单的文本文件中。这时你可能会问,为什么要将区域集成到AD中呢?
在大多数情况下,在AD中集成DNS区域有很多优点,最重要的一点是改进复制。在集成到AD的区域中,AD可以自动地在服务器间对DNS记录进行安全复制。AD复制是多主控的复制,也就是说你可以在任何一台DC上做修改,这些修改都会自动在域中进行复制和传播。对于没有集成到AD的DNS区域来说,必须设置主从DNS服务器。在进行更改时,通常必须在主服务器上做修改,这样才能更新所有从服务器。
附文“DNS-AD大营救”通过一个实例讲述了如何排除由于DNS导致的AD故障。

学习基本原理
DNS问题通常可以使用一些简单的办法解决,但你还是需要对DNS的工作原理有一个清晰的认识。对任何IT人员来说,花一定的时间了解DNS知识是非常值得的。


附文:
DNS-AD大营救
我是如何解决由于一位管理员无计划的升级所导致的DNS-AD混乱的

在我上中学时,我拿到了潜水证书。在这个课程中学到的最重要的一点是:平静,深思,在跳水前做好计划。忽略这些细节可能会失败,甚至可能死亡。我们的老师有一句话:计划后再潜水,潜水时执行计划(Plan you dive,dive your plan)。
对于网络管理员执行大量的升级或者应用可能影响现有产品的新技术时,同样的道理也适用。而我经常看到相反的情形,能力很强的技术工程师由于缺少一个明确定义好的执行计划,将自己逼入了死角。他们只是简单地放入升级光碟,双击安装文件,然后按照安装向导执行操作。这种方法几乎都会导致灾难。
这种情况最近在我认识的一位管理员身上发生了,他试图将Windows NT 4.0域升级到Windows Server 2003的AD。他从事网络管理的经验还比较少,并没有意识到一个完善的计划是非常重要的。最后,他向我求助,但那时已经导致主机名无法正确解析,组策略无效,事件日志中满是错误。
开始我们通过网上论坛、邮件讨论这些问题,后来直接通过电话。从他所描述的情况来看,似乎是DNS和AD无法进行相互通信。这里我会介绍我是如何解决这个问题的(在一个周末解决的)。

AD-DNS的混乱
我发现了以下这些AD和DNS问题(还有其它的,但那些是次要的):
 DCs没有指向一台DNS服务器。
 AD DNS资源记录(RRs)——_msdcs, _sites, _tcp,以及_udp——都丢失了。
 DNS没有被设置为接受动态更新。
 客户端被指向到ISP的DNS服务器,而不是内部DNS服务器。
这位管理员不清楚DNS在AD环境中的重要程度。没有DNS就意味着没有AD。AD和DNS入口都是空的,通过这一点我可以向管理员强调DNS的重要性,以及DNS的工作原理。在每台DC上配置好所有正确的DNS设置后,我们开始着手解决下一个问题:丢失的RRs。
在查看域中的DNS区域时,马上就发现有问题。我不能立即就解决这个问题,因为我要先回到测试域中,将两个环境的设置进行对比。问题马上就显露出来,就像手指的刺痛一样尖锐,他的域中并没有所需的RRs!这次历险更刺激了。我让他将DC重启,满以为丢失的信息会重现。但是重启并没有恢复这些丢失的RRs,因此下一步是让管理员重启Netlogon服务,在命令行中输入以下命令:
net stop netlogon
net start netlogon
仍然没有RRs。之后我去寻找微软的帮助和支持,找到这篇文档“How to reinstall a dynamic DNS Active Directoryintegrated zone”(http://support.microsoft.com/?kbid=294328)。我们按照文中所描述的步骤,彻底将DNS删除,并重新安装。这个过程比较顺利,问题解决了。

更多的DNS问题
我们发现的第三个问题——DNS没有被设置为接受动态更新——这个问题可能是某些PC无法正确获取IP地址的原因之一。PC在DNS中有入口,而在PC的IP地址被DHCP修改后这些入口并没有更新。解决的方法很简单,将客户端配置为允许DNS动态更新。
现在还有最后一个问题,在从NT向AD升级时我见到过很多这种问题。在NT中,通常没有理由用DNS来解析主机名;我们只是使用WINS来解析NetBIOS名称。DNS那时只是在用IE访问Internet时用于解析Internet名称。这个过程在NT环境中能正常运行,但升级到AD需要调整。客户端计算机需要DNS来指向一台内部DNS服务器,以便一些AD服务如组策略等可以正常工作。在Windows 200x中,一切都依赖于DNS。

环境正常了
花了好几天我们才将网络中所有的小问题都解决掉,最后网络运行得非常流畅。尽管在执行每个主要操作系统升级时,你无法预见到每个可能发生的网络问题,但以我的经验来说,定制一个详细的升级计划——并执行该计划——可以有效地避免各种烦恼管理员的问题。

评论
安装AD之后,对新的DC上运行的DNS服务器操作时,可以使用两种存储和复制区域的选项:
使用基于文本文件的标准区域存储。按这种方式存储的区域位于.Dns文件中,这些文件存储在运行DNS服务器的每台计算机上的systemroot\System32\Dns文件夹中。区域文件名称与创建区域时为区域选择的名称相对应,如区域名称为example.microsoft.com时的Example.microsoft.com.dns。
使用AD数据库的目录集成区域存储。按这种方式存储的区域位于域或应用程序目录分区下的AD树中。每个目录集成区域都存储在按照创建该区域时为它选择的名称标识的dnsZone容器对象中。
一旦将DNS与AD进行集成,DNS 控制台便可提供访问控制列表(ACL)的编辑功能,这样就可为指定的区域或资源记录添加或删除来自ACL的用户或组。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 全屏 打印 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多