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 模块都建立在这个核心之上。
当服务器的主机名是域名时,系统(特别是处理名称解析的 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' - 这反过来会导致对不存在的域的查找失败的默认行为。如果您将主机名更改为实际主机名,则可以删除此行。