我尝试检查我的 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-dns
BIND DNS 客户端。
配置systemd-resolved
文件是组合在一起的各个目录中的一大堆文件,如何为上述第二个选择配置它们超出了本答案的范围。请阅读resolved.conf
(5) 手册页。
答案2
整个127.0.0.0/8
CIDR 块用于环路路由。您的主机似乎(或者至少认为是)在该特定环回地址上运行自己的 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 之一。