我正在尝试设置具有两跳的 VPN:来自客户端的流量通过 VPS 服务器路由,然后到达 mullvad vpn:
一切正常,但我不确定 DNS 是否按预期工作。我希望我的 DNS 请求采用与其他所有数据包相同的路由:从客户端到 VPS 服务器,然后到 mullvad。
我的 VPS 服务器运行一个不受约束的 DNS 服务器,它将整个流量路由到 Mullvad DNS,并且 mullvad wireguard 配置有dns = 127.0.0.1
。您可以在下面找到配置文件。
我无法理解 wg-quick 客户端配置中的“DNS”参数如何工作,具体来说:
- 如果我输入
dns = "10.8.0.1"
(VPS 服务器的 wireguard IP 地址),DNS 不起作用 - 如果我输入
dns = 1.1.1.1
,或者实际上输入任何 IP,请求就会通过 VPS 服务器路由,然后到达 mullvad,永远不会到达 1.1.1.1 或我在那里输入的任何 IP。要清楚:DNS 请求得到解析,它总是通过 vps 服务器,然后是 mullvad,基本上忽略了我在 dns 参数中输入的任何内容。 - 如果我
dns = ...
全部删除,那么我不确定会发生什么,我从 dnsleak 看到我的请求来自保加利亚,并且我的 vps 托管在那里,所以也许它正在使用 vps dns?
这是我的配置:
客户端 wireguard 配置
[Interface]
Address = 10.8.0.2/24
DNS = 1.1.1.1
PrivateKey = redacted
[Peer]
AllowedIPs = 0.0.0.0/0
Endpoint = IP:51820
PublicKey = redacted
VPS 服务器“客户端<>服务器”wireguard 配置:
[interface]
PrivateKey = redacted
Address = 10.8.0.1/24
PostUp = iptables -I FORWARD -i %i -j REJECT
PostUp = iptables -I FORWARD -o %i -j REJECT
PostUp = iptables -I FORWARD -i %i -o mull -j ACCEPT
PostUp = iptables -I FORWARD -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
PreDown = iptables -D FORWARD -i %i -o mull -j ACCEPT
PreDown = iptables -D FORWARD -o %i -j REJECT
PreDown = iptables -D FORWARD -i %i -j REJECT
ListenPort = 51820
[peer]
PublicKey = redacted
AllowedIPs = 10.8.0.2/32
VPS 服务器“server<>mullvad”wireguard 配置:
[Interface]
PrivateKey = redacted
Address = IP/32
DNS = 127.0.0.1
#### Routing configuration ####
Table = 123
PostUp = ip rule add from 10.8.0.0/24 table 123
PostUp = ip rule add from IP/32 table 123
PostUp = iptables -t nat -A POSTROUTING -o %i -j MASQUERADE
PreDown = ip rule del from 10.8.0.0/24 table 123
PreDown = ip rule del from IP/32 table 123
PreDown = iptables -t nat -D POSTROUTING -o %i -j MASQUERADE
#### End Routing configuration ####
[Peer]
PublicKey = redacted
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = IP:51820
VPS服务器DNS解绑配置:
server:
verbosity: 1
interface: 127.0.0.1
interface: 10.8.0.1
interface: 0.0.0.0
forward-zone:
name: "."
forward-addr: 100.64.0.3 # mullvad dns ip
任何有助于理解正在发生的事情的帮助都将不胜感激,谢谢!:)
2
最佳答案
1
wg-quick
本身(实际上是一个 shell 脚本)会调用resolvconf
该DNS=
行,而resolvconf
实际上可能是“真正的”行或符号链接resolvectl
(与 systemd-resolved 对话)。
如果我没记错的话,“真实”resolvconf
会弄乱你的/etc/resolv.conf
。我对此并没有太多经验,所以我不知道它究竟如何管理东西的细节。
如果它是 systemd-resolved并且 resolvectl
您正在使用,我认为事情可能会非常复杂,因为 systemd-resolved 本身具有不同的操作“模式”,取决于例如它/etc/resolv.conf
是常规文件还是符号链接(如果它是符号链接,则它指向哪个文件)。
我认为如果您使用“推荐模式”(即/etc/resolv.conf
指向具有已解析存根的 systemd 生成文件127.0.0.53
作为唯一的 DNS 服务器),它可能会将wireguard 接口的链接 DNS 服务器DNS=
设置为您在 中设置的内容。
据我所知, “推荐模式”容易发生 DNS 泄漏,因为至少默认情况下,当解析收到 DNS 请求时,它会将它们转发到所有链接 DNS 服务器。
就我个人而言,我不会使用DNS=
(在已解决“推荐模式”问题的系统上)。相反,我有类似的东西:
PreUp=resolvectl dns wlan0 ""
PostUp=resolvectl dns %i 192.168.144.49
PostDown=resolvectl revert wlan0
(我对设置通用的“终止开关”不感兴趣。)
我记得有一段时间“假货”resolvconf
真的不能用wg-quick
,因为有些开关wg-quick
不支持。我不知道现在是否还这样。
如果我输入 dns = “10.8.0.1”(VPS 服务器的 wireguard IP 地址),DNS 不起作用
这可能是因为 VPS 服务器上的防火墙丢弃/拒绝(非环回)入站 DNS 请求,至少是那些通过 wireguard 接口进入的请求。
如果我输入 dns = 1.1.1.1,或者任何 IP,请求就会通过 VPS 服务器路由,然后到达 mullvad
这可能是因为 Mullvad 客户端添加了一个 DNAT 规则,将所有目标端口为 53 的流量重定向到127.0.0.1
PREROUTING 链中的设置 DNS 服务器(即)(假设您没有使用wg-quick
Mullvad 的“vanilla” ;或者如果您使用,也许PostUp=
在配置文件中有一个)。
如果我完全删除 dns = …,那么我不确定会发生什么
您的客户端将坚持使用“原始”DNS服务器。
如果它是一个只被默认路由覆盖的主机,就像(通常会这样),那么有和没有以原始服务器作为值的行1.1.1.1
之间应该没有区别。DNS=
如果主机被非默认路由所覆盖,比如客户端的家庭路由器,那么 DNS 解析将在不涉及您的 VPS 服务器(或任何其他服务器)的情况下完成,因为根据 的wg-quick
策略 /“技巧” AllowedIPs = 0.0.0.0/0
,非默认路由所覆盖的流量不会被路由到隧道中。
|
–
DNS = 1.1.1.1
并跟踪 DNS 请求dnstop
,我可以看到客户端正在向 vps 发出请求,基本上“忽略”了我在那里输入了 1.1.1.1。–
|