DNSSEC 用数字签名证明一组解析记录在途中没有被改写。截至 2026 年 10 月,它不加密查询,也不隐藏域名。连上 VPN 之后校验突然失败,通常是因为实际使用的解析器开始执行验证、签名时间对不上,或变长的应答在路上被截断。隧道图标亮着,也不会给域名补上签名。
签名覆盖的是哪一组记录
一个可独立引用的定义句:DNSSEC(RFC 4033、RFC 4034、RFC 4035)为 DNS 记录集附上数字签名,用来确认数据来自持有该区密钥的一方,并且到达校验方时没有被改掉。
校验时看的是一条链,而不是单独一条 A 记录:
- 校验方持有信任锚,公共解析器常见的锚是根区信任锚;
- 父区里的 DS 记录指向子区的 DNSKEY;
- 子区的 DNSKEY 用来核对盖在记录集上的 RRSIG。
「没有这个名字」也可以被签名。NSEC 或 NSEC3 用来证明某个名字或某种类型确实不存在,所以「查无此名」和「校验失败」是两种返回。
一个可独立引用的结论句:未签名的区处于「没有这条签名链」的状态,校验方仍可返回地址,只是不应把结果标成已验证。签名对不上时,正在执行验证的解析器按 RFC 4035 返回服务器失败(RCODE 2),不把可疑地址交给应用。
传输加密和签名各管一层
DoH 与 DoT 加密的是本机到解析器这一跳。DNS 泄漏检查 关心的是这次查询问到了哪一台解析器。DNSSEC 关心的是答案本身有没有被改写。三层可以同时成立,也可以只成立其中一层。
| 问题 | 明文 DNS | DoH / DoT | DNSSEC |
|---|---|---|---|
| 沿途能否看见查询的域名 | 这一跳通常能 | 到该解析器的这一跳被加密 | 签名不隐藏名字 |
| 改过的答案还会不会被用 | 会 | 加密只保护到所选解析器;解析器仍可返回未签名的答案 | 执行验证时,对不上的答案以失败返回 |
| 谁在做判断 | 应用直接用收到的地址 | 仍取决于该解析器是否验证 | 持有信任锚并执行验证的那一方 |
解析器在应答里置 AD 位,表示它认为答案段和权威段里的记录集可信(RFC 4035)。这个位是解析器自己的结论。跨网络收到的 AD,只在你信任这条路径、并且相信这台解析器时才有意义。本机自己持有信任锚再验一遍,才是本机完成的校验。
换到 VPN 的解析器之后
VPN 或 TUN 经常改掉系统使用的解析器。签名是否被核对,跟着这台新解析器的策略走。
| 切换之后 | 应用看到的结果 |
|---|---|
| 从「不验证」换成「会验证」,目标区签名完整 | 答案可以带上已验证的结论 |
| 从「不验证」换成「会验证」,目标区签名过期、链中断或被改过 | 原先能打开的名字变成服务器失败 |
| 换成不验证的解析器 | 查询仍可能成功,但 AD 不能被读成已验证 |
| 应答大到 UDP 装不下,截断后又没有走成 TCP | 校验方拿不到完整 RRSIG,表现为超时或失败 |
最后一行和 MTU 不匹配 是同一类路径问题。DNSSEC 把应答变长,经典的 512 字节 UDP 经常不够,要靠 EDNS 缓冲或回退到 TCP。缓冲开得很大时,外层 UDP 可能要分片;分片被丢,签名就到不了校验方。
和时钟、Fake-IP、分离 DNS 分开
RRSIG 上有生效时间和过期时间,校验方用自己的钟去比。钟落在窗口外面时,签名会被当成无效。这和 证书有效期 用的材料不同:那边是 X.509 的 notBefore / notAfter,这边是 DNS 签名的时间字段。两边都依赖绝对时间,报错来源要分开记。
Fake-IP 在本机编一个占位地址来匹配规则。这个地址不是权威区签过名的 A 或 AAAA。自己做 DNSSEC 校验的应用,不会把占位地址当成该区的已验证答案。
分离 DNS 里的内网名字,常常没有挂到公共根的 DS 链上。公共的验证解析器会按「公共树里没有这个名字」处理。内网解析器可以返回地址,这份地址也不会因此获得公共 DNSSEC 的已验证结论。
本文只说明这几层如何分开阅读。不提供关闭校验、设置 CD 位,或让解析器跳过验证的步骤。
现象对照
| 现象 | 更可能先看什么 |
|---|---|
| 原先可用的名字变成服务器失败,未签名的名字仍正常 | 当前解析器开始执行验证,这条签名或信任链没有通过 |
| 同一名字在换解析器之前一直正常 | 先前那台解析器可能没有拒绝未通过的签名 |
| 失败伴随 DNS 超时,很小的查询却正常 | 变长应答被截断或分片丢失 |
| 报错跟着系统时间一起变化 | RRSIG 的时间窗,对照 UTC |
| 只有内网后缀失败,公共名字正常 | 分离 DNS 与公共签名树是两条链 |
| 只有走了虚拟地址的程序异常 | Fake-IP 的占位地址不携带该区签名 |
核对清单
- 先确认这次查询问的是谁:系统、浏览器和隧道客户端可以各用一台解析器;
- 再看这台解析器是否执行验证:查询成功只表示地址已经返回;签名是否通过,要看这台解析器有没有执行验证;
- 把服务器失败和查无此名分开:前者常是校验没通过,后者可以是被签名证明的不存在;
- 应答变长时另看路径:截断、EDNS 和分片,按 MTU 那篇的层次读;
- 保留校验:用签名链是否通过来解释失败。