首页/网络/协议速查/NSEC 记录(否定存在证明)
DNS 与域名解析60 条

NSEC 记录(否定存在证明)

DNSSEC 的「链式否定证明」:每个名字指向排序中的下一个名字,验证器据此证明「查询的名字不存在」。

协议速查网络更新于 2026-10-13

NSEC 是什么

NSEC(TYPE 47)是 DNSSEC 的否定存在证明机制:区域内所有名字按规范排序成一条链,每条 NSEC 记录指向「排序中的下一个名字」并附带类型位图。验证解析器据此证明「你查询的名字或类型确实不存在」,而不是被中间人伪造的 NXDOMAIN(RFC 4034 §4)。

基本信息

类型NSEC(TYPE 47)
字段下一个域名与类型位图
规范RFC 4034 §4
作用证明名字或类型不存在
副作用支持区域漫步,可枚举区域内全部名字
适用建议公网区域优先改用 NSEC3

典型使用场景

  • DNSSEC 验证失败排查:确认否定证明链是否完整
  • 安全评估:判断区域是否会被区域漫步完整枚举
  • 解释解析器行为:为什么 NXDOMAIN 也需要签名保护
  • 选型对比:NSEC 与 NSEC3 在记录体积与可枚举性上的取舍
  • 迁移演练:从 NSEC 切换到 NSEC3 时的验证要点
  • 教学演示:用 dig 观察类型位图与指向的下一个名字

观察否证记录

观察否证记录
# 观察 NSEC 记录(需区域已启用 DNSSEC)
dig +dnssec +noall +answer example.com A
# example.com. 3600 IN NSEC mail.example.com. A MX RRSIG NSEC
# 类型位图说明该名字上存在 A、MX、RRSIG、NSEC 这些类型

# 查询一个不存在的名字,观察否定证明
dig +dnssec nonexist.example.com A | grep -iE 'NSEC|status'

NSEC 与 NSEC3 对比

对比项NSECNSEC3
owner name真实名字哈希值
可枚举性可被区域漫步完整枚举需先爆破哈希,成本更高
记录体积较小较大,含盐与迭代参数
适用场景内网或不敏感区域公网区域优先
NSEC 让区域内容可被完整枚举,公网区域通常改用 NSEC3,必要时配合 opt-out 减少记录数量。
类型位图很实用:它能同时证明「名字存在但该类型不存在」,例如只有 A 记录没有 AAAA 时返回的是 NODATA 而不是 NXDOMAIN。
若权威直查能看到记录、走验证解析器却返回 SERVFAIL,多半是否定证明或签名链有问题,而不是记录不存在。
NSEC 链是排序链,新增名字会改变相邻记录的指向,因此修改记录后必须重新签名并发布。
使用 NSEC 的区域做日志分析时要考虑:扫描器可能借区域漫步一次性拉取全部名字。

易错点

  • 在公网区域使用纯 NSEC,等于公开区域内的全部名字
  • DNSSEC 签名与区域同步失败会导致 NSEC 链断裂,验证解析器直接 SERVFAIL
  • 把 SERVFAIL 当成权威返回的 NXDOMAIN 处理,会误判为「记录没生效」
  • 新增或删除记录后未重新签名,NSEC 链与区域内容不一致,否定证明失效
  • 把 opt-out 当成 NSEC 的能力去配置:该机制属于 NSEC3,配错会得到意外的验证结果

数据来源与参考

  • RFC 4034 §4 NSEC
  • RFC 4470(NSEC 最小覆盖)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌