DNS 客户端库可以。

DNS 客户端库可以。

我的 Centos 7 服务器无法正确解析域名。据我所知,在现代 Linux 系统中/etc/resolv.conf通常由dhclient, dnsmasq或生成Network 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 客户端等旧系统的行为。

答案1

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.confC 库中的 NSS 代码读取,以确定是否以及在何处将查找传递给 DNS 客户端以及如何处理各种响应。

(由于名称服务缓存守护进程 nscd,这个想法有点复杂。但这只是在 C 库中添加了一个额外的上层客户端,与本地服务器讲一种特殊的协议,而本地服务器又充当DNS 客户端与代理 DNS 服务器使用 DNS 协议 systemd-resolved会增加类似的复杂性。)

systemd-resolvedNetworkManagerconnmandhcpcdresolvconf和其他人调整 BIND DNS 客户端配置文件以切换 DNS 客户端以与不同的代理 DNS 服务器即时通信。这超出了这个答案的范围,特别是因为这个 WWW 站点上有很多答案已经处理了这种机制所涉及的错综复杂的细节。

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

进一步阅读

答案2

从更好的 FreeBSD 手册页中,解析配置文件:

 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.

答案3

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

如果这些函数传递了 DNS 名称,那么它们将按以下顺序执行这些操作:

  1. 尝试在本地解析主机名,即通过读取/etc/hosts.
  2. 如果失败,则查询 中列出的 DNS 服务器/etc/resolv.conf
  3. 如果这也失败,则无法解析主机名。

既然你提到了域名系统:这是本地运行的 DNS 服务器。因此,在许多现代 Linux 发行版上,/etc/resolv.conf唯一的指向127.0.0.1(这是本地 dnsmasq 监听的地方)。然后将 dnsmasq 配置为转发 Internet DNS 服务器的查询; dnsmasq 由网络管理器在连接到 Internet 时进行配置。

相关内容