防止 DNS 泄漏¶
如果没有正确的 DNS 配置,您的 DNS 查询可能会泄漏到 VPN 隧道之外,向您的 ISP 或本地网络揭示您访问的域名。
DNS 泄漏如何发生¶
当您连接到 VPN 时,您的流量会被加密并通过 VPN 服务器路由。然而,DNS 查询通常由操作系统的 DNS 解析器单独处理,它可能直接将查询发送到您 ISP 的 DNS 服务器:
没有 DNS 代理:
┌──────────────┐ ┌─────────────┐
│ 您的设备 │ ──────► │ ISP DNS │ ← DNS 泄漏!
│ │ └─────────────┘
│ ── VPN ────► │ ┌─────────────┐
└──────────────┘ ──────► │ VPN 服务器 │ ← 常规流量
└─────────────┘
即使您的网页流量通过 VPN 隧道,您的 ISP 仍能看到您解析的每个域名。
R-VPN DNS 代理如何防止泄漏¶
R-VPN DNS 代理在您的设备上本地运行。它接收 DNS 查询并通过加密的 VPN 隧道将它们转发到服务器,服务器再解析它们:
启用 DNS 代理后:
┌──────────────┐ ┌─────────────┐
│ 您的设备 │ │ ISP DNS │ ← 未使用
│ │ └─────────────┘
│ [DNS 代理] │ ──────► │ VPN 服务器 │ ← 加密隧道
└──────────────┘ └─────────────┘
您的 ISP 看不到任何 DNS 查询。所有 DNS 解析都在加密隧道内进行。
分流隧道集成¶
DNS 代理遵守分流隧道规则:
| 域名类型 | 行为 |
|---|---|
| 被绕过的域名 | 本地解析(不通过 VPN) |
| 被拦截的域名(广告/追踪器) | 立即返回 NXDOMAIN |
| 其他所有域名 | 通过 VPN 隧道解析 |
这意味着: - 您绕过的国内流媒体网站在本地解析(无 VPN 开销) - 广告拦截器在不向 VPN 服务器发送请求的情况下工作 - 所有其他域名都是私密的
设置¶
macOS¶
1. 在 client.toml 中启用 DNS 代理:
2. 使用 root 权限运行客户端(需要绑定端口 53):
3. 配置系统 DNS:
系统设置 -> 网络 -> 您的连接 -> 详细信息 -> DNS
添加 127.0.0.1 作为主要 DNS 服务器。删除任何其他条目。
或通过命令行:
验证:
# 应该显示 127.0.0.1
networksetup -getdnsservers Wi-Fi
# 应该返回您的 VPN 服务器的 IP
dig @127.0.0.1 api.ipify.org
恢复原始 DNS:
Linux¶
选项 1:直接 resolv.conf
以 root 身份运行客户端:
编辑 /etc/resolv.conf:
选项 2:systemd-resolved(推荐)
添加到 /etc/systemd/resolved.conf:
然后重启:
验证:
Linux with NetworkManager¶
- 编辑连接:
nm-connection-editor - IPv4 设置 -> 方法:手动
- 添加 DNS 服务器:
127.0.0.1 - 保存并重新连接
测试 DNS 泄漏¶
在连接 VPN 的情况下访问这些网站:
- https://dnsleaktest.com
- https://ipleak.net
- https://browserleaks.com/dns
显示的 DNS 服务器应该是您 VPN 服务器的 DNS(或在 server.toml 中配置的 dns_servers),而不是您 ISP 的 DNS。
TUN 模式中 DNS 解析的工作原理¶
在 TUN 模式下,客户端通过 DHCP 从服务器接收 dns_servers,并自动使用它们。在使用 SOCKS5 模式时仍然建议使用 DNS 代理,因为 TUN 模式具有内置的 DNS 处理。
服务器 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 解析。
自定义 DNS 服务器¶
要通过 VPN 隧道使用特定 DNS 提供商:
服务器端(推送到 TUN 客户端):
或注重隐私的:
SOCKS5 模式下的客户端端:
DNS 代理转发到服务器,服务器使用 dns_servers 解析。要通过隧道使用特定 DNS,请在服务器上配置它们。
DNS-over-HTTPS 和 DNS-over-TLS¶
R-VPN **不**代理来自客户端应用程序的原始 DNS-over-HTTPS(DoH)或 DNS-over-TLS(DoT)请求。
本地 DNS 代理拦截来自操作系统的传统 UDP DNS 查询。对于应通过隧道传输的域名,它通过 R-VPN 的加密 WebSocket 隧道使用自定义 DNS 协议(不是 DoH 或 DoT)将其转发到服务器。服务器使用其标准系统 DNS 解析器进行解析。目前没有可用的服务器端 DoH/DoT 配置。
DNS 问题故障排除¶
域名无法解析¶
- 验证 DNS 代理正在运行:
dig @127.0.0.1 example.com - 检查 client.toml 中的 listen_address 与您的系统 DNS 设置匹配
- 尝试不同的 DNS 服务器:
dig @8.8.8.8 example.com
DNS 代理未启动¶
- 端口 53 可能被占用:
sudo lsof -i :53 - 尝试端口 5353(无需 root)
DNS 解析缓慢¶
- 尝试不同的 DNS 服务器(Cloudflare 1.1.1.1 通常最快)
- 减少 client.toml 中的 dns_cache_ttl 以应对频繁变化的域名
启用代理后 DNS 仍在泄漏¶
- 确保系统中没有其他 DNS 设置
- 检查浏览器 DNS 设置(Firefox 可以覆盖系统 DNS)
- Chrome(桌面/安卓):**在 Chrome 设置中禁用 安全 DNS:
设置 → 隐私和安全 → 安全 → 使用安全 DNS→ 关闭。 然后清除 Chrome 的 DNS 缓存:访问chrome://net-internals/#dns并点击 **清除主机缓存。 - **iOS Chrome:**如果网站无法解析,强制关闭应用或清除浏览数据以刷新 DNS 缓存。
- 确保没有运行无 VPN 的 DNS 解析器(例如 mDNSResponder)