nslookup与Resolve-DnsName的行为差异

在Windows操作系统上,nslookup命令和PowerShell上的Resolve-DnsName cmdlet都可以用于解析域名,但它们的功能并非完全相同。有时候,nslookup命令能够解析域名,Resolve-DnsName cmdlet却不能。甚至于明明用nslookup能够解析域名,浏览器却不能上网,系统也报告无法连接到域控制器。

考虑下面这样的网络配置:

  • 接口1:
    • 地址:192.168.0.2
    • 掩码:255.255.255.0
    • DNS服务器:10.248.0.1
  • 接口2:
    • 地址:10.248.0.2
    • 掩码:255.255.0.0

其中,接口1上设置的DNS服务器只能通过接口2访问,接口2上没有设置DNS服务器。

分别使用nslookup和Resolve-DnsName发现,虽然nslookup能够很快显示出域名解析结果,但Resolve-DnsName却报告连接超时。此时,浏览器无法上网,也无法连接到域控制器。

通过Wireshark抓包发现,使用nslookup时DNS请求通过接口2发出,使用Resolve-DnsName时DNS请求通过接口1发出。那么显然,Resolve-DnsName的DNS请求无法被响应,从而最终发生超时。

这种情况可能是两者对多个网络接口的处理方式区别导致的。nslookup对于不同网络接口上设置的DNS服务器,都从系统层面发送DNS请求。Resolve-DnsName在每个网络接口上只使用该网络接口上设置的DNS服务器。

为了解决这个问题,需要将DNS服务器设置在可以访问该DNS服务器的网络接口上:

  • 接口1:
    • 地址:192.168.0.2
    • 掩码:255.255.255.0
  • 接口2:
    • 地址:10.248.0.2
    • 掩码:255.255.0.0
    • DNS服务器:10.248.0.1

这样设置之后,Resolve-DnsName命令就可以正常解析域名了,浏览器和域控制器也能正常工作了。