网站修改 DNS 后出现 SERVFAIL?DNSSEC、DS 记录与签名链路排查指南

网站更换 DNS 服务商或修改 DNS 后返回 SERVFAIL,常见原因是父区 DS 与当前 DNSKEY 不匹配、RRSIG 过期、权威节点未同步,或 DNSSEC 大报文被网络设备丢弃。本文给出 dig 对照查询、信任链核对、安全恢复与验证步骤。

网站更换 DNS 服务商、修改名称服务器或重新启用 DNSSEC 后,域名可能突然无法解析。浏览器只显示“找不到服务器”,命令行查询却返回 SERVFAIL。有些网络打不开,有些网络暂时正常,权威 DNS 控制台里的记录看上去也没有问题。

这种故障需要同时检查注册局父区和当前权威 DNS。只改 A、AAAA 或 CNAME 记录通常无效,因为启用 DNSSEC 后,递归解析器还会验证父区的 DS 记录、子区的 DNSKEY 以及响应中的 RRSIG。任何一环对不上,支持 DNSSEC 验证的递归解析器都可能拒绝返回结果。

网站修改 DNS 后出现 SERVFAIL?DNSSEC、DS 记录与签名链路排查指南

先确认是 SERVFAIL,不要与 NXDOMAIN 混淆

NXDOMAIN 表示解析器得到的结论是“这个名称不存在”。SERVFAIL 表示解析器未能给出可信答案,可能来自 DNSSEC 验证失败、权威服务器超时、网络不可达、区域配置错误或响应过大等问题。看到 SERVFAIL 还不能直接认定 DNSSEC 出错,需要做对照查询。

先从两个公共递归解析器查询同一条记录:

dig example.com A @1.1.1.1
dig example.com A @8.8.8.8

再请求 DNSSEC 相关记录:

dig +dnssec example.com A @1.1.1.1
dig +dnssec example.com A @8.8.8.8

留意输出中的 statusflagsSERVERQuery time。验证成功的响应通常可看到 ad 标志,但是否出现还受查询方式和解析器策略影响,不能把缺少 ad 单独当成故障证据。

接着使用 +cd 关闭本次查询的 DNSSEC 验证:

dig +dnssec +cd example.com A @1.1.1.1
dig +dnssec +cd example.com A @8.8.8.8

如果普通查询返回 SERVFAIL,加上 +cd 后却能得到正确的 A 或 AAAA 记录,故障范围已经明显缩小:递归解析器能够联系权威服务器并取得答案,但无法通过 DNSSEC 验证。若两种查询都失败,还要继续检查权威服务器、委派、网络和区域数据。

dig +trace 可以查看从根区、顶级域到权威 DNS 的委派过程:

dig +trace example.com A

它适合发现 NS 委派、胶水记录或权威服务器不可达等问题,但不能替代完整的 DNSSEC 验证。排查时要把追踪结果与验证型递归解析器的结果放在一起看。

从父区开始检查 DS 记录

DNSSEC 的信任链从父区向子区延伸。以 example.com 为例,.com 父区发布的 DS 记录用于指向 example.com 区域中的某个 DNSKEY。域名更换 DNS 服务商时,名称服务器可能已经切到新平台,注册商处却仍保留旧服务商的 DS。这是迁移后出现大面积 SERVFAIL 的常见原因。

查询父区可见的 DS:

dig +dnssec example.com DS @1.1.1.1
dig +dnssec example.com DS @8.8.8.8

还可以从追踪结果中找到顶级域权威服务器,再直接查询:

dig com NS
dig +dnssec example.com DS @<某台-com-权威服务器>

一条 DS 记录包含四个需要核对的部分:Key Tag、Algorithm、Digest Type 和 Digest。注册商或域名注册局控制台显示的值,应当对应当前权威 DNS 正在使用的密钥。只看“DNSSEC 已开启”这个开关不够。

排查时记录下面几项:

  • 父区是否仍发布 DS。
  • DS 的 Key Tag、Algorithm、Digest Type 和 Digest 是什么。
  • 当前域名由哪组 NS 提供权威解析。
  • DS 是旧平台生成的,还是当前平台生成的。
  • 注册商最近是否修改过 DS,修改时间是否已经超过正常的父区更新与缓存周期。

如果当前并不打算使用 DNSSEC,父区仍有 DS 就会带来风险。权威 DNS 停止签名后,验证型解析器会把“父区承诺存在签名”与“子区没有可验证签名”视为失败。

再核对当前权威 DNS 的 DNSKEY

先查出当前权威服务器:

dig example.com NS

然后绕过递归缓存,直接向每台权威服务器查询 DNSKEY:

dig +norecurse +dnssec example.com DNSKEY @ns1.example-dns.net
dig +norecurse +dnssec example.com DNSKEY @ns2.example-dns.net

正常情况下,多台权威服务器应返回一致、完整的区域数据。若某台服务器没有 DNSKEY、返回旧密钥、缺少 RRSIG,或多台服务器尚未完成同步,递归解析器可能因命中不同权威节点而得到不一致结果。

安装了 BIND 工具后,可以根据 DNSKEY 计算 DS,再与父区中的 DS 对照。以下命令中的权威服务器和域名需要替换为实际值:

dig +norecurse example.com DNSKEY @ns1.example-dns.net > dnskey.txt
dnssec-dsfromkey -f dnskey.txt example.com

重点比较输出中的 Key Tag、算法、摘要类型和摘要内容。只要父区 DS 指向的密钥已经不在当前 DNSKEY 集合里,验证链就会中断。

区域里可能同时存在多把 DNSKEY,用于密钥轮换或区分 KSK、ZSK。不能简单地要求所有 DNSKEY 都与 DS 一致;至少要有一条有效的信任路径,从父区 DS 对应到当前可用的 DNSKEY,并能验证区域签名。

检查 RRSIG 是否存在、过期或尚未生效

DNSKEY 对得上以后,还要检查实际记录的签名。例如:

dig +norecurse +dnssec example.com A @ns1.example-dns.net
dig +norecurse +dnssec example.com SOA @ns1.example-dns.net
dig +norecurse +dnssec example.com DNSKEY @ns1.example-dns.net

响应中的 RRSIG 带有签名生效时间和过期时间。常见故障包括:

  • 签名已经过期,自动续签任务没有运行。
  • 新签名的生效时间还没到。
  • 服务器时间偏差过大,生成或判断签名有效期时出错。
  • 只有部分权威节点更新了签名。
  • 区域发生变更后,DNSKEY、RRSIG 与实际记录没有同步完成。

检查权威 DNS 主机的时间同步状态:

timedatectl status
chronyc tracking

托管型 DNS 通常不需要用户维护签名任务,但仍要确认平台控制台是否报告签名失败、密钥轮换未完成或区域处于待生效状态。自建 BIND、Knot DNS、PowerDNS 等环境,则要继续检查签名器日志、区域序列号、主从同步和定时任务。

更换 DNS 服务商后,旧 DS 最容易留下

典型迁移过程如下:旧 DNS 服务商开启了 DNSSEC,注册商处保存着旧 DS;随后域名 NS 切到新服务商,新服务商生成了另一组 DNSKEY。普通 DNS 记录已经迁移成功,但父区仍要求使用旧密钥验证。支持 DNSSEC 的解析器因此返回 SERVFAIL

处理这类问题时,不要只在新权威 DNS 上关闭 DNSSEC。父区 DS 仍然存在,故障不会消失,甚至会把原来部分可验证的状态变成完全不可验证。

计划迁移时,可按下面的顺序操作:

  1. 在新平台建立完整区域,确认所有记录与旧平台一致。
  2. 根据两家平台支持的迁移方案,决定采用预发布密钥、双签名或暂时撤销 DS。
  3. 在注册商处更新或移除 DS,并等待父区更新。
  4. 确认新的信任链可验证后,再停用旧平台。
  5. 从多个递归解析器和多个网络重新检查域名。

不同 DNS 服务商对密钥预发布和迁移的支持并不一致。控制台没有提供可控轮换流程时,短暂撤销父区 DS 往往比带着旧 DS 强行切换更稳妥,但这段时间域名不再获得 DNSSEC 的验证保护。操作前应保存原 DS、DNSKEY、NS 和 TTL 信息,并准备回滚路径。

紧急恢复时,先处理失效的信任链

已经发生全站解析失败时,优先目标是恢复稳定解析。如果确认父区 DS 与当前权威 DNSKEY 不匹配,可以在域名注册商处删除旧 DS。删除后需要等待注册局父区更新以及递归缓存过期,恢复不会在点击保存后立刻覆盖所有网络。

紧急处理建议保留这些证据:

  • 修改前的 DS 完整值与截图。
  • 当前 NS、DNSKEY 和 RRSIG 查询结果。
  • 至少两个公共递归解析器的返回结果。
  • 注册商操作时间、工单编号和预计生效时间。
  • 用于恢复 DNSSEC 的新 DS 值。

解析恢复稳定后,再在当前 DNS 服务商处确认签名正常,生成或复制正确的新 DS,提交到注册商,并从父区开始重新验证信任链。不要在旧 DS 尚未撤销时反复切换 DNSSEC 开关,这会增加缓存状态和排查记录的混乱。

还有一种情况:签名没错,DNSSEC 响应却到不了

DNSSEC 会让响应携带 DNSKEY、RRSIG 等额外数据,报文可能明显变大。网络路径、旧防火墙或错误的 EDNS 配置如果丢弃分片,或阻止 DNS 使用 TCP 回退,也会表现为超时或 SERVFAIL

可以比较 UDP 与 TCP 查询:

dig +dnssec example.com DNSKEY @ns1.example-dns.net
dig +tcp +dnssec example.com DNSKEY @ns1.example-dns.net

再测试不同 EDNS 缓冲大小:

dig +dnssec +bufsize=1232 example.com DNSKEY @ns1.example-dns.net
dig +tcp +dnssec example.com A @ns1.example-dns.net

如果 TCP 查询稳定成功,UDP 查询经常超时或只在特定网络失败,需要检查权威 DNS 前面的防火墙、安全组、负载均衡、Anycast 节点和运营商路径。DNS 同时依赖 UDP 53 与 TCP 53,不能只放行 UDP。

用一组固定检查完成恢复验证

修改完成后,从父区到业务记录逐层验证:

dig +dnssec example.com DS @1.1.1.1
dig +norecurse +dnssec example.com DNSKEY @ns1.example-dns.net
dig +norecurse +dnssec example.com A @ns1.example-dns.net
dig +dnssec example.com A @1.1.1.1
dig +dnssec example.com A @8.8.8.8
dig +trace example.com A

检查结果应满足这些条件:

  • 父区 DS 与当前有效 DNSKEY 能建立信任路径,或者父区已经按计划撤销 DS。
  • 每台权威服务器返回一致的 DNSKEY、SOA 和业务记录。
  • RRSIG 在有效期内,服务器时间正常。
  • 普通验证查询不再返回 SERVFAIL
  • +cd 查询与普通查询得到的业务记录一致。
  • UDP 与 TCP 查询都能完成,多个公共递归解析器结果一致。

还可以使用 DNSViz 等验证工具查看完整信任链。第三方工具适合快速定位断点,最终仍应以父区 DS、权威 DNS 实际响应和验证型递归解析器的结果为准。

DNSSEC 故障的排查顺序可以固定下来:先用 +cd 对照确认是否与验证有关,再查父区 DS,然后核对权威 DNSKEY 和 RRSIG,最后检查报文大小与网络路径。更换 DNS 服务商时把 DS 更新纳入迁移清单,通常就能避开“记录已经切换,域名却全网 SERVFAIL”的故障。

参考资料

资料核验日期:2026-09-24。

Web服务与建站实操指南

网站开启 Brotli/Gzip 后加载异常?Content-Encoding、Vary 与 CDN 缓存排查指南

2026-9-23 14:51:55

知识库

MySQL查询优化指南:提高数据库查询效率的实用技巧

2024-11-3 0:23:15