Bor*_*kov 18 networking dns networkmanager 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
服务。If/etc/resolv.conf
是由类似的东西生成的dhclient-script
,systemd-resolved
读取它并在兼容模式下工作,模拟旧系统(如BIND
DNS 客户端)的行为。
Jde*_*eBP 25
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 客户端以及在何处传递给 DNS 客户端以及如何处理各种响应。
(名称服务缓存守护程序 nscd 导致这个想法有点复杂。但这只是在 C 库中添加了一个额外的上层客户端,与本地服务器交流一个特殊的协议,而本地服务器又充当DNS 客户端将 DNS 协议与代理 DNS 服务器通信。 systemd-resolved
增加了类似的复杂性。)
systemd-resolved
, NetworkManager
, connman
, dhcpcd
,resolvconf
, 和其他人调整 BIND DNS 客户端配置文件以切换 DNS 客户端以动态地与不同的代理 DNS 服务器通信。这超出了这个答案的范围,特别是因为这个 WWW 站点上有很多答案已经在处理这种机制涉及的拜占庭细节。
在 Unix 世界中,更传统的做事方式是在机器本身或 LAN 上运行代理 DNS 服务器。因此,FreeBSD 手册对正常配置系统的描述是,在没有 DNS 客户端库的情况下,DNS 客户端库的默认操作resolv.conf
与 Unix 系统管理员通常拥有的相同,即代理 DNS 服务器侦听 127.0.0.1。(FreeBSD 的手册resolv.conf
实际上是同样源自 ISC 的 BIND 的doco,当然也可以在 BIND DNS 客户端库已合并到其他地方(例如 GNU C 库)的地方找到。)
dns
库。cr.yp.to.从更好的 FreeBSD 手册页,resolv.conf:
The resolver configuration file contains information that is read by the
resolver routines the first time they are invoked by a process.
On a normally configured system this file should not be necessary. The
only name server to be queried will be on the local machine, the domain
name is determined from the host name, and the domain search path is
constructed from the domain name.
Run Code Online (Sandbox Code Playgroud)