为什么 /etc/resolv.conf 指向 127.0.0.53?

Dim*_*ris 32 linux dns resolv.conf

我试图检查我的 DNS 解析器是什么,我注意到了这一点:

user@ubuntu:~$ cat /etc/resolv.conf 

nameserver 127.0.0.53
options edns0
Run Code Online (Sandbox Code Playgroud)

我期待192.168.1.1,这是我的默认网关,我的路由器。

我不明白为什么它指向127.0.0.53. 当我点击那个 ip 时,apache2 会为我提供它的内容。有人可以帮我解决这个问题吗?文件不应该直接指向我作为 DNS 解析器的默认网关 - 或者甚至更好地直接指向我首选的 DNS1.1.1.1吗?

PS:当我在端口 53 上使用 wireshark 捕获 DNS 数据包时,我看到的只是192.168.1.1和 不是127.0.0.53,正如它应该的那样。

Jde*_*eBP 40

您可能正在systemd-resolved作为服务运行。

systemd-resolved 动态生成两个配置文件,供 DNS 客户端库(例如 C 库中的 BIND DNS 客户端库)可选使用:

  • /run/systemd/resolve/stub-resolv.conf告诉 DNS 客户端库将它们的查询发送到 127.0.0.53。这是systemd-resolved进程侦听 DNS 查询的地方,然后转发。
  • /run/systemd/resolve/resolv.conf告诉 DNS 客户端库将它们的查询发送到systemd-resolved从其配置文件和包含在 DHCP 租约中的 DNS 服务器信息中动态获取的IP 地址。实际上,这绕过了systemd-resolved转发步骤,代价是也绕过了所有systemd-resolved的逻辑,以便为任何给定的交易做出关于实际转发到什么的复杂决定。

在这两种情况下,systemd-resolved配置域名后缀的搜索列表,再次从其配置文件和 DHCP 租约动态派生(通过超出本答案范围的机制告知)。

/etc/resolv.conf 可以选择是:

  • 指向其中任何一个的符号链接;
  • 一个指向包提供的静态文件的符号链接/usr/lib/systemd/resolv.conf,它也指定了 127.0.0.53 但没有即时计算的搜索域;
  • 完全是其他一些文件。

您可能有这样的符号链接。在这种情况下,知道 192.168.1.1 设置的事情,即(大概)由 LAN 上的 DHCP 服务器在 DHCP 租约中分发的,是systemd-resolved,正如您所观察到的那样,它将查询流量转发给它。您的应用程序中的 DNS 客户端库本身仅与systemd-resolved.

讽刺的是,尽管它可能是你没有捕捉到loopback接口流量/从127.0.0.53不当,更可能是你没有看到它,因为systemd-resolved还(可选)绕过BIND DNS客户端在你的C库和生成没有这样的流量被捕获。

有一个 NSS 模块systemd-resolved,名为nss-resolve,它是 C 库的插件。以前,您的 C 库会使用另一个名为的插件,nss-dns该插件使用 BIND DNS 客户端使用 DNS 协议对 中列出的服务器进行查询/etc/resolv.conf,并应用其中列出的域后缀。

nss-resolve被列出了领先nss-dns在你的/etc/nsswitch.conf文件,导致你的C库不使用BIND DNS客户端或DNS协议,执行所有的名字吗?地址查找。取而代之的是,nss-resolve通过(系统范围的)桌面总线对 进行非标准和特殊的协议systemd-resolved,这再次使后端查询 192.168.1.1 或您的 DHCP 租用和配置文件所说的任何内容。

要拦截您必须使用dbus-monitor或某些此类工具监视桌面总线流量。它甚至不是 IP 流量,更不用说环回网络接口上的 IP 流量了。因为桌面总线是通过AF_LOCAL套接字到达的。

如果您想使用 1.1.1.1 或其他 IP 地址的第三方解析代理 DNS 服务器,您有三个选择:

  • 配置您的 DHCP 服务器以分发它而不是分发 192.168.1.1。 systemd-resolved将通过 DHCP 租约得知并使用它。
  • 配置systemd-resolved通过自身的配置机制来使用,而不是它是什么看到在DHCP租约。
  • 制作您自己的/etc/resolv.conf文件,一个实际的常规文件而不是符号链接,在那里列出 1.1.1.1 并记住关闭nss-resolve以便您返回使用nss-dnsBIND DNS 客户端。

systemd-resolved配置文件都在共同结合不同的目录,以及如何将它们配置为第二选择上述超出这个答案的范围一大堆文件。阅读resolved.conf(5) 手册页。

  • 我已阅读resolved.conf 联机帮助页,但不知道如何将其配置为忽略 DHCP 分配的 DNS 服务器。还有其他地方有这方面的信息吗? (2认同)

Dop*_*oti 16

整个127.0.0.0/8CIDR 块用于环路路由。您的主机似乎(或者至少认为是)在该特定环回地址上运行自己的 DNS 服务器。

由于环回流量(通常)永远不会在线路上传输,因此您在 Wireshark 等剪切工具中看不到 TCP/53 流量也就不足为奇了,因为它们可能不会使用默认设置监控环回流量。ss使用诸如(eg)之类的工具ss -plnt | grep ':53'将显示哪个进程(如果有)正在侦听该 TCP 端口以进一步调查。

可能相关的是 Ubuntu 似乎systemd-resolved在较新的版本中使用了环回解析器,正如AskUbuntu 上的这个答案中所讨论的。

  • wireshark 可以监视环回,但默认情况下可能不这样做。 (2认同)
  • 应该是 `systemd-resolve` 在 ubuntu 20.04 系统上监听 53。 (2认同)

小智 16

这是因为您正在使用 systemd-resolved 服务进行网络名称解析。在这种情况下,您可以使用 resolvectl status命令。转到您的网络,例如:wlp1s0。检查当前的 DNS 服务器。起初它是我的路由器的 IP 192.168.xx,我已将208.67.222.123路由器配置页面中 DHCP 服务器选项下的主 DNS 服务器更新为( OpenDNS FamilyShield DNS 解析器)。所以现在重新启动 NetworkManager 后,这就是我在运行时得到的结果resolvectl status

Link 3 (wlp1s0)
    Current Scopes: DNS
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 208.67.222.123
       DNS Servers: 208.67.222.123
Run Code Online (Sandbox Code Playgroud)

查看当前 DNS 服务器从我的路由器 IP 更改为 OpenDNS 之一。

  • 然而这个答案相当简洁而且非常有帮助。 (9认同)
  • 问题是关于 DNS 的,你的答案是关于 DNS 的。除此之外,您似乎没有回答这个问题:为什么 /etc/resolv.conf 指向 127.0.0.53?你的例子与这个问题有什么关系?此外,JdeBP 已经发布了[一个冗长的答案](https://unix.stackexchange.com/a/612434/80216) 讨论“systemd-resolved”。 (5认同)