誰讀/etc/resolv.conf?
我的 Centos 7 伺服器無法正確解析域名。據我所知,在現代 Linux 系統
/etc/resolv.conf
中,通常使用dhclient
,dnsmasq
或Network Manager
.因此,我對現代 Linux 中的網路堆棧有一個一般性的理論問題:
誰負責閱讀
/etc/resolv.conf
?域名解析涉及哪些參與者(服務或核心子系統)?簡短的回答: Arch linux 手冊說域名解析的高級配置是
/etc/nsswitch.conf
在名稱服務切換glibc
API 中完成的。
glibc
使用nss-resolve
函式向 DNS 伺服器發送 DNS 請求。通常在現代 CentOS 系統上
nss-resolve
依賴於systemd-resolved
服務。如果/etc/resolv.conf
由類似的東西生成dhclient-script
,systemd-resolved
讀取它並在兼容模式下工作,模擬舊系統(如BIND
DNS 客戶端)的行為。
DNS 客戶端庫可以。
C 庫包含 DNS 客戶端,它們在 DNS 協議中包裝名稱到地址的查找,並將它們交給代理 DNS 伺服器來完成所有繁瑣的查詢解析工作。有很多這樣的 DNS 客戶端。作業系統的主 C 執行時庫中的那個很可能是來自 ISC 的 BIND 的那個。但是,從 Daniel J. Bernstein 的
dns
圖書館到 c-ares 到 adns,還有很多其他的東西。雖然其中有幾個包含自己的原生配置機制,但它們在讀取的地方一般都有一個 BIND 庫兼容模式
resolv.conf
,也就是 ISC 的 BIND C 客戶端庫的配置文件。NSS 在此之上分層,並由
nsswitch.conf
. NSS 查找可以在內部呼叫的一件事是 DNS 客戶端,nsswitch.conf
它由 C 庫中的 NSS 程式碼讀取,以確定是否以及在何處將查找交給 DNS 客戶端以及如何處理各種響應。(名稱服務記憶體守護程序 nscd 對這個想法造成了輕微的複雜影響。但這只是在 C 庫中添加了一個額外的上層客戶端,它向本地伺服器發送特殊協議,而本地伺服器又充當DNS 客戶端向代理 DNS 伺服器發送 DNS 協議。
systemd-resolved
增加了類似的複雜性。)
systemd-resolved
,NetworkManager
,connman
,dhcpcd
,resolvconf
, 和其他人調整 BIND DNS 客戶端配置文件以切換 DNS 客戶端以即時與不同的代理 DNS 伺服器通信。這超出了這個答案的範圍,特別是因為這個 WWW 網站上有很多答案已經在處理這種機制所涉及的拜占庭細節。在 Unix 世界中,更傳統的做事方式是在機器本身或 LAN 上執行代理 DNS 伺服器。因此,FreeBSD 手冊中關於正常配置系統的說明,其中 DNS 客戶端庫在不存在的情況下的預設操作
resolv.conf
與 Unix 系統管理員通常擁有的操作相匹配,即偵聽 127.0.0.1 的代理 DNS 伺服器。(FreeBSD 手冊resolv.conf
實際上是同樣源自 ISC 的 BIND 的 doco,當然也可以在 BIND DNS 客戶端庫已合併到其他地方(例如 GNU C 庫)的地方找到。)進一步閱讀
- 丹尼爾·伯恩斯坦。圖書館。*_
dns
*cr.yp.to.- 喬納森·德博因·波拉德 (2017)。什麼是 DNS 名稱限定。經常給出答案。
- 喬納森·德博因·波拉德 (2004)。什麼是 DNS 查詢解析。經常給出答案。
- 喬納森·德博因·波拉德 (2001)。“djbdns”的大圖。經常給出答案。
- 喬納森·德博因·波拉德 (2000)。“內容”和“代理”DNS 伺服器。 經常給出答案。