nslookup 失败,但对不存在的域 ping 成功

Jim*_*imB 2 networking domain-name-system freebsd ping nslookup

我有两个不同的 FreeBSD 服务器(不同的托管公司),它们都表现出相同的行为:它们为每个不存在的域选择一个特定的 IP 地址 (216.239.120.238)。

nslookup 失败,因为它应该......

$ nslookup thisdomainsurelydoesntexist.com
Server:         xx.xx.229.3
Address:        xx.xx.229.3#53

** server can't find thisdomainsurelydoesntexist.com: NXDOMAIN
Run Code Online (Sandbox Code Playgroud)

挖掘给我:

$ dig thisdomainsurelydoesntexist.com

; <<>> DiG 9.6.-ESV-R5-P1 <<>> thisdomainsurelydoesntexist.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 51717
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;thisdomainsurelydoesntexist.com. IN    A

;; AUTHORITY SECTION:
com.                    900     IN      SOA     a.gtld-servers.net. nstld.verisign-grs.com. 1370378827 1800 900 604800 86400

;; Query time: 23 msec
;; SERVER: xx.xx.229.3#53(xx.xx.229.3)
;; WHEN: Tue Jun  4 16:05:02 2013
;; MSG SIZE  rcvd: 122
Run Code Online (Sandbox Code Playgroud)

和 ping 给了我:

$ ping thisdomainsurelydoesntexist.com
PING phx2-ss-5-bug616849-lb.cnet.com (216.239.120.238): 56 data bytes
64 bytes from 216.239.120.238: icmp_seq=0 ttl=244 time=25.733 ms
64 bytes from 216.239.120.238: icmp_seq=1 ttl=244 time=20.460 ms
^C
--- phx2-ss-5-bug616849-lb.cnet.com ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 20.460/23.096/25.733/2.637 ms
Run Code Online (Sandbox Code Playgroud)

请注意,dig 的最终主机名 nstld.verisign-grs.com 解析为该 IP。

有什么解决办法?

更新: /etc/resolv.conf 有两个名称服务器行,每个行都有一个我从 ISP 获得的 IP(v4)。

但是如果我在 resolv.conf 中添加一个“搜索”行,行为就会改变:如果“搜索 mydomain.com”(即我的真实域名),一切都会解析到它,我得到我自己的 IP。例如,这个域肯定不存在.com.mydomain.com。不好。但是,如果我将其设置为其他内容,例如“搜索 myispdomain.com”,则一切正常:现有域解析,不存在的域不解析。

但这只是意外吗?

感谢您的建议!这里是host -a,xx.xx.80.18 IP是/etc/resolv.conf中的第一个名称服务器

$ host -a thisdomainsurelydoesntexist.com
Trying "thisdomainsurelydoesntexist.com"
Received 122 bytes from xx.xx.80.18#53 in 13 ms
Trying "thisdomainsurelydoesntexist.com"
Host thisdomainsurelydoesntexist.com not found: 3(NXDOMAIN)
Received 122 bytes from xx.xx.80.18#53 in 0 ms
Run Code Online (Sandbox Code Playgroud)

我的 ISP 刚刚告诉我这可能是因为我的主机名的形式是“mydomain.com”而不是“myhost.mydomain.com”(这是他们推荐的做法)。我可以看到这可能如何解决它。这是要做的事情吗?没有缺点吗?

另外,非常重要的是,我应该提到这个 python 代码的工作方式与 ping 相同:

import _socket
_socket.getaddrinfo('thisdomainsurelydoesntexist.com', 80)
Run Code Online (Sandbox Code Playgroud)

许多其他 Python 模块都建立在这个核心之上。

Tai*_*une 6

当服务器的主机名是域名时,系统(特别是处理名称解析的 glibc)行为不稳定。从 resolv.conf 的手册页:

搜索列表通常是根据本地域名确定的;默认情况下,它只包含本地域名。

简单来说,这意味着当域查找失败时(在 /etc/hosts 中没有任何结果并且解析器未能返回有用的结果之后)系统将继续愉快地删除主机名的第一部分 - 例如' abcxyz.com' - 并将剩余部分附加为搜索后缀。

由于“.com”是通过从主机名中删除“abcxyz”而产生的搜索后缀,因此系统将附加“.com”作为查找失败的搜索后缀,从而产生如下结果:

foob​​ar-abcxyz.cz -> foobar-abcxyz.cz.com -> www.czjewelry.com

foob​​ar-abcxyz.com -> foobar-abcxyz.com.com -> www.cnet.com

为了纠正这个问题,您可能希望将服务器的主机名设置为主机名,例如“hostname.abcxyz.com”而不是“abcxyz.com”——这反过来会导致“abcxyz.com”被附加为默认搜索后缀。

作为临时措施,您可以创建一个随机 MD5 校验和并将其添加到 /etc/resolv.conf 作为搜索后缀的覆盖:

uuidgen | md5sum
e930f5f4ba6ba7868b0cc6718bcef568 -

回声“搜索e930f5f4ba6ba7868b0cc6718bcef568”>>/etc/resolv.conf

这会将 'e930f5f4ba6ba7868b0cc6718bcef568' 附加到失败的 DNS 查找而不是 '.com' - 这反过来会导致对不存在的域的查找失败的默认行为。如果您将主机名更改为实际主机名,则可以删除此行。