所以我正在测试一个路由器,它向我网络上的所有机器添加了一些随机 IPv6 地址,包括我的 DNS 服务器。不知何故,这些 IP 作为有效的 DNS 服务器被广播(不确定只有真正的路由器如何发送 IPv6 RA 数据包),但长话短说,现在我所有的机器都在向不存在的 IP 地址发送 DNS 查询。
如果我重新启动resolved
,systemctl restart systemd-resolved
那么resolvectl
仍然会将这些虚假 IP 显示为有效的名称服务器。
它们已列在其中,/etc/resolv.conf
因此如果我将它们删除并重新启动systemd-resolved
,它只会重新添加虚假 IP。
如果我查看日志,journalctl --unit=systemd-resolved
它会告诉我虚假 IP 正在“降级功能模式”下运行,但没有告诉我从哪里找到这些 IP。
它从哪里获取这些错误的 IP 地址?是否需要删除一些缓存文件以使其恢复为仅使用 IPv6 路由器广告提供的 IP?
您可以使用以下命令:
sudo systemd-resolve --flush-caches
或(后一个命令sudo resolvectl flush-caches
取自手册页)systemd-resolve
要验证刷新是否成功,请使用:
sudo systemd-resolve --statistics
样本输出:
还要注意
systemd-resolve
手册页中关于/etc/resolv.conf
您在哪种模式下操作的部分?经过一些调查和 systemd 错误报告,这就是我发现的。
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
)。/etc/resolv.conf
不能直接编辑。即使您这样做了,即使重新启动相应的服务,更改也不会生效。以下步骤适用于我/etc/resolv.conf
从Ubuntu 20.04 desktop
.sudo nano /etc/resolvconf/resolv.conf.d/head
systemctl stop resolvconf.service;systemctl start resolvconf.service