DNS 泄漏、开放端口与 TLS 指纹
三个容易被忽略的“旁路”:域名解析绕过了隧道、你的公网 IP 上开着 22 或 3389、以及 TLS 握手本身就能暴露客户端。讲原理、讲本站怎么测,以及怎么交叉验证。
5 分钟阅读 · 发布于 2026年9月10日
翻墙工具把流量塞进加密隧道,这一步大家都盯着。但连接一个网站之前还有个更早的步骤——把域名变成 IP——它经常走在隧道外面。同样容易忽略的还有你这台机器对外开了什么门,以及加密握手本身会不会“说漏嘴”。这三件事本站都测:端口在 IP 页,DNS 和 TLS 在指纹实验室里各有一页。后两项依赖单独部署,有的实例上会显示“未配置”而不是结果;不管哪种情况,下面的原理都告诉你该看什么。
DNS 泄漏是怎么发生的
浏览器要访问 example.com,先问系统的解析器“这个域名对应哪个 IP”。正常情况下,用了代理之后这个问题应该交给隧道另一头的解析器去答;泄漏指的是它没有,而是直接问了你本地运营商的 DNS。
出错的路径有好几条。最常见的是工具只接管了 TCP 连接,系统仍然按老习惯往运营商 DNS 发 UDP 53 的查询。Windows 还有“并行解析”的习惯:多张网卡同时发问,谁先回用谁的,隧道那边慢一点就输了。IPv6 是另一个经典漏洞——工具只代理了 IPv4,IPv6 的解析和连接原样走运营商。最后还有透明劫持:一些运营商不管你把 DNS 设成什么,都在网关上把 53 端口的流量截下来自己回答。
后果分两层。一层是隐私:内容加密了,但运营商和审查者知道你查了哪些域名,这份清单本身已经足够说明问题。另一层对中国用户更实际——被污染的 DNS 给你一个错误的 IP,工具日志显示“已连接”,实际连去了一个不存在的地址。很多“明明开了代理却上不去”的问题,根子在这里。
检测是怎么做的
检测的思路很巧。测试站控制着某个域名的权威 DNS,页面加载时生成一个独一无二的子域名,比如 k3f9a2.dnsleak.example,让浏览器去请求它。这个名字不存在于任何缓存,查询一定会一路追到权威服务器;权威服务器记下“是谁来问的”——那个解析器的出口 IP 就是你的 DNS 出口。属于你的运营商,就泄漏了;属于 VPN 商或公共 DNS,就没有。
本站指纹实验室里的 DNS 泄漏页做的就是这件事:浏览器在我们做权威解析的一个域名区域下解析六个一次性主机名,DNS 服务器记下每个名字是哪个解析器来问的,页面把这些解析器连同 ASN 和国家列出来;只要有一个解析器和你的出口 IP 不在同一个国家,就判为泄漏。唯一的前提是要有一个委派给本站的 DNS 区域,这和网站本身是两套部署——哪个实例没配这个区域,页面就直接写“未配置”,不瞎猜。
不管结果如何,都值得再用现成的站交叉验证一次:ipleak.net、dnsleaktest.com,或 browserscan 的 dns-leak 页面。看结果抓两点——列出的解析器不应该是本地运营商的;理想情况下解析器和出口 IP 在同一个国家。香港出口配一个北京电信的解析器,就是典型的泄漏。
怎么堵
工具层面,多数现代客户端都有“远程 DNS”之类的选项:Clash 系的 fake-ip 模式、sing-box 的 DNS 路由规则,本质都是让解析也走隧道,或者在本地先返回一个假 IP、把真正的解析推迟到出口那头。开了这个,泄漏基本就止住了。
系统层面可以改用 DoH,查询本身加密,运营商截不到也污染不了——不过 DoH 服务在某些网络会被封,需要试。IPv6 要么禁掉,要么确认工具接管了它。还有一个常见坑是“仅浏览器代理”模式:浏览器走隧道,系统其他部分不走,DNS 自然也不走。
22 和 3389 端口为什么值得看
本站的 IP 页会从我们的服务器主动连一次你公网 IP 的 22(SSH)和 3389(RDP),两秒超时,告诉你 open、closed 或 filtered。只测这两个,是因为它们的含义最明确。
家庭网络从外面看,这两个端口应该是关的或被防火墙丢弃的。显示 open 通常意味着两种情况之一:你正在一台云服务器或 VPS 上跑浏览器(比如远程桌面进去用),或者家里路由器做了端口转发。前者很常见——不少人为了“干净 IP”干脆在海外 VPS 里开个桌面。
问题在于风控怎么看。browserscan 的观点是,一个“用户 IP”上开着 3389,等于告诉平台这是一台被远程操控的机器而不是一个人的电脑;一些平台确实会据此判定为工作室或自动化环境,进而限制或封号。我们不评判这是否合理,只是提醒它是真实存在的信号。
另外,如果你在 CGNAT 后面(手机流量、部分宽带),我们连到的是运营商网关而不是你的设备,结果没有意义。
TLS 指纹:握手就把你出卖了
最后说一个越来越重要的东西。浏览器建立 HTTPS 连接时,第一个包叫 ClientHello,列着客户端支持的 TLS 版本、密码套件顺序、扩展及其顺序、椭圆曲线、点格式。这些组合对每种客户端都相当固定:Chrome 有 Chrome 的顺序,Firefox 有 Firefox 的,Python 的 requests 又是另一副面孔。把这些字段拼起来做 MD5,就是 JA3 指纹;JA4 是后来的版本,更结构化也更耐随机化。HTTP/2 层面也有类似的东西:SETTINGS 帧取值、WINDOW_UPDATE、伪头部字段顺序,Akamai 把它们整理成了一种 h2 指纹。
作用很直接——User-Agent 写着 Chrome,TLS 握手却长得像 Go 的标准库,那多半是脚本。这是看穿 UA 伪装最可靠的手段之一,很多风控系统都在用。
对翻墙用户的意义在于:某些代理或中转会在中间终止 TLS 再重新发起,服务器看到的握手就不是你浏览器的了;有些工具则故意模拟 Chrome 的指纹以躲过封锁。要看到这些,服务器必须自己终止 TLS——挂在 CDN 后面只能看到 CDN 的握手。所以本站的 TLS 页会向一个单独的、不走 CDN 的主机名发一次跨域请求,握手在那里终止,页面报告 JA3、JA4 和 HTTP/2 指纹,并对照本站自己的统计看这个 JA4 是否常见于你 UA 声称的那类浏览器。这个端点没部署或者在你的网络里连不上时,页面退回到第三方的 check.ja3.zone,只有 JA3、没有对照。
常见问题
开了代理,DNS 也一定走代理吗? 不一定,要看工具配置。默认设置下不少客户端只代理连接、不代理解析。用上面提到的站自测一次最省事。
端口显示 filtered 是什么意思? 两秒内没有任何回应,多半是防火墙直接丢包。对家庭网络来说这是正常甚至偏好的状态。
JA3 能被伪造吗? 能。一些库专门模拟主流浏览器的握手,这也是 JA4 出现的部分原因。但伪造得处处一致并不容易,它仍然是有效的信号。