Networking

nslookup 失敗,但對不存在的域 ping 成功

  • June 13, 2013

我有兩個不同的 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’ 作為失敗查找的搜尋後綴,這會產生如下結果:

foob​​ar-abcxyz.cz -> foobar-abcxyz.cz.com -> www.czjewelry.com

foob​​ar-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’ - 這反過來會導致不存在的域查找失敗的預設行為。如果您將主機名更改為實際主機名,則可以刪除此行。

引用自:https://serverfault.com/questions/513237