我有两个不同的 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
挖给我:
$ 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
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
请注意,dig 的最终主机名 nstld.verisign-grs.com 解析为该 IP。
解决办法是什么?
更新: /etc/resolv.conf 有两个名称服务器行,每个行都有一个我从 ISP 获得的 IP(v4)。
但是,如果我在 resolv.conf 中添加一个“搜索”行,行为就会改变:如果“搜索 mydomain.com”(即我的真实域名),所有内容都会解析到它并且我会获得自己的 IP。例如,thisdomainsurelydoesntexist.com.mydomain.com。不好。但是,如果我将它设置为其他内容,例如“search 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
我的 ISP 刚刚告诉我这可能是因为我的主机名的格式是“mydomain.com”而不是“myhost.mydomain.com”(这是他们推荐的做法)。我可以看到如何解决它。这是要做的事吗?没有缺点吗?
另外,非常重要的是,我应该提到这个 python 代码的工作方式与 ping 相同:
import _socket
_socket.getaddrinfo('thisdomainsurelydoesntexist.com', 80)
许多其他 python 模块都建立在这个核心之上。
当服务器的主机名是域名时,系统(特别是处理名称解析的 glibc)行为不稳定。从 resolv.conf 的手册页:
搜索列表通常由本地域名确定;默认情况下,它仅包含本地域名。
简单来说,这意味着当域查找失败时(在 /etc/hosts 中没有任何结果并且解析器无法返回有用的结果之后)系统将继续愉快地删除主机名的第一部分 - 例如 ' abcxyz.com' - 并将其余部分附加为搜索后缀。
由于“.com”是通过从主机名中删除“abcxyz”而生成的搜索后缀,系统将附加“.com”作为失败查找的搜索后缀,这会产生如下结果:
foobar-abcxyz.cz -> foobar-abcxyz.cz.com -> www.czjewelry.com
foobar-abcxyz.com -> foobar-abcxyz.com.com -> www.cnet.com
要纠正此问题,您可能希望将服务器的主机名设置为主机名,例如“hostname.abcxyz.com”而不是“abcxyz.com”——这将导致“abcxyz.com”被附加为默认的搜索后缀。
作为临时措施,您可以创建随机 MD5 校验和并将其添加到 /etc/resolv.conf 作为搜索后缀的覆盖:
这会将“e930f5f4ba6ba7868b0cc6718bcef568”附加到失败的 DNS 查找而不是“.com” - 这反过来会导致对不存在的域进行失败查找的默认行为。如果您将主机名更改为实际主机名,则可以删除此行。
一些名称服务器故意为不存在的域返回 IP。ISP 因这样做而臭名昭著——他们实际上可以通过在不存在的域的登录页面上提供的广告获利。
您始终可以更改您的 resolv.conf 文件以使用已知肯定不会表现出此行为的公共 DNS 服务器。Google 的 DNS(8.8.8.8 和 8.8.4.4)和 Level3 的 DNS(4.2.2.1 到 4.2.2.6)都提供公共 DNS 访问并且不重定向未知域。(来源:https ://www.grc.com/dns/alternatives.htm )
在我看来,您正在使用使用通配符 DNS 的网络。这意味着如果地址失败,它会自动将您重新路由到该 IP 地址。您可以通过在网络浏览器中进行搜索来对此进行测试。当它失败时,它会将您重定向到某个由您的 ISP 处理的赞助搜索页面。