我的Centos 7服务器无法正确解析域名。据我所见,在现代Linux系统中,/etc/resolv.conf通常是用dhclient、dnsmasq或Network Manager生成的。
因此,我对现代Linuxes中的网络栈有一个一般性的理论问题:
谁负责阅读/etc/resolv.conf?在域名解析中涉及哪些参与者(服务或内核子系统)?
SHORT答案: 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 D17客户端等旧系统的行为。
发布于 2018-06-11 12:28:50
C库包含DNS客户端,这些客户端封装DNS协议中的名称到地址查找,并将它们交给代理DNS服务器来完成查询解析的所有繁重工作。有很多这样的DNS客户端。您的操作系统的主C运行时库中的一个很可能是ISC的BIND。但从丹尼尔·伯恩斯坦(DanielJ.Bernstein)的dns库到adns,还有很多其他人。
虽然它们中有几个包含自己的本机配置机制,但它们通常有一个绑定库兼容性模式,其中读取resolv.conf,这是ISC的BIND C客户机库的配置文件。
NSS是在此基础上分层的,并由nsswitch.conf配置。NSS查找可以在内部调用的事情之一是DNS客户端,nsswitch.conf由C库中的NSS代码读取,以确定是否和在何处将查找传递给DNS客户端,以及如何处理各种响应。
(由于nscd的名称Services Cache D mon,nscd),这个想法有点复杂。但这只是在C库中添加了一个额外的上层客户端,向本地服务器提供一个特殊的协议,而本地服务器则充当向代理DNS服务器提供DNS协议的DNS客户端。systemd-resolved增加了类似的并发症。)
systemd-resolved、NetworkManager、connman、dhcpcd、resolvconf等调整绑定DNS客户端配置文件以切换DNS客户端以动态与不同的代理DNS服务器对话。这超出了这个答案的范围,特别是在这个WWW站点上已经有大量的答案涉及到这样一个机制所涉及的繁杂的细节。
在Unix世界中,更传统的方法是在机器本身或局域网上运行代理DNS服务器。因此,FreeBSD手册对正常配置的系统进行了说明,在没有resolv.conf的情况下,DNS客户端库的默认操作与Unix系统管理员通常拥有的操作相匹配,后者是侦听127.0.0.1的代理DNS服务器。( FreeBSD resolv.conf手册实际上也是源自ISC的BIND,当然也可以找到绑定DNS客户端库已经被合并到其他地方,比如GNU库。)
发布于 2018-06-11 10:42:14
从更好的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.发布于 2018-06-12 09:08:11
执行主机名解析的*libc调用读取文件/etc/resolv.conf。这主要是getaddrinfo和不推荐的gethostbyname。
如果这些函数被传递给DNS名称,那么它们按照以下顺序执行这些操作:
/etc/hosts。/etc/resolv.conf中列出的DNS服务器。既然您提到dnsmasq:这是一个本地运行的DNS服务器。因此,在许多现代的Linux发行版上,/etc/resolv.conf只指向127.0.0.1 (这是本地dnsmasq监听的地方)。dnsmasq然后被配置为转发查询Internet DNS服务器;dnsmasq在连接到Internet时由网络管理器配置。
https://unix.stackexchange.com/questions/449067
复制相似问题