跳转到内容

DNS 泄漏防范

缺少正确的 DNS 配置时,你的 DNS 查询可能泄漏到 VPN 隧道之外,向 ISP 或本地网络暴露你访问的域名。


当你连接到 VPN 时,流量被加密并通过 VPN 服务器路由。然而,DNS 查询通常由操作系统的 DNS 解析器单独处理,可能会直接发送到 ISP 的 DNS 服务器:

Without DNS proxy:
┌──────────────┐ ┌─────────────┐
│ Your device │ ──────► │ ISP DNS │ ← DNS leak!
│ │ └─────────────┘
│ ── VPN ────► │ ┌─────────────┐
└──────────────┘ ──────► │ VPN Server │ ← Regular traffic
└─────────────┘

即使你的 Web 流量通过 VPN 隧道,你的 ISP 仍然能看到你解析的每个域名。


rVPN DNS 代理在你的设备上本地运行。它接收 DNS 查询并通过加密的 VPN 隧道转发到服务器,由服务器进行解析:

With DNS proxy enabled:
┌──────────────┐ ┌─────────────┐
│ Your device │ │ ISP DNS │ ← Not used
│ │ └─────────────┘
│ [DNS proxy] │ ──────► │ VPN Server │ ← Encrypted tunnel
└──────────────┘ └─────────────┘

你的 ISP 看不到任何 DNS 查询。所有 DNS 解析都在加密隧道内发生。


DNS 代理会遵守分流规则:

域名类型行为
绕过的域名本地解析(不通过 VPN)
被拦截的域名(广告/跟踪)立即返回 NXDOMAIN
其他所有域名通过 VPN 隧道解析

这意味着:

  • 你绕过的国内流媒体站点在本地解析(无 VPN 开销)
  • 广告拦截无需向 VPN 服务器发送请求即可工作
  • 其他所有域名保持私有

1. 在 client.toml 中启用 DNS 代理:

[dns_proxy]
enabled = true
listen_address = "127.0.0.1:53"

2. 以 root 权限运行客户端(绑定端口 53 所需):

Terminal window
sudo rvpn -c ~/.config/rvpn/client.toml

3. 配置系统 DNS:

系统设置 -> 网络 -> 你的连接 -> 详细信息 -> DNS

127.0.0.1 添加为主 DNS 服务器。删除其他条目。

或通过命令行:

Terminal window
sudo networksetup -setdnsservers Wi-Fi 127.0.0.1

验证:

Terminal window
# Should show 127.0.0.1
networksetup -getdnsservers Wi-Fi
# Should return your VPN server's IP
dig @127.0.0.1 api.ipify.org

恢复原始 DNS:

Terminal window
sudo networksetup -setdnsservers Wi-Fi empty

方式 1:直接修改 resolv.conf

以 root 运行客户端:

Terminal window
sudo rvpn -c ~/.config/rvpn/client.toml

编辑 /etc/resolv.conf

nameserver 127.0.0.1

方式 2:systemd-resolved(推荐)

添加到 /etc/systemd/resolved.conf

[Resolve]
DNS=127.0.0.1

然后重启:

Terminal window
sudo systemctl restart systemd-resolved

验证:

Terminal window
resolvectl status | grep DNS
  1. 编辑连接:nm-connection-editor
  2. IPv4 设置 -> 方法:手动
  3. 添加 DNS 服务器:127.0.0.1
  4. 保存并重连

VPN 连接后访问以下站点:

  1. https://dnsleaktest.com
  2. https://ipleak.net
  3. https://browserleaks.com/dns

显示的 DNS 服务器应为你的 VPN 服务器 DNS(或你在 server.toml 中配置的 dns_servers),而非你的 ISP DNS。


在 TUN 模式下,客户端通过 DHCP 从服务器接收 dns_servers 并自动使用它们。DNS 代理仍推荐在 SOCKS5 模式下使用,因为 TUN 模式内建了 DNS 处理。

[server.network]
nat_enabled = true
dhcp_range = "10.200.0.0/24"
dns_servers = ["1.1.1.1", "8.8.8.8"]

这些 DNS 服务器会推送给 TUN 客户端。客户端直接使用它们进行 DNS 解析。


要通过 VPN 隧道使用特定的 DNS 提供商:

服务器端(推送给 TUN 客户端):

[server.tun]
dns_servers = ["1.1.1.1", "8.8.8.8"] # Cloudflare + Google

或注重隐私的选择:

[server.tun]
dns_servers = ["9.9.9.9", "149.112.112.112"] # Quad9

dns_servers 仅接受 IP 字面量;主机名会解析失败。

SOCKS5 模式下的客户端:

DNS 代理将查询转发给服务器,服务器使用 dns_servers 进行解析。要通过隧道使用特定 DNS,请在服务器上配置它们。


绕过域名的名字服务器(本地 DNS 回退)

Section titled “绕过域名的名字服务器(本地 DNS 回退)”

当 DNS 代理被设置为你的系统 DNS 解析器时,绕过的域名(走 VPN 之外的域名)需要特殊处理。若代理尝试使用系统解析器解析绕过域名,查询会环回到自身,导致隧道断开时完全的 DNS 失败。

为避免这种情况,rVPN 直接向公共名字服务器发送原始 UDP DNS 查询以处理绕过域名,完全跳过系统解析器:

设置默认值用途
nameservers["223.5.5.5:53", "1.1.1.1:53", "8.8.8.8:53"]用于绕过域名解析的公共 DNS 服务器

client.toml 中配置:

[dns_proxy]
enabled = true
nameservers = ["223.5.5.5:53", "119.29.29.29:53", "1.1.1.1:53"]
  • 中国用户: 将中国本地 DNS 放在前面(例如阿里 DNS 223.5.5.5 或 DNSPod 119.29.29.29)以在国内站点获得最佳延迟。
  • 全球用户: 默认顺序在全球范围内工作良好。
  • 这些服务器仅用于绕过域名。隧道域名仍通过加密 VPN 隧道解析。

rVPN 不会代理来自客户端应用的原始 DNS-over-HTTPS (DoH) 或 DNS-over-TLS (DoT) 请求。

本地 DNS 代理拦截来自操作系统的传统 UDP DNS 查询。对于应走隧道的域名,它使用自定义 DNS 协议(不是 DoH 或 DoT)通过 rVPN 的加密 WebSocket 隧道转发到服务器。服务器使用其标准系统 DNS 解析器进行解析。目前没有服务器端的 DoH/DoT 配置可用。


  • 确认 DNS 代理正在运行:dig @127.0.0.1 example.com
  • 检查 client.toml 中的 listen_address 与系统 DNS 设置一致
  • 尝试其他 DNS 服务器:dig @8.8.8.8 example.com
  • 端口 53 可能被占用:sudo lsof -i :53
  • 改用端口 5353(无需 root)
  • 尝试其他 DNS 服务器(Cloudflare 1.1.1.1 通常最快)
  • 对经常变化的域名,降低 client.toml 中的 dns_cache_ttl
  • 确保系统设置中没有其他 DNS 设置存在
  • 检查浏览器 DNS 设置(Firefox 可覆盖系统 DNS)
  • Chrome(桌面/Android): 在 Chrome 设置中关闭安全 DNS设置 → 隐私和安全 → 安全 → 使用安全 DNS → 关闭。 然后清除 Chrome 的 DNS 缓存:访问 chrome://net-internals/#dns 并点击 Clear host cache
  • iOS Chrome: 若站点无法解析,请强制关闭应用或清除浏览数据以刷新 DNS 缓存。
  • 确保没有无 VPN 的 DNS 解析器在运行(例如 mDNSResponder)