我正在尝试设置具有两跳的 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

  • 2
    DNS 没有什么特别之处。Wireguard 不知道 DNS。DNS 通常不知道它通过哪个接口传输。


    – 

  • @vidarlo 是的,我明白了 🙂 我意识到我的问题可能不是很清楚,我试图改进它,但事实是我不明白 wg-quick 配置中的“DNS = …”参数如何影响发出的 DNS 请求。以我的第二点为例:通过输入DNS = 1.1.1.1并跟踪 DNS 请求dnstop,我可以看到客户端正在向 vps 发出请求,基本上“忽略”了我在那里输入了 1.1.1.1。


    – 


最佳答案
1

wg-quick本身(实际上是一个 shell 脚本)会调用resolvconfDNS=行,而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.1PREROUTING 链中的设置 DNS 服务器(即)(假设您没有使用wg-quick Mullvad 的“vanilla” ;或者如果您使用,也许PostUp=在配置文件中有一个)。

如果我完全删除 dns = …,那么我不确定会发生什么

您的客户端将坚持使用“原始”DNS服务器。

如果它是一个只被默认路由覆盖的主机,就像(通常会这样),那么有和没有以原始服务器作为值的行1.1.1.1之间应该没有区别。DNS=

如果主机被非默认路由所覆盖,比如客户端的家庭路由器,那么 DNS 解析将在不涉及您的 VPS 服务器(或任何其他服务器)的情况下完成,因为根据 的wg-quick策略 /“技巧” AllowedIPs = 0.0.0.0/0,非默认路由所覆盖的流量不会被路由到隧道中。