我有两个不同的 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 给了我:
$ 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。不太好。但是,如果我将其设置为其他内容,例如“搜索 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模块都是基于这个核心构建的。
答案1
当服务器的主机名是域名时,系统(特别是处理名称解析的 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 作为搜索后缀的覆盖:
uuidgen | md5sum
e930f5f4ba6ba7868b0cc6718bcef568 -回显“搜索 e930f5f4ba6ba7868b0cc6718bcef568”>>/etc/resolv.conf
这会将“e930f5f4ba6ba7868b0cc6718bcef568”附加到失败的 DNS 查找中,而不是“.com” - 这反过来会导致对不存在的域的默认查找失败。如果您将主机名更改为实际主机名,则可以删除此行。
答案2
一些域名服务器会故意返回不存在域名的 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)
答案3
在我看来,您使用的网络使用了通配符 DNS。这意味着如果某个地址失败,它会自动将您重新路由到该 IP 地址。您可以通过在 Web 浏览器中进行搜索来测试这一点。如果失败,它会将您重定向到您的 ISP 正在处理的某个赞助搜索页面。