在我的公司,當我安裝 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
- “檔案”模組搜尋 /etc/hosts,然後返回“未找到”。
- 處理繼續到下一個模組。
- 「mdns4_minimal」模組使用組播 DNS (mDNS) 搜尋本機 LAN 子網,然後傳回「找不到」。
[NOTFOUND=return]
指示出現此錯誤後不應繼續處理;即“未找到”應立即返回給程式。- 永遠無法存取“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