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 服务器,您有三个选择:
systemd-resolved
将通过 DHCP 租约得知并使用它。systemd-resolved
通过自身的配置机制来使用,而不是它是什么看到在DHCP租约。/etc/resolv.conf
文件,一个实际的常规文件而不是符号链接,在那里列出 1.1.1.1 并记住关闭nss-resolve
以便您返回使用nss-dns
BIND DNS 客户端。该systemd-resolved
配置文件都在共同结合不同的目录,以及如何将它们配置为第二选择上述超出这个答案的范围一大堆文件。阅读resolved.conf
(5) 手册页。
Dop*_*oti 16
整个127.0.0.0/8
CIDR 块用于环路路由。您的主机似乎(或者至少认为是)在该特定环回地址上运行自己的 DNS 服务器。
由于环回流量(通常)永远不会在线路上传输,因此您在 Wireshark 等剪切工具中看不到 TCP/53 流量也就不足为奇了,因为它们可能不会使用默认设置监控环回流量。ss
使用诸如(eg)之类的工具ss -plnt | grep ':53'
将显示哪个进程(如果有)正在侦听该 TCP 端口以进一步调查。
可能相关的是 Ubuntu 似乎systemd-resolved
在较新的版本中使用了环回解析器,正如AskUbuntu 上的这个答案中所讨论的。
小智 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 之一。