因此,我正在测试路由器,它向我网络上的所有计算机(包括我的 DNS 服务器)添加了一些随机 IPv6 地址。不知何故,这些 IP 被作为有效的 DNS 服务器进行广播(不确定如何,因为只有真正的路由器发送 IPv6 RA 数据包),但长话短说,现在我的所有计算机都将 DNS 查询发送到不存在的 IP 地址。
如果我重新启动resolved
,systemctl restart systemd-resolved
那么resolvectl
仍然将这些伪造的 IP 显示为有效的名称服务器。
它们被列出来,/etc/resolv.conf
所以如果我在那里删除它们并重新启动,systemd-resolved
它只会再次将伪造的 IP 添加回来。
如果我查看日志journalctl --unit=systemd-resolved
,它会告诉我虚假 IP 正在“降级功能模式”下运行,但不会告诉我它从哪里找到这些 IP。
它从哪里获取这些错误的 IP 地址?是否需要删除一些缓存文件才能使其恢复为仅使用 IPv6 路由器通告提供的 IP?
答案1
经过一番调查和系统错误报告后,我发现了以下内容。
systemd-resolved 从 systemd-networkd 获取所有 DNS 信息,因此请重点关注 systemd-networkd,因为修复那里的恶意服务器将流入 systemd-resolved。
/var/run/systemd/netif/
每个接口的数据存储在一个文件中。这是内部的,可能会发生变化,因此当您阅读本文时可能已经移动,但是我能够为恶意服务器 grep 这些文件并删除包含它的文件。当我重新启动 systemd-networkd 时,它完整地重新创建了已删除的文件。
在我的例子中,它重新创建了文件,其中仍然列出了恶意 DNS 服务器,这意味着它没有被 systemd 缓存,而是仍在网络上的某个地方进行广告。
由于它是 IPv6 地址,因此我安装了radvd
(IPv6 路由器通告守护程序)并运行radvdump
以显示到达计算机的所有 IPv6 RA。果然,不久之后,就出现了一个列出了恶意 DNS 服务器的邮件,这样我就可以找到它并修复它。
如果这不适合您,您可以使用一些 systemd-networkd 选项来解决该问题。这些必须放置在配置网络的文件之一中 ( /etc/systemd/network/*.network
)。
# Don't use DNS servers from DHCP responses received via IPv4 (default is true)
[DHCPv4]
UseDNS=false
# Don't use DNS servers from DHCPv6 responses received via IPv6 (default is true)
[DHCPv6]
UseDNS=false
[IPv6AcceptRA]
# Don't use DNS servers from IPv6 Router Advertisement (RA) messages (default is true)
UseDNS=false
# Don't start a DHCPv6 client when an RA message is received.
DHCPv6Client=false
答案2
您可以使用这命令:sudo systemd-resolved --flush-caches
或sudo resolvectl flush-caches
(后一个命令取自手册页的systemd-resolved
)
要验证刷新是否成功,请使用:sudo systemd-resolved --statistics
示例输出:
Cache
Current Cache Size: 0
Cache Hits: 101
Cache Misses: 256
systemd-resolved
另请注意联机帮助页中有关/etc/resolv.conf
“您在哪种模式下运行?”的部分。
/etc/resolv.conf
支持四种处理 /etc/resolv.conf 的模式(请参阅 resolv.conf(5)):
systemd-resolved 维护 /run/systemd/resolve/stub-resolv.conf 文件以与传统 Linux 程序兼容。该文件可能是来自 /etc/resolv.conf 的符号链接。此文件将 127.0.0.53 DNS 存根(见上文)列出为唯一的 DNS 服务器。它还包含 systemd-resolved 使用的搜索域列表。搜索域列表始终保持最新。请注意,应用程序不应直接使用 /run/systemd/resolve/stub-resolv.conf,而只能通过 /etc/resolv.conf 中的符号链接使用。该文件可以从 /etc/resolv.conf 进行符号链接,以便将所有绕过本地 DNS API 的本地客户端连接到具有正确搜索域设置的 systemd-resolved。推荐这种操作模式。
提供了一个静态文件 /usr/lib/systemd/resolv.conf,其中列出了 127.0.0.53 DNS 存根(见上文)作为唯一的 DNS 服务器。该文件可以从 /etc/resolv.conf 进行符号链接,以便将绕过本地 DNS API 的所有本地客户端连接到 systemd-resolved。该文件不包含任何搜索域。
systemd-resolved 维护 /run/systemd/resolve/resolv.conf 文件以与传统 Linux 程序兼容。该文件可能从 /etc/resolv.conf 进行符号链接,并且始终保持最新,包含有关所有已知 DNS 服务器的信息。请注意文件格式的限制:它不知道每个接口 DNS 服务器的概念,因此仅包含系统范围的 DNS 服务器定义。请注意,应用程序不应直接使用 /run/systemd/resolve/resolv.conf,而只能通过 /etc/resolv.conf 中的符号链接使用。如果使用这种操作模式,则绕过任何本地 DNS API 的本地客户端也将绕过 systemd-resolved 并直接与已知的 DNS 服务器通信。
或者,/etc/resolv.conf 可能由其他包管理,在这种情况下,systemd-resolved 将读取它以获取 DNS 配置数据。在这种操作模式下,systemd-resolved 是该配置文件的消费者而不是提供者。
请注意,该文件的所选操作模式是完全自动检测的,具体取决于 /etc/resolv.conf 是 /run/systemd/resolve/resolv.conf 的符号链接还是列出 127.0.0.53 作为 DNS 服务器。
更新:修复 systemd-resolve 中的拼写错误d,谢谢冰火
答案3
/etc/resolv.conf
不能直接编辑。即使您这样做,即使重新启动相应的服务,更改也不会生效。以下步骤适用于我/etc/resolv.conf
从Ubuntu 20.04 desktop
.
sudo nano /etc/resolvconf/resolv.conf.d/head
- 在 Nano 编辑器上进行所需的更改。
- 根据需要重新启动服务。就我而言,是:
systemctl stop resolvconf.service;systemctl start resolvconf.service