DNS 泄漏防范
缺少正确的 DNS 配置时,你的 DNS 查询可能泄漏到 VPN 隧道之外,向 ISP 或本地网络暴露你访问的域名。
DNS 泄漏是如何发生的
Section titled “DNS 泄漏是如何发生的”当你连接到 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 代理如何防止泄漏
Section titled “rVPN DNS 代理如何防止泄漏”rVPN DNS 代理在你的设备上本地运行。它接收 DNS 查询并通过加密的 VPN 隧道转发到服务器,由服务器进行解析:
With DNS proxy enabled:┌──────────────┐ ┌─────────────┐│ Your device │ │ ISP DNS │ ← Not used│ │ └─────────────┘│ [DNS proxy] │ ──────► │ VPN Server │ ← Encrypted tunnel└──────────────┘ └─────────────┘你的 ISP 看不到任何 DNS 查询。所有 DNS 解析都在加密隧道内发生。
与分流的集成
Section titled “与分流的集成”DNS 代理会遵守分流规则:
| 域名类型 | 行为 |
|---|---|
| 绕过的域名 | 本地解析(不通过 VPN) |
| 被拦截的域名(广告/跟踪) | 立即返回 NXDOMAIN |
| 其他所有域名 | 通过 VPN 隧道解析 |
这意味着:
- 你绕过的国内流媒体站点在本地解析(无 VPN 开销)
- 广告拦截无需向 VPN 服务器发送请求即可工作
- 其他所有域名保持私有
1. 在 client.toml 中启用 DNS 代理:
[dns_proxy]enabled = truelisten_address = "127.0.0.1:53"2. 以 root 权限运行客户端(绑定端口 53 所需):
sudo rvpn -c ~/.config/rvpn/client.toml3. 配置系统 DNS:
系统设置 -> 网络 -> 你的连接 -> 详细信息 -> DNS
将 127.0.0.1 添加为主 DNS 服务器。删除其他条目。
或通过命令行:
sudo networksetup -setdnsservers Wi-Fi 127.0.0.1验证:
# Should show 127.0.0.1networksetup -getdnsservers Wi-Fi
# Should return your VPN server's IPdig @127.0.0.1 api.ipify.org恢复原始 DNS:
sudo networksetup -setdnsservers Wi-Fi empty方式 1:直接修改 resolv.conf
以 root 运行客户端:
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然后重启:
sudo systemctl restart systemd-resolved验证:
resolvectl status | grep DNS使用 NetworkManager 的 Linux
Section titled “使用 NetworkManager 的 Linux”- 编辑连接:
nm-connection-editor - IPv4 设置 -> 方法:手动
- 添加 DNS 服务器:
127.0.0.1 - 保存并重连
测试 DNS 泄漏
Section titled “测试 DNS 泄漏”VPN 连接后访问以下站点:
显示的 DNS 服务器应为你的 VPN 服务器 DNS(或你在 server.toml 中配置的 dns_servers),而非你的 ISP DNS。
TUN 模式中的 DNS 解析
Section titled “TUN 模式中的 DNS 解析”在 TUN 模式下,客户端通过 DHCP 从服务器接收 dns_servers 并自动使用它们。DNS 代理仍推荐在 SOCKS5 模式下使用,因为 TUN 模式内建了 DNS 处理。
服务器 DNS 配置
Section titled “服务器 DNS 配置”[server.network]nat_enabled = truedhcp_range = "10.200.0.0/24"dns_servers = ["1.1.1.1", "8.8.8.8"]这些 DNS 服务器会推送给 TUN 客户端。客户端直接使用它们进行 DNS 解析。
自定义 DNS 服务器
Section titled “自定义 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"] # Quad9dns_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 = truenameservers = ["223.5.5.5:53", "119.29.29.29:53", "1.1.1.1:53"]- 中国用户: 将中国本地 DNS 放在前面(例如阿里 DNS
223.5.5.5或 DNSPod119.29.29.29)以在国内站点获得最佳延迟。 - 全球用户: 默认顺序在全球范围内工作良好。
- 这些服务器仅用于绕过域名。隧道域名仍通过加密 VPN 隧道解析。
DNS-over-HTTPS 和 DNS-over-TLS
Section titled “DNS-over-HTTPS 和 DNS-over-TLS”rVPN 不会代理来自客户端应用的原始 DNS-over-HTTPS (DoH) 或 DNS-over-TLS (DoT) 请求。
本地 DNS 代理拦截来自操作系统的传统 UDP DNS 查询。对于应走隧道的域名,它使用自定义 DNS 协议(不是 DoH 或 DoT)通过 rVPN 的加密 WebSocket 隧道转发到服务器。服务器使用其标准系统 DNS 解析器进行解析。目前没有服务器端的 DoH/DoT 配置可用。
DNS 问题故障排查
Section titled “DNS 问题故障排查”域名无法解析
Section titled “域名无法解析”- 确认 DNS 代理正在运行:
dig @127.0.0.1 example.com - 检查 client.toml 中的 listen_address 与系统 DNS 设置一致
- 尝试其他 DNS 服务器:
dig @8.8.8.8 example.com
DNS 代理无法启动
Section titled “DNS 代理无法启动”- 端口 53 可能被占用:
sudo lsof -i :53 - 改用端口 5353(无需 root)
DNS 解析缓慢
Section titled “DNS 解析缓慢”- 尝试其他 DNS 服务器(Cloudflare 1.1.1.1 通常最快)
- 对经常变化的域名,降低 client.toml 中的 dns_cache_ttl
有代理仍然泄漏
Section titled “有代理仍然泄漏”- 确保系统设置中没有其他 DNS 设置存在
- 检查浏览器 DNS 设置(Firefox 可覆盖系统 DNS)
- Chrome(桌面/Android): 在 Chrome 设置中关闭安全 DNS:
设置 → 隐私和安全 → 安全 → 使用安全 DNS→ 关闭。 然后清除 Chrome 的 DNS 缓存:访问chrome://net-internals/#dns并点击 Clear host cache。 - iOS Chrome: 若站点无法解析,请强制关闭应用或清除浏览数据以刷新 DNS 缓存。
- 确保没有无 VPN 的 DNS 解析器在运行(例如 mDNSResponder)