nslookup 失敗,但對不存在的域 ping 成功
我有兩個不同的 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中的第一個nameserver
$ 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 作為搜尋後綴的覆蓋:
uuidgen | md5sum
e930f5f4ba6ba7868b0cc6718bcef568 -迴聲“搜尋e930f5f4ba6ba7868b0cc6718bcef568”>>/etc/resolv.conf
這會將 ’e930f5f4ba6ba7868b0cc6718bcef568’ 附加到失敗的 DNS 查找而不是 ‘.com’ - 這反過來會導致不存在的域查找失敗的預設行為。如果您將主機名更改為實際主機名,則可以刪除此行。