如何修复我的 Wireguard VPN 无法解析本地域名的问题?

如何修复我的 Wireguard VPN 无法解析本地域名的问题?

我正在使用 Ubuntu 22.04.1 LTS 服务器来运行 wg-easy。我使用 portainer 来管理我的 docker 容器。当我的 Windows 11 客户端连接到 Wireguard 服务器时,我可以通过 VPN 访问互联网和我的本地网络。在这个本地网络上,我在另一台机器上运行另一个 Ubuntu 22.04.1 LTS 服务器作为 AdGuard Home DNS 提供程序,也是通过 docker 容器。

当我从远程网络连接到 VPN 时,遇到了以下问题:

当我尝试通过 SSH、HTTP/HTTPS 或 ICMP(ping 时)使用我在 AdGuard DNS 重写页面中配置的主机名时,DNS 无法解析主机名。在浏览器中,我得到了一个ERR_NAME_NOT_RESOLVED。通过 SSH 或 ICMP,进程会通知我它们could not resolve hostname/find host <hostname>。但是,如果我使用nslookup,进程会报告它正在使用我指定的 DNS IP(AdGuard 机器的 IP),并且主机名可以顺利解析(这就是为什么尽管这个问题很相似,但超级用户的帖子并没有回答这个问题)。

此体验有一个例外,这可能表明 AdGuard 存在问题,而不是 Wireguard 存在问题:只有托管 AdGuard 服务器的设备在使用其主机名时才能通过 HTTP/HTTPS、SSH 和 ICMP 访问。另一台服务器的主机名虽然在我的 AdGuard 设置中的同一位置指定,但不能访问。

另一个可能有趣或不相关的问题是,虽然正向 DNS 查找可以顺利运行,但反向查找却不成立,nslookup无法将其生成的 IP 地址解析回主机名。实际上,这意味着我可以自由访问互联网,我也可以通过 IP 地址访问同一本地网络上的设备,但我无法通过主机名访问这些设备。

我的Wireguard客户端配置如下:

[Interface]
PrivateKey = <my private key>
Address = 10.8.0.3/24
DNS = 192.168.68.105 // this is the local IP of the AdGuard machine

[Peer]
PublicKey = <my public key>
PresharedKey = <my pre-shared key>
AllowedIPs = 0.0.0.0/0, ::/0, 192.168.68.105/32
Endpoint = <my home router's public domain name>:51820

我采纳了一篇 Reddit 旧帖子的建议,将其添加192.168.68.105/32到我的 AllowedIPs 列表中,以确保 DNS 流量也按照建议进行路由这里,但这并没有解决问题。我知道我在这里追求一种分割隧道形式,因此我检查了我使用的默认 wg-easy IP 地址范围 (10.8.0.x) 是否与我的本地子网 (192.168.68.0/24) 不冲突。

我已经将终端连接到一台机器上的 wg-easy 容器和另一台机器上的 AdGuard 容器,并且我已确定 wg-easy 容器能够通过网络访问 AdGuard 机器,但反之则不行。但这不一定是个问题,因为 docker 容器在传入和传出流量规则方面默认是这样设置的。我已经确认通过客户端上的 .../etc/hosts 文件手动映射 IP 地址和主机名确实可以解决这个问题,但这首先似乎是一种对症治疗,而不是解决问题的根本原因,其次,这不是一种适用于所有使用 VPN 的设备的便捷解决方案。最后要注意的一点是,Wireguard 容器正在使用其堆栈的 portainer 配置网络,而 AdGuard 容器正在模式下运行network: host,因此它共享其运行设备的 IP。

请帮助我重新配置这个网络,以便我可以从远程网络使用我的 Wireguard VPN,并仍然使用本地设备的主机名连接到它们。

信息编辑:我连接了一个任意网络设备并在 AdGuard 中为其提供了 DNS 映射,但它也只能通过 VPN 上的 IP 地址进行 ping 操作,这意味着 AdGuard 机器本身的主机名肯定是唯一一个被成功解析的主机名(真的很自恋)

第二次信息编辑:ipconfig /all 报告说,我的默认 WiFi 适配器和 Wireguard 适配器的“连接特定 DNS 后缀”都是空白的

答案1

看来此设置的问题出在 Wireguard 方面。根据 Reddit 上一篇帖子(不幸已丢失)的建议,停用 Wireguard 配置中阻止非隧道流量的“终止开关”显然解决了该问题,并允许 DNS 在 VPN 上按预期运行:

Wireguard 配置中的终止开关选项的屏幕截图

答案2

任何一个

  1. 设置本地缓存 DNS(如 pi-hole)作为您的 DHCP+DNS,以将非本地查找查询透明地重定向到您配置的任何 DNS。

  2. 创造主机文件将本地主机名解析为其本地 IP 地址的条目。


笔记: 对于多台本地设备,选项 1 的工作量较少。但是...如果您只需要在一台计算机上进行本地查找,那么与编辑文本文件相比,选项 1 就有点小题大做了。

相关内容