1. 简介
在本教程中,我们将了解如何在使用 VPN 时查看和修改所查询的 DNS 服务器。
2. 基本定义
DNS(Domain Name System,域名系统)是将人类可读的域名翻译成对应的 IP 地址的系统。DNS 服务器中保存了域名与 IP 地址的映射关系。如果一个 DNS 服务器拥有某个域名的权威记录,则称为“权威 DNS 服务器”;否则称为“非权威 DNS 服务器”,它通过缓存来响应查询。
我们可以通过命令行工具如 nslookup
和 dig
来查询 DNS 信息。nslookup
支持 Windows、macOS 和 Linux,而 dig
提供了更详细的输出,适合调试。在移动设备上,也可以通过应用商店安装类似的工具。当然,也可以使用在线工具如 nslookup.io。
VPN(Virtual Private Network,虚拟私人网络)是一种在公共网络上建立安全连接的技术。它通过将网络流量加密并转发到远程服务器来隐藏用户的实际 IP 地址。这在使用公共 Wi-Fi、绕过网络限制或访问区域受限内容时非常有用。但需要注意的是,使用 VPN 并不意味着所有 DNS 请求都会被加密。
3. Split-Mode 与 Full-Tunnel VPN
根据流量处理方式,VPN 通常分为两类:
- ✅ Full-Tunnel 模式:所有网络流量都通过 VPN 隧道传输和加密,包括 DNS 请求,这样可以有效防止 DNS 泄露。
- ❌ Split-Mode 模式:只将部分流量(如企业内部资源)通过 VPN 传输,其余流量走本地网络。此时 DNS 请求可能仍通过本地 DNS 服务器,存在泄露风险。
为了确认 DNS 请求是否通过 VPN,我们需要借助工具进行验证。
4. 查看 DNS 客户端配置的命令行工具
在不同操作系统中,可以通过以下命令查看当前使用的 DNS 服务器:
4.1 Windows
使用命令:
ipconfig /all
查找输出中的 “DNS Servers” 字段。
4.2 macOS
使用命令:
scutil --dns | grep 'nameserver\[[0-9]*\]'
该命令会过滤出当前使用的 DNS 地址。
4.3 Linux
使用命令:
nmcli
在输出中查找 “DNS configuration” 部分。
⚠️ 注意:这些命令可能显示的是本地配置,而非实际使用的 DNS 服务器,尤其是在使用了透明 DNS 代理的情况下。
5. DNS 泄露与透明 DNS 代理
5.1 什么是 DNS 泄露?
当使用 VPN 时,如果 DNS 请求没有通过加密隧道,而是通过本地网络的 DNS 服务器(通常是 ISP 提供的),就会发生 DNS 泄露。这会暴露你的浏览行为,甚至可能被用于追踪你的地理位置。
此外,一些 ISP 使用 透明 DNS 代理(Transparent DNS Proxy) 来拦截 DNS 请求并强制使用其 DNS 服务,这会导致用户无法察觉地使用非预期的 DNS 服务器。
5.2 DNS 泄露测试工具的工作原理
DNS 泄露测试网站或脚本通常会生成一个唯一的子域名(例如 UUID:779298b9-57ac-40a3-9359-a482b113203a
),然后引导你的浏览器或脚本去解析该域名。
由于这个子域名从未被解析过,只有权威 DNS 服务器知道其 IP 地址。因此,你的本地 DNS 服务器(非权威)会向该测试网站的权威 DNS 服务器发起查询。测试服务器通过记录查询来源的 IP 地址,就能知道你使用的 DNS 服务器是谁。
如果这个 DNS 服务器是你 ISP 的,那说明你正在经历 DNS 泄露。
5.3 开源 DNS 泄露测试脚本
- ✅ macvk/dnsleaktest:提供 Bash、Python 和 PowerShell 脚本。
- ✅ D7EAD/Faucet:C++ 编写,Windows 可用。
这些脚本通常连接 bash.ws/dnsleak 进行测试。
5.4 第三方 DNS 泄露测试服务
以下是一些常见的在线测试网站:
此外,还有适用于 Android 的 DNS Leak Test 应用。
5.5 自建 DNS 泄露测试服务器
如果你不想依赖第三方服务,可以使用 nhdms/dns-leak-server 项目搭建自己的测试服务器。
6. 修改使用 VPN 时的 DNS 设置
以 OpenVPN 客户端为例,说明如何手动配置 DNS。
6.1 修改 .ovpn 文件
编辑 .ovpn
文件,添加以下配置:
register-dns
block-outside-dns
dhcp-option DNS 208.67.222.222
其中:
register-dns
:强制客户端优先使用配置的 DNS。block-outside-dns
:阻止 DNS 请求发送到非配置的 DNS 服务器。dhcp-option DNS
:指定使用的 DNS 服务器地址(例如 Cisco OpenDNS 的208.67.222.222
)。
6.2 示例 .ovpn 文件
client
dev tun
proto tcp
remote x.x.x.x 443
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
ignore-unknown-option block-outside-dns
block-outside-dns
verb 0
log /dev/null
status /dev/null
register-dns
dhcp-option DNS 208.67.222.222
<ca>
⚠️ 注意:x.x.x.x
应替换为实际的 VPN 服务器 IP。
修改完成后,重新导入该 .ovpn
文件到 OpenVPN 客户端即可生效。
6.3 Linux 系统的特别说明
大多数现代 Linux 发行版已集成 OpenVPN 支持,可以直接在 NetworkManager 中设置 DNS,无需额外安装客户端。
7. 总结
通过本教程,我们了解了在使用 VPN 时 DNS 请求的处理方式可能与预期不符,甚至存在泄露风险。我们还学习了如何检测和修改 DNS 设置,以增强隐私保护。
DNS 泄露只是隐私保护中的一个方面。在高度监控的环境下,匿名浏览不仅需要技术手段,还需要良好的行为习惯。例如避免在使用 VPN 时访问本地网络资源,定期检查 DNS 设置等。