我最近设置了一个 VPS 来运行 PiHole 和 Wireguard。一个系统(运行带有内核 6.2.6 的 Pop OS 22.04)连接到 VPS,并将 VPS 设置为网关和 DNS(它正在运行 PiHole 用于解析查询的 Unbound 本地实例),我遇到 DNS 泄漏和我连接到的任何网络的网关都会不时弹出。
我在遇到泄漏的对等方上的 Wireguard 配置; IP 已更改,但1.0.0.1
将是我的 VPS 内部 Wireguard 地址,并且1.0.0.4
将用于连接到 VPS 的特定对等点:
[Interface]
PrivateKey = 1111111111111111111111111111111111111111
Address = 1.0.0.4
DNS = 1.0.0.1
[Peer]
PublicKey = 2222222222222222222222222222222222222222222
PresharedKey = 333333333333333333333333333333333333333333
AllowedIPs = 0.0.0.0/0
Endpoint = vps.running.wireguard:51820
PersistentKeepalive = 25
VPS 设置为仅回答 Wireguard 接口上的查询。除了在其上运行的 Unbound 实例之外,PiHole 没有配置其他 DNS。 Unbound 已根据 PiHole 文档进行配置,仅对我使用的 IP 范围进行了更改。
我当地的解析配置文件文件只有这个:
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# run "systemd-resolve --status" to see details about the actual nameservers.
nameserver 1.0.0.1
我浏览了 Arch wiki 并发现rc-manager=unmanaged
应该禁用 NetworkManager 更新解析配置文件,但是,我认为这并不总是正确的,因为 NetworkManager 仍然可以symlink
解析配置文件到它自己的本地状态,从而覆盖此处找到的名称服务器。
我发现阻止 DNS 泄漏的唯一可靠方法是在1.0.0.1
NetworkManager 内部手动设置 DNS 记录。然而,这仅适用于逐个连接的连接,而不是作为完整的规则,因为我将它们添加到/etc/NetworkManager/system-connections/[connectionName].nmconnection文件。这意味着每个新连接都可以覆盖此行为。
不仅如此,强制 DNS 为该特定地址意味着在更改连接时我可能会发现自己没有 Internet 连接,并且必须恢复设置以允许选择默认 DNS 服务器。
是否有其他方法可以跨连接、我缺少的某些设置或我无法正确看到或理解的其他配置来强制执行此操作?顺便说一句,这是全新安装的,我在全新安装的 Debian Buster 上也注意到了这一点。