Networking

誰讀/etc/resolv.conf?

  • March 22, 2019

我的 Centos 7 伺服器無法正確解析域名​​。據我所知,在現代 Linux 系統/etc/resolv.conf中,通常使用dhclient, dnsmasqNetwork Manager.

因此,我對現代 Linux 中的網路堆棧有一個一般性的理論問題:

誰負責閱讀/etc/resolv.conf?域名解析涉及哪些參與者(服務或核心子系統)?

簡短的回答: Arch linux 手冊說域名解析的高級配置 /etc/nsswitch.conf在名稱服務切換glibcAPI 中完成的。

glibc使用nss-resolve函式向 DNS 伺服器發送 DNS 請求。

通常在現代 CentOS 系統上nss-resolve 依賴於 systemd-resolved服務。如果/etc/resolv.conf由類似的東西生成dhclient-scriptsystemd-resolved讀取它並在兼容模式下工作,模擬舊系統(如BINDDNS 客戶端)的行為。

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 庫)的地方找到。)

進一步閱讀

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