/etc/hosts
和 DNS 如何協同工作以將主機名解析為 IP 地址?
在 Linux 中,如何
/etc/hosts
與 DNS 協同工作以將主機名解析為 IP 地址?
- 如果可以在 中解析主機名
/etc/hosts
,DNS 是否在/etc/hosts
解析主機名或將解析的 IP 地址/etc/hosts
視為“主機名”以遞歸解析?- 在我的瀏覽器(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 主機解析順序,請使用
getent
withhosts
作為數據庫,例如:getent hosts example.com
僅回答您的最後一個問題:
/etc/hosts
不會立即再次申請,因為firefox
正在記憶體它獲得的最後一個主機名google.com
;如果您希望它始終再次獲取它,則必須設置network.dnsCacheExpiration
為0
inabout: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()
,它自古以來就被棄用了。