AdGuard Home 从您的局域网地址回应 WireGuard 客户端
0.0.0.0 绑定允许内核选择回复源。在多宿主主机上,该回复可能来自隧道无法到达的地址。
隧道已经建立,防火墙允许53端口,AdGuard Home正在运行,但WireGuard客户端的域名仍然无法解析。查询通常能够到达,响应通常能够发送出去,因此解析器上的数据包计数看起来很健康,服务似乎没有问题。问题出在响应的源地址:它从客户端从未请求的本地地址发出,客户端的stub解析器会丢弃它。AdGuard Home配置中的一个列表决定了这一点,其通常的默认设置是将决策交给内核。
查询到达,响应从其他地方发出
一个配置了 10.6.0.1 作为其解析器的客户端向 10.6.0.1 的 53 端口发送 UDP 查询。该数据包穿越隧道到达主机,AdGuard Home 对其进行响应。然而,在网络上,回复是一个新数据包,其源地址由主机的网络栈选择,而不是由客户端预期选择。
当客户端的解析器是一个已连接的套接字时(这是 systemd-resolved、dnsmasq 和大多数 stub 解析器使用的方式),它仅接受来自其发送到的确切地址的回复。一个源自 192.168.1.10 的回复发送到 10.6.0.1 的查询在解析之前就被丢弃了。解析器记录了成功的响应,客户端记录了超时,并且两者都在说实话。
所以计数器没有说谎,客户也没有说谎。你需要的证据在三个地方,顺序如下:监听者绑定的地址、内核返回到客户端的路径,以及实际回复数据包上的源地址。
内核如何选择回复来源
绑定到的UDP套接字0.0.0.0没有自己的源地址,所以每个传出的回复都会触发一次目标的路由查找。然后内核从该路由中获取源地址:由路由固定的地址,或传出接口的主要地址。查询的目标地址不会被记住。
在单宿主机上这是不可见的,因为只有一个合理的答案。在拥有局域网地址、WireGuard 地址和管理地址的机器上,几个答案都是合理的,而最终选择取决于当时的路由表。添加一条额外的路由、在同一接口上增加第二个地址、在解析器前进行 NAT 重定向,或者在具有自己命名空间的容器中运行 AdGuard,所选择的源地址可能会与客户端查询的不同。
ss -lunp | grep :53显示你所在的游戏。监听0.0.0.0:53上的情况是通配符情况;监听10.6.0.1:53上的情况已经固定了答案。读取套接字比读取 YAML 更快,并且它反映的是实际运行的状态,而不是最后保存的状态。
bind_hosts 实际控制的是
AdGuard Home 的dns.bind_hosts是 DNS 监听器使用的本地地址列表。默认提供的是通配符,这意味着在每个本地地址上都接受请求,并让内核为每个回复选择源地址。将通配符替换为客户端查询的地址会更改套接字,并随之更改每个响应的源地址。
该列表可以包含多个条目,这在解析器服务于两个网络时很重要。列出10.6.0.1和192.168.1.10会产生两个绑定的套接字,任何一个套接字收到的查询都会从其接收到的地址进行回应。这是大多数人认为通配符已经提供的行为。
YAML 很简单,其中的地址是你的隧道客户端被告知使用的地址,而不是主机的主地址:
dns:
bind_hosts:
- 10.6.0.1
port: 53为什么同一个解析器的两个安装会产生不同意见
在此上下文中,插件管理意味着解析器是由另一个软件包安装并监督的:例如路由器固件包、NAS 包或家庭自动化插件。该软件包通常会提供其自己的 AdGuard Home YAML 副本,并按照自己的计划重启进程,而独立实例则是由供应商提供的二进制文件或容器,需要您自己进行配置。无论哪种方式,您面对的都是两个独立的进程,各自有独立的配置文件和绑定选择,即使它们都读取相同的上游列表和相同的过滤列表。一个可以绑定特定的隧道地址,而另一个继承通配符,从任何一侧访问的网页界面看起来都是一样的。
这就是为什么“同一个解析器在迁移前有效”并不能证明当前的绑定有效。检查套接字,然后检查正在运行的进程实际加载的配置文件。另一个目录中的陈旧副本是编辑看似无效的常见原因。
将其固定,然后从隧道端进行测试
将bind_hosts更改为隧道地址,重启服务,并确认套接字已移动:ss -lunp | grep :53现在应该显示10.6.0.1:53并且没有通配符条目。如果仍然显示0.0.0.0,则运行中的进程没有读取你编辑的文件。
然后从客户端进行测试,因为那是唯一重要的一端。使用dig @10.6.0.1 example.com的查询会测试用户实际使用的路径,并在主机上进行捕获tcpdump -ni wg0 udp port 53显示线路上回复的源地址。将其与客户端解析器设置中的地址进行比较;当它们相同时,超时问题就不再是谜了。
ip route get 10.6.0.2解释任何剩余的异常,因为它会打印主机返回客户端时使用的接口和源。如果输出显示的是局域网接口,那么绑定更改并不是全部解决方法,下一步要查看的是路由表。
绑定设置无法修复的情况
固定监听器并不能修复遗漏隧道子网的访问控制列表、允许查询但不允许回复的防火墙规则,或者缺少返回WireGuard池的路由。这些问题要么比源地址问题更早出现,要么更晚发生,每种情况都有不同的负责方。
它也不会更改解析器转发到的上游无论重新绑定保护是否会拒绝针对私有名称的私有回答,或者客户端如何应用其自己的搜索域。这些是独立的控制。当回复源错误时更改绑定地址,而当回复源正确时更改其他内容。