為什麼需要更改 nsswitch.conf 中主機的順序?

為什麼需要更改 nsswitch.conf 中主機的順序?

在我的公司,當我安裝 Ubuntu 時,我無法 ping 通任何本機:

$ ping foobar.mycompany.local
ping foobar.mycompany.local: Name or service not known

但如果我把它放在dns清單/etc/nsswitch.conf的開頭,那麼它就會起作用:

# hosts:          files mdns4_minimal [NOTFOUND=return] dns
hosts:          dns files mdns4_minimal [NOTFOUND=return]

我想了解為什麼。

答案1

您的公司使用以 結尾的 DNS 網域.local,這實際上是一個特殊用途的後綴,由 IETF 保留用於群播 DNS。因此,因為您安裝了 mDNS 用戶端 (mdns4_minimal),所以它被配置為優先處理所有*.local名稱。

(不幸的是,在企業內部網路中,編造一個不存在的網域名稱或IP位址範圍並希望它永遠不存在......)


一一檢查您配置的模組:

hosts: files mdns4_minimal [NOTFOUND=return] dns
  1. “檔案”模組搜尋 /etc/hosts,然後返回“未找到”。
  2. 處理繼續到下一個模組。
  3. 「mdns4_minimal」模組使用組播 DNS (mDNS) 搜尋本機 LAN 子網,然後傳回「找不到」。
  4. [NOTFOUND=return]指示出現此錯誤後不應繼續處理;即“未找到”應立即返回給程式。
  5. 永遠無法存取“dns”模組。

為什麼額外的“[NOTFOUND=return]”?根據各種消息來源,它的目的是加快不成功的查詢速度、防止資訊洩露,並減少公共 DNS 伺服器的負載。

假設某人的網絡實際使用的mDNS(在 Linux/macOS 上很常見)。如果使用者嘗試解析「MyLittleLaptop.local」但沒有找到,系統將繼續嘗試下一個模組(「dns」),並且查詢將發送到公共 DNS(例如發送到學校的 DNS 伺服器,或咖啡店的路由器)。

但是,根據 IETF 的保留,*.local名稱不可能存在於公共 DNS 中,因此這樣的查詢是沒有用的,它所做的只是向網路管理員洩露您的個人資訊。因此添加 [NOTFOUND=return] 標籤以完全阻止其到達 DNS。


如果您的公司網路使用.local內部 DNS 並且您相當確定它永遠不會使用 mDNS,您可以刪除整個模組 - 導致:

hosts: files dns

如果您想優先考慮 DNS,但保留使用 mDNS 的可能性,請將其移到最後:

hosts: files dns mdns_minimal

相關內容