Linux

/etc/hosts 和 DNS 如何協同工作以將主機名解析為 IP 地址?

  • February 11, 2019

在 Linux 中,如何/etc/hosts與 DNS 協同工作以將主機名解析為 IP 地址?

  1. 如果可以在 中解析主機名/etc/hosts,DNS 是否在/etc/hosts 解析主機名或將解析的 IP 地址 /etc/hosts視為“主機名”以遞歸解析?
  2. 在我的瀏覽器(firefox 和 google chrome)中,當我添加到 /etc/hosts
127.0.0.1 google.com www.google.com

在瀏覽器的地址欄中輸入 www.google.com 並按 Enter 將無法連接到該網站。從 中刪除該行後/etc/hosts,我可以連接到該網站。這是否意味著/etc/hosts覆蓋 DNS 以解析主機名?

在我重新添加線路後/etc/hosts,我仍然可以連接到網站,即使在刷新網頁後。為什麼不 /etc/hosts再次申請,以至於無法連接網站?

謝謝。

這是由 NSS(名稱服務切換)配置(即/etc/nsswitch.conf文件hosts指令)決定的。例如,在我的系統上:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

這裡,files指的是/etc/hosts文件,dns指的是DNS系統。你可以想像先到者獲勝

此外,請參閱man 5 nsswitch.conf了解更多關於此的想法。


順便說一句,要遵循 NSS 主機解析順序,請使用getentwithhosts作為數據庫,例如:

getent hosts example.com

僅回答您的最後一個問題:/etc/hosts不會立即再次申請,因為firefox正在記憶體它獲得的最後一個主機名google.com;如果您希望它始終再次獲取它,則必須設置network.dnsCacheExpiration0in about:config。更多資訊(雖然有點過時)在這裡。對不起,如果這是題外話。


作為旁注,許多程序不使用標準解析器 ( getaddrinfo(3),getnameinfo(3)

$$ 1 $$) 因為它很爛。 首先,介面不是非同步的;任何中等複雜的程序都必須生成一個單獨的執行緒getaddrinfo(),然後發明自己的協議來與它通信(我們甚至不要進入getaddrinfo_a(),它在完成時發送一個信號,所以情況更糟)。

其次,(linux中的標準C庫)中的解析器實現glibc是可怕的,期望你讓它通過dlopen()背後將隨機動態對象拉入地址空間,並且無法以任何方式包含它或靜態使用它連結的執行檔。

由於許多程序不直接使用標準解析器,它們也不會費心準確地複制其行為,並忽略部分或全部/etc/resolv.conf,/etc/hosts或./etc/nsswitch.conf``/etc/gai.conf

$$ 1 $$甚至不要提及不可重入的 ipv4-only gethostbyname(),它自古以來就被棄用了。

引用自:https://unix.stackexchange.com/questions/499792