跳转至

防止 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 代理:

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

2. 使用 root 权限运行客户端(需要绑定端口 53):

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

3. 配置系统 DNS:

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

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

或通过命令行:

sudo networksetup -setdnsservers Wi-Fi 127.0.0.1

验证:

# 应该显示 127.0.0.1
networksetup -getdnsservers Wi-Fi

# 应该返回您的 VPN 服务器的 IP
dig @127.0.0.1 api.ipify.org

恢复原始 DNS:

sudo networksetup -setdnsservers Wi-Fi empty

Linux

选项 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

Linux with NetworkManager

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

测试 DNS 泄漏

在连接 VPN 的情况下访问这些网站:

  1. https://dnsleaktest.com
  2. https://ipleak.net
  3. 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 客户端):

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

或注重隐私的:

dns_servers = ["privacy.wikipedia.org", "dns.sb"]

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)