技巧 #13:警惕代理使用中的 DNS 泄漏
你以为流量都走了代理,实际上域名解析请求仍从本地网络直接发出——这就是 DNS 泄漏。它不仅暴露你正在访问哪些域名,还可能在特定网络环境下导致解析结果被污染,让代理形同虚设。
DNS 查询路径:本地解析与远程解析的区别
问题的关键在于由谁发起域名解析。以 SOCKS 代理为例,地址写法不同,查询路径完全不同:
- socks5://(本地解析): 客户端先在本地把域名解析成 IP,再把 IP 交给代理。解析请求走的是本地运营商的 DNS 服务器,这种写法必然造成泄漏。
- socks5h://(远程解析): 域名原样发送给代理服务器,由代理在自己的网络环境里完成解析,本地不产生任何 DNS 查询。
HTTP 代理的 CONNECT 隧道天然由代理端解析域名,风险主要出现在浏览器预先做 DNS 预解析的场景,可以在浏览器设置中关闭该功能。
三种检测方法
- 在线检测页: 访问 dnsleaktest 这类检测站点并执行标准测试,查看列出的解析服务器是否仍属于本地运营商。
- 抓包验证: 在本机用抓包工具过滤 53 端口流量,确认开启代理后没有明文 DNS 查询外发。
- 对比结果: 分别在直连与代理环境下解析同一批域名,若代理下返回的解析服务器仍是本地 ISP,即可判定泄漏。
防范配置示例
命令行下要养成使用远程解析写法的习惯:
# 泄漏写法:域名在本地解析
curl --socks5 127.0.0.1:1080 https://example.com
# 安全写法:域名交给代理解析(远程解析)
curl --socks5-hostname 127.0.0.1:1080 https://example.com
在 Python requests 中同样应把代理地址写成 socks5h:// 协议头。此外,建议在系统层面把其他应用的 DNS 流量一并引导进代理隧道,避免后台程序绕行造成隐性泄漏。
Article ID: 73
(本文仅供技术交流,请遵守法律法规)