https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html#Description说
此外,systemd-resolved 在本地环回接口上的 IP 地址 127.0.0.53 上提供本地 DNS 存根侦听器。绕过任何本地 API 直接发出 DNS 请求的程序可能会被定向到此存根,以便将它们连接到 systemd-resolved。
DNS 服务器和解析器(“存根解析器”)可以不同,您可以将 DNS 请求传递到 127.0.0.53,后者将它们传递到您的路由器以获取实际 DNS(例如,它可以处理本地主机,但可以传递对远程主机的请求以获得完整的 DNS) )。
什么是 DNS 服务器、解析器和存根解析器?
我还听说过两种 DNS 服务器(一种叫“解析器”,另一种我忘了)。这两种是什么意思?
答案1
人们经常弄错的令人困惑的名字。
用术语来说RFC 1034,有“解析器”和“名称服务器”。 “解析器”描述整个子系统用户程序用来访问“名称服务器”,而不考虑任何特定的体系结构。它是一个子系统,用于查询一个或多个“名称服务器”以获取它们发布的数据,并将这些数据拼凑成查询应用程序的最终答案,其方式如下所述RFC 1034 § 5.3.3。 “解析器”是全面的执行查询的子系统解决。
RFC 理论上允许,因为它并不是以 Unix 为中心的,所有查询解析机制都可能以某种形式的共享子系统存在的系统,该子系统在每个单独的应用程序内运行。
在 RFC 1034 术语中,“存根解析器”是 Unix 和 Linux 世界中普遍使用的:一个在应用程序进程中运行的相当愚蠢的 DNS 客户端库,与运行的外部程序对话相同的 DNS/UDP 和 DNS/TCP 协议作为另一个过程,它实际上通过进行后端事务并从中构建前端响应来完成查询解析的繁重工作。
“解析器”是一个非常令人困惑的术语,并且经常与 RFC 相悖地使用,因此几年前我开始使用借自 HTTP 的术语向人们解释 DNS:代理服务器,内容服务器, 和客户库链接到应用程序。
- 这DNS 客户端库在你的应用程序中是几乎始终是 ISC 的 BIND DNS 客户端库。 Unix 和 Linux 系统上的大多数 C 库都包含 BIND DNS 客户端库。不过,还存在其他几个 DNS 客户端库,并且少数应用程序使用它们。
DNS 客户端库以进一步阅读中描述的方式进行名称限定并找出要与哪些 DNS 代理服务器通信。
- 最初的DNS代理服务器在这个特定的设置中,
systemd-resolved
监听 127.0.0.53。执行此任务的其他 Unix 和 Linux 软件包括 Daniel J. Bernstein 的、
dnscache
PowerDNS Recursor、MaraDNS Recursor(“Deadwood”)等。unbound
dnsmasq
我个人有一个本地实例修改的
dnscache
(可以继承其侦听套接字)在每台侦听 127.0.0.1 的计算机上,在没有显式配置的情况下,这也是 BIND DNS 客户端库期望代理 DNS 服务器所在的默认位置。 systemd-resolved
与其他代理 DNS 服务器通信,这些服务器很可能与其他代理服务器通信,转发沿着一条链进行查询,直到查询到达解决代理服务器。- 默认情况下,当 systemd 的人发布东西时除非构建二进制包的人或本地系统管理员更改它,否则解析代理 DNS 服务器将是由 Google 运行的服务器,作为 Google 公共 DNS 的一部分,并且将存在一系列转发代理 DNS 服务器长度为1。
- 如果系统管理员已配置
systemd-resolved
为使用其他代理 DNS 服务器而不是 Google 的,则该链将会更长。此类配置的示例包括(按粗略的最佳到最差顺序)使用 LAN 上的本地解析代理 DNS 服务器、使用在 LAN 边缘的路由器/网关中运行的代理 DNS 服务器,或使用整个 Internet 上的第三方代理 DNS 服务器。 - 这解析代理 DNS 服务器在链的远端进行查询解析、查询等繁重工作内容 DNS 服务器根据需要将数据拼接在一起以形成最终答案,然后沿着代理 DNS 服务器链(包括
systemd-resolved
该链的近端)返回到应用程序中的 DNS 客户端库。
相比之下,在 RFC 1034 术语中,这里的“解析器”实际上是一个巨大的黑匣子,包含 BIND DNS 客户端库、systemd-resolved
Google 公共 DNS,因为它被 RFC 定义为一侧具有“用户程序”,并且内容 DNS 服务器(“直接”提供引用和数据库信息)。人们经常会误用这个术语,有时是因为他们误解了 RFC 1034 体系结构中立的“解析器”概念,认为它与单个 Unix 或 Linux 服务器程序相同,但事实并非如此。 HTTP 术语没有巨大的黑匣子。
进一步阅读
- 乔纳森·德博因·波拉德 (2000)。“内容”和“代理”DNS 服务器。 经常给出的答案。
- 乔纳森·德博因·波拉德 (2004)。什么是 DNS 查询解析 。经常给出的答案。
- 乔纳森·德博因·波拉德 (2017)。什么是 DNS 名称资格。经常给出的答案。
- 乔纳森·德博因·波拉德 (2003)。从哪里获得代理 DNS 服务。经常给出的答案。
- 乔纳森·德博因·波拉德 (2018)。 ”、
dnscache
、tinydns
和axfrdns
服务”。小吃指南。软件。 - https://unix.stackexchange.com/a/449092/5132
答案2
只要涉及到 systemd-resolved,“stub-resolver”就不会自行完成所有 DNS 解析(即它不连接到根 DNS 服务器 -> tld/gtld 名称服务器 -> 权威名称服务器)。相反,它连接到其他解析器(通常通过网络接口配置进行配置。例如 8.8.8.8 或 1.1.1.1 或由 ISP 提供)进行名称解析。
其目的是,每个程序/客户端不必直接查询解析器,而是可以查询存根解析器,该存根解析器可以缓存结果以加快整体名称解析过程。还有一些额外的好处。
它之所以被称为存根,是因为它有点像解析器,但从技术上讲它不是解析器,因为它缺乏它的所有功能。