谁在读/etc/resolv.conf?


16

我的Centos 7服务器无法正确解析域名。从我所看到的,在现代的Linux系统/etc/resolv.conf通常与生成dhclientdnsmasqNetwork Manager

因此,我对现代Linux中的网络堆栈有一个一般的理论问题:

谁负责阅读/etc/resolv.conf?域名解析涉及哪些参与者(服务或内核子系统)?

简短的回答: Arch linux手册说,域名解析的高级配置 /etc/nsswitch.conf在Name Service Switch glibcAPI中完成的,并且依赖于Name Service Switch API。

glibc使用nss-resolve功能将DNS请求发送到DNS服务器。

通常在现代CentOS系统上,它nss-resolve 依赖于 systemd-resolved服务。如果/etc/resolv.conf是由生成的dhclient-scriptsystemd-resolved则将读取它并以兼容模式工作,从而模拟BINDDNS客户端等旧系统的行为。

Answers:


20

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的名称服务缓存Dæmon引起的这种想法有些复杂。但这只是在C库中添加了一个额外的上层客户端,对本地服务器说了一种特殊的协议,而后者又充当了DNS客户端向代理DNS服务器说出DNS协议 systemd-resolved会增加类似的麻烦。)

systemd-resolvedNetworkManagerconnmandhcpcdresolvconf,和其他人的BIND DNS客户端配置文件切换DNS客户调整谈的飞行不同的代理DNS服务器。这超出了此答案的范围,尤其是因为此WWW网站上已经有很多答案正在解决这种机制所涉及的拜占庭式细节。

在Unix世界中,更传统的处理方式是在计算机本身或LAN上运行代理DNS服务器。因此,FreeBSD手册对正常配置的系统说了什么,在这种情况下,DNS客户端库的默认操作在没有resolv.confUnix系统管理员通常具有的匹配情况下是正常的,后者是侦听127.0.0.1的代理DNS服务器。(FreeBSD手册resolv.conf实际上是doco,它源于ISC的BIND,当然也可以在将BIND DNS客户端库合并到其他地方(例如GNU C库)的地方找到。)

进一步阅读


7

在更好的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.

1

该文件/etc/resolv.conf由执行主机名解析的* libc调用读取。这主要getaddrinfo是已弃用gethostbyname

如果将这些功能传递给DNS名称,则它们将按以下顺序执行这些操作:

  1. 尝试在本地解析主机名,方法是阅读/etc/hosts
  2. 如果失败,则查询中列出的DNS服务器/etc/resolv.conf
  3. 如果仍然失败,则无法解析主机名。

由于您提到dnsmasq:这是在本地运行的DNS服务器。因此,在许多现代Linux发行版中,/etc/resolv.conf仅指向127.0.0.1(这是本地dnsmasq监听的位置)。然后将dnsmasq配置为转发查询Internet DNS服务器;在连接到Internet时,由网络管理器配置dnsmasq。


这些不是系统调用,而是* libc函数。
JoshuaRLi

@JoshuaRLi当然可以,我编辑了它。
rexkogitans
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.