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