Domain-Name-System

/etc/resolv.conf 中的第二個名稱伺服器沒有被 wget 拾取

  • December 22, 2020

我的 resolv.conf 看起來像這樣:

; generated by /sbin/dhclient-script
search mcdc
nameserver 10.0.4.48
nameserver 8.8.8.8

如果我這樣做的nslookup www.google.com

nslookup www.google.com
;; Got SERVFAIL reply from 10.0.4.48, trying next server
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
www.google.com  canonical name = www.l.google.com.

但是當我 curl www.google.com 時,它無法解析主機。

我嘗試在 strace 下執行 curl,發現 curl 只使用了 resolv.conf 中的第一個名稱伺服器,而不是第二個。如果我切換兩個名稱伺服器行,www.google.com 會解析,但內部 DNS 名稱不會,所以這不是一個好的解決方法。

如何修復 resolv.conf 以使用兩個名稱伺服器?

resolv.conf 和解析器的預設行為是按列出的順序嘗試伺服器。如果第一個名稱伺服器超時,解析器只會嘗試下一個名稱伺服器。resolv.conf 聯機幫助頁說:

名稱伺服器 名稱伺服器 IP 地址

解析器應查詢的名稱伺服器的 Internet 地址(以點表示法)。最多可以列出 MAXNS 個(目前為 3 個,請參閱 )名稱伺服器,每個關鍵字一個。 如果有多個伺服器,則解析器庫會按列出的順序查詢它們。

和:

(使用的算法是嘗試一個名稱伺服器,如果查詢超時,則嘗試下一個,直到名稱伺服器用完,然後重複嘗試所有名稱伺服器,直到達到最大重試次數。)

另請參閱resolver(5)手冊頁以獲取更多資訊。

您可以使用 更改解析器的行為rotate,這將按循環順序查詢名稱伺服器:

rotate 在 _res.options 中設置 RES_ROTATE,這會導致從列出的名稱伺服器中循環選擇名稱伺服器。這具有在所有列出的伺服器之間分散查詢負載的效果,而不是讓所有客戶端每次都首先嘗試第一個列出的伺服器。

SERVFAIL但是,如果 nslookup從第一個名稱伺服器接收到 a,它將使用第二個名稱伺服器。從nslookup 聯機幫助頁

$$ no $$失敗 如果名稱伺服器以 SERVFAIL 或引用 (nofail) 響應或在此類響應上終止查詢 (fail),請嘗試下一個名稱伺服器。 (預設 = 不失敗)

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