如何从 systemd-resolved 中删除错误的 DNS 服务器 IP?

如何从 systemd-resolved 中删除错误的 DNS 服务器 IP?

因此,我正在测试路由器,它向我网络上的所有计算机(包括我的 DNS 服务器)添加了一些随机 IPv6 地址。不知何故,这些 IP 被作为有效的 DNS 服务器进行广播(不确定如何,因为只有真正的路由器发送 IPv6 RA 数据包),但长话短说,现在我的所有计算机都将 DNS 查询发送到不存在的 IP 地址。

如果我重新启动resolvedsystemctl 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-cachessudo 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.confUbuntu 20.04 desktop.

  1. sudo nano /etc/resolvconf/resolv.conf.d/head
  2. 在 Nano 编辑器上进行所需的更改。
  3. 根据需要重新启动服务。就我而言,是:systemctl stop resolvconf.service;systemctl start resolvconf.service

相关内容