我的 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.从更好的 FreeBSD 手册页resolv.conf:
该文件
/etc/resolv.conf
由执行主机名解析的 *libc 调用读取。这主要getaddrinfo
是已弃用的gethostbyname
.如果这些函数传递了一个 DNS 名称,那么它们会按以下顺序执行这些操作:
/etc/hosts
./etc/resolv.conf
。既然你提到了dnsmasq:这是一个在本地运行的 DNS 服务器。因此,在许多现代 Linux 发行版上,
/etc/resolv.conf
唯一指向127.0.0.1
(这是本地 dnsmasq 监听的地方)。然后将 dnsmasq 配置为转发查询 Internet DNS 服务器;dnsmasq 由网络管理器在连接到 Internet 时配置。