递归查询是DNS服务器代客户端完成全部查询过程,客户端仅发送一次请求;迭代查询则是DNS服务器间逐级询问,只提供线索不直接返回答案。
递归查询不是“客户端自己查”,而是DNS服务器替你跑腿
很多人误以为递归查询是电脑自己一层层去问根、问.com、问baidu.com——其实不是。真实情况是:你的电脑只向本地dns服务器(比如192.168.1.1或8.8.8.8)发一次请求,并明确说:“请把www.example.com的ip给我,别让我操心”。后面所有步骤——查根、跳tld、找权威服务器——全由这台dns服务器代劳。它查完再把结果塞给你,中间你干等就行。
常见错误现象:nslookup www.example.com 192.168.1.1 返回超时,但换用nslookup www.example.com 8.8.8.8却很快成功 → 很可能你本地那台DNS(比如Windows Server上的DNS服务)没开递归,或被防火墙拦了出站UDP 53。
- 检查是否启用递归:
Get-DnsServerRecursion(PowerShell),返回EnableRecursion : True才算开 - 禁用递归后,
Get-DnsServerRootHint必须有有效条目,否则连迭代都走不动 - 别在生产环境留默认配置:Windows DNS角色安装后默认允许任意IP递归,极易被当成DNS放大攻击跳板
迭代查询是“DNS服务器甩手不负责”,只给线索不给答案
迭代查询发生在DNS服务器之间,比如你本地的Windows DNS服务器去问根服务器时,用的就是迭代。根服务器不会帮你继续往下查,只会回一句:“你要查.com?去找a.root-servers.net(IP: 198.41.0.4)”——然后你得自己拿着这个IP再去问。
使用场景:当你在PowerShell里手动执行Resolve-DnsName www.example.com -Server 198.41.0.4 -Type A -DnsOnly,就是在模拟一次迭代查询;它强制跳过缓存和递归逻辑,直连指定服务器问“你知道吗?不知道就告诉我谁可能知道”。
- 参数差异:
-DnsOnly绕过hosts和NetBIOS;-NoHostsFile忽略本地%SystemRoot%\System32\drivers\etc\hosts - 性能影响:迭代本身不慢,但手工链式调用(查根→查TLD→查权威)会显著拖长总耗时,不适合客户端直用
- 兼容性注意:某些老旧防火墙会拦截非标准端口或非常规查询类型(如
NS、SOA),导致迭代中途断链
Windows Server DNS禁止递归后,转发器配置决定生死
关掉递归(勾选“禁止递归”)不是终点,而是起点。此时DNS服务器不再自己查,只能靠转发器把请求“转包”出去。如果转发器配错、超时太长或上游不可达,所有解析就卡死。
容易踩的坑:Set-DnsServerForwarder只设了一个IP(比如只写114.114.114.114),结果该DNS宕机,整个内网就上不了外网——因为Windows默认不自动切备选,除非你显式加第二个。
- 必须配置至少两个转发器:
Set-DnsServerForwarder -IPAddress 114.114.114.114,8.8.8.8 - 务必设置超时:
Set-DnsServerForwarder -TimeoutSec 3,避免某台转发器僵死拖住全部请求 - 转发器IP必须能被DNS服务器本机访问:检查
Test-NetConnection 114.114.114.114 -Port 53是否通,别只看ping
缓存污染和根提示失效,比配置错误更难排查
Windows DNS服务运行久了,root hints列表可能残留已下线的根服务器IP(比如老版本还留着f.root-servers.net的IPv4地址,但它早迁到IPv6了),或者缓存里存着TTL过期却没及时清理的记录。这时候nslookup看起来一切正常,但部分域名就是解析失败,且无明确报错。
典型表现:Resolve-DnsName example.com -Server 127.0.0.1偶尔失败,重启DNS服务后又恢复;Get-DnsServerCache显示大量TimeToLive为0但状态仍是Active的条目。
- 清缓存不是万能解药:
Clear-DnsServerCache只是清内存,重启服务才能重载root hints - 验证根提示有效性:
Get-DnsServerRootHint | Where-Object {$_.IPAddress -match '^\d'}筛出IPv4条目,再逐个Test-NetConnection探测 - 计划任务建议:
Schtasks /Create /SC WEEKLY /TN "DNS-Cache-Clean" /TR "powershell -Command Clear-DnsServerCache",但别设在周一早高峰
Get-DnsServerCache | Measure-Object看条目数趋势,才抓得住。










