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

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

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

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

nameserver 127.0.0.53
options edns0

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

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

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

答案1

您可能正在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可以选择是:

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

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

讽刺的是,虽然它可以如果您没有正确捕获往返于 127.0.0.53 的环回接口流量,则更有可能您没有看到它,因为systemd-resolved它还(可选)绕过 C 库中的 BIND DNS 客户端,并且不会生成此类流量被捕获。

提供了一个 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) 手册页。

答案2

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

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

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

答案3

这是因为您正在使用 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

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

相关内容