我有一个 Docker Bridge 网络,其中运行着 Wireguard 和 PiHole 容器。我已转发所有必要的端口,并且192.168.1.208
在路由器中使用(我的服务器 IP)作为 DNS,在我的 WiFi/LAN 上运行良好。
在我的 Wireguard 客户端(例如我的 Android 手机)中,如果我将 wireguard DNS 字段留空或将其设置为172.28.0.3
(PiHole 的 docker 内部 IP),VPN 就可以正常工作,我可以访问192.168.1.208:xxxx
服务器上运行的所有其他服务。除此之外,我的互联网流量都不会经过 pihole,所以我没有得到我设置的阻止。
但是,如果我将其设置192.168.1.208
为我的 Wireguard 客户端 DNS,就会发生一些奇怪的事情。我的流量确实会通过 pihole 路由,因为我可以172.28.0.2
在 pihole 查询日志中看到 wireguard 流量。但是,随机网站和应用程序将无法加载。加载失败的页面似乎完全是随机的。Youtube 和 instagram 可以工作,但 brave search 不行。大多数网站都无法加载,但谷歌搜索可以工作。Reddit 不行。但是我仍然可以在 pihole 查询日志中看到它们的所有流量。例如,如果我尝试连接到 reddit,我会看到 pihole 可以看到我的 reddit 流量172.28.0.2
,但在我的手机上它会永远加载。
172.28.0.2
这是否是返回路由问题?显然,流量是通过 pihole 传输的,但没有返回到手机?无论 pihole是否打开,都没有区别172.28.0.3
答案1
在手机的 WireGuard 配置中,该DNS
字段控制手机用于 DNS 解析的服务器,但该AllowedIPs
字段控制手机实际通过其 WireGuard 网络路由的流量。
听起来您的手机的 WireGuard 配置可能如下所示(203.0.113.2
其中一些可通过 Internet 访问的 IP 地址会将端口转发51820
到您的 WireGuard 容器):
[Interface]
PrivateKey = ...
Address = 10.0.0.123
DNS = 192.168.1.208
[Peer]
PublicKey = ...
AllowedIPs = 192.168.1.0/24
Endpoint = 203.0.113.2:51820
这意味着,虽然您的手机使用 Pi-hole 来解析其 DNS 查询(例如查找 YouTube 或 Reddit 的 IP 地址),但它仍然使用其常规互联网连接来实际访问这些互联网网站(即连接到这些 IP 地址)。您的某些 Pi-hole DNS 查询返回的 IP 地址可能无法通过手机的互联网连接访问(例如,因为它们特定于只能由您的 Pi-hole 的互联网连接使用的 CDN 缓存)。
如果您将AllowedIPs
手机上的设置更改为包含以下所有流量(0.0.0.0/0
针对 IPv4 和::/0
IPv6),它还会通过 WireGuard 容器发送您的所有互联网流量:
[Interface]
PrivateKey = ...
Address = 10.0.0.123
DNS = 192.168.1.208
[Peer]
PublicKey = ...
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 203.0.113.2:51820
在您的 WireGuard 容器中,您还需要设置一些防火墙规则来将流量通过 SNAT 传输到 Internet(例如类似的规则iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
),但您可能已经为 Internet 和 LAN 的流量设置了类似的规则。
查看隧道传输所有互联网流量和使本地设备可访问有关更多详细信息,请参阅 Pi-hole 文档的部分。