我有两个不同的FreeBSD服务器(不同的托pipe公司),都performance出相同的行为:他们为每个不存在的域select一个特定的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 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.comparsing为该IP。
什么是修复?
更新: /etc/resolv.conf有两个名称服务器行,每个都有我从ISP获得的IP(v4)。
但是如果我向resolv.conf添加一个“search”行,行为就会改变:如果“searchmydomain.com”(即我的真实域名),一切都解决了,我得到自己的IP。 比如说,这个域名是www.texist.com.mydomain.com。 不好。 但是,如果我将其设置为其他内容,如“searchmyispdomain.com”,则一切正常:现有域名parsing,而不存在域名parsing。
但那是什么意外?
感谢您的build议! 这里是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模块都build立在这个核心上。
系统(尤其是处理名称parsing的glibc)在服务器的主机名是域名时performance不正常。 从resolv.conf的手册页:
search列表通常由本地域名确定; 默认情况下,它只包含本地域名。
简单来说,这意味着当一个域查找失败时(在/ etc / hosts中没有任何东西出现,parsing器无法返回有用的结果),系统将继续愉快地移除主机名的第一部分 – 例如“ abcxyz.com“ – 并将其余部分作为search后缀追加。
由于'.com'是通过从主机名中去除'abcxyz'产生的search后缀,所以系统将追加'.com'作为失败查找的search后缀,这产生如下结果:
foobar-abcxyz.cz – > foobar-abcxyz.cz.com – > http://www.czjewelry.com
foobar-abcxyz.com – > foobar-abcxyz.com.com – > http://www.cnet.com
为了解决这个问题,你可能需要将服务器的主机名设置为一个主机名,例如“hostname.abcxyz.com”,而不是“abcxyz.com”,这样会导致“abcxyz.com”被添加为search后缀默认情况下。
作为临时措施,您可以创build一个随机MD5校验和,并将其添加到/etc/resolv.conf,作为search后缀的替代:
uuidgen | 的md5sum
e930f5f4ba6ba7868b0cc6718bcef568 –echo“search e930f5f4ba6ba7868b0cc6718bcef568”>> / etc / resolv.conf
这会将“e930f5f4ba6ba7868b0cc6718bcef568”附加到失败的DNS查询中,而不是“.com” – 这反过来导致不存在的域的失败查找的默认行为。 如果将主机名更改为实际的主机名,则可以删除该行。
一些域名服务器故意返回不存在的域的IP。 互联网服务提供商为此而臭名昭着 – 他们实际上可以通过登陆页面为不存在的域名提供广告获利。
您可以随时更改您的resolv.conf文件,以使用已知肯定不会出现此行为的公共DNS服务器。 Google的DNS(8.8.8.8和8.8.4.4)和Level3的DNS(4.2.2.1到4.2.2.6)都提供公共DNS访问权限,并且不会redirect未知域名。 (来源: https : //www.grc.com/dns/alternatives.htm )
这听起来像你正在使用一个使用通配符DNS的networking。 这意味着,如果地址失败,它会自动将您重定路由到该IP地址。 您可以在网页浏览器中进行search来testing。 当它失败时,它会将您redirect到由您的ISP处理的赞助search页面。