nslookup不行但ping行?
比较奇怪的问题
大家先来看这么一个截图:
![](https://img2022.cnblogs.com/blog/379997/202208/379997-20220824230928961-1041430697.png)
ping主机名可以通,IP地址也解释出来了,但nslookup反倒解释不出来。这是个比较罕见的问题,反过来nslookup能解释,但ping不通倒是很常见。
经过一番分析后终于找到了原因,写此文总结一下。
nslookup
nslookup一定使用DNS协议,它不会尝试用其它协议来解释主机名。
这点我是通过wireshark来确认的。顺便说一下,wireshark真是网络分析的利器。
那是不是nslookup只能解释出带点的域名,对于不带点的主机名解释不出?——非也。nslookup不管带不带点,都尝试去问DNS服务器。在一个局域网中,DNS通常也被设置为路由器的地址,而路由器通常也同时负责IP地址的分配(用DHCP),它了解每一台主机的主机名,以及当前的IP地址,如果DNS服务器被设置为路由器的话,那路由器就可以直接把主机名翻译为IP地址,因为它知道啊,如它会将“jgg-ws”这主机名解释为“172.19.1.136”。所以我们nslookup jgg-ws的时候,非常顺利,没啥问题。
记住,nslookup是用来调试DNS协议的,它不会使用NBNS来尝试解释主机名。要验证很简单,你手工把网络适配器的DNS改为114.114.114.114(中国电信提供的DNS服务器),然后nslookup一下局域网里的一台主机,你就发现行不通了,因为114.114.114.114并不了解你局域网的主机。
ping
我们通常用ping来检测网络通不通,其实这并不一定好用,因为你尝试ping的主机不一定会响应你的请求,尽管网络是通的。ping可以使用主机名作为目标地址,它会自动将主机名转为IP地址,这个过程就比nslookup只用DNS要来得复杂一些了。
我研究下来(对,也是用wireshark研究的)发现ping获得目标IP地址的方式有几种:
1,和nslookup一样,使用DNS
2,使用NBNS(NetBIOS Name Service,相当古老的技术了,以前网上邻居使用的就是NetBIOS通信协议,微软一直保留着它)
3,使用mDNS(是一个零配置的DNS,利用了TCP/IP的“组播”实现,它不依赖于专门的DNS服务器,是局域网中获得目标主机IP地址的一种手段,感觉与NBNS有点像)
4,hosts文件(这个文件在C:\Windows\System32\drivers\etc目录下)
特别值得注意的是,ping对于如何获取主机名/域名的IP地址,还有以下规则:
1,对于“不带点”的主机名,ping认为这是局域网内的主机,而不是域名,所以它会尝试通过NBNS和mDNS来寻找,如:jgg-ws,这个主机名,就是个不带点的主机名,ping是不会通过DNS来解释它的
2,对于“带点”的主机名,正好相反,ping尝试通过DNS来解释它,就是询问DNS服务器,而不用NBNS和mDNS。如“jgg-ws.lan”这个主机名,ping会尝试通过DNS来解释它(通过ipconfig /all命令我们能看到各个网络适配器对DNS服务器的设置)
对于这个规则,如果我们一定想用DNS来解释主机名,那么可以给主机名加上点,如jgg-ws.lan。另外,OpenWRT这个路由器操作系统竟然非常贴心地想到了这点,看图吧:
![](https://img2022.cnblogs.com/blog/379997/202208/379997-20220824230928977-1583230483.png)
这样设置后,OpenWRT自动给局域网里各主机自动加上.lan的后缀,并且OpenWRT的DNS服务遇到.lan的域名就直接解释而不forward。这么一来,我们不需要给局域网中每台主机都加“点”了,直接用域名“jgg-ws.lan”就能访问到主机,ping也没问题。
我研究下来还发现,ping的规则也是Windows的应用程序获得目标主机IP地址的通用规则。另外,hosts文件优先级最高,这个大家都知道了吧。
nslookup不行,只说明DNS不行,而ping则可以通过其它手段获得目标的IP地址,所以存在nslookup不行而ping行的情况。
对奇怪问题的解释
读到这里,似乎一开始提到的那个奇怪的问题已经有满意的答案了。但后来我发现并非如此。
我的电脑上有多个网络适配器,其中有一个是有线网卡,还有一个是VPN的虚拟网卡,两个网络适配器具有不同的DNS配置。
![](https://img2022.cnblogs.com/blog/379997/202208/379997-20220824230928961-608384031.png)
用有线网卡的DNS(172.19.1.1)是解释不了code.njtdev.com的,得用VPN虚拟网卡的DNS(10.186.99.1),我抓包发现了nslookup只询问了有线网卡的DNS,而忽略了VPN虚拟网卡的DNS,所以导致nslookup解释失败,而ping则两个网卡都问了一次。所以,这个问题在于nslookup的工作方式,大家理解了吧。这也说明了一点:nslookup解释不了某个主机名,还真未必能说明DNS配置不正确。
总结
所以,这个奇怪的问题并不需要去解决,它不影响我们的使用,只是nslookup看起来有点问题而已。总结如下:
1,nslookup用DNS解释主机名/域名,而ping则用多种方式
2,如果路由器(准确说是局域网内DNS服务器)支持,局域网里的主机名到IP地址的解释也都可以用DNS来实现
3,如何解释主机名/域名为IP地址,不同程序可能有不同的做法,要具体问题具体分析
4,nslookup似乎只询问默认网卡的DNS,导致某些主机名看起来解释不了(这点有一定存疑,也可能是我电脑某个配置导致的)
5,wireshark是解决问题的利器