子域 NS 委派挂了:缺 Glue 记录 —— 排查与修复

你把子域委派给它自己的 NS,但解析间歇性失败。NS 目标主机名在被委派子区内的话,父区需要 glue A/AAAA 记录。

你想让 internal.yourdomain.com 由内部 DNS 基础设施服务(BIND、NS1、内部 Route 53 hosted zone、Kubernetes ExternalDNS)。在父区加一条 internal.yourdomain.com. NS ns1.internal.yourdomain.com.,看着挺合理。然后什么都不解析。或者更糟,公司内网解得出、外网解不出。原因是缺 glue 记录:当你委派的目标 NS 本身在被委派的子区里时,父区还必须发布这些 NS 的 A/AAAA 记录——否则解析器死循环(要查 ns1 才能拿到 ns1 的地址,但拿不到 ns1 的地址就没法查 ns1)。

常见原因

从最常见到边角情况。

1. NS 目标在子区里,但父区没 glue

你配了 internal.yourdomain.com. NS ns1.internal.yourdomain.com. 但父区没给 ns1.internal.yourdomain.com. 加 A 记录。父区有 NS 指针、却没法告诉解析器 ns1 在哪。

怎么判断dig +trace internal.yourdomain.com 走到 NS 那步就停了,“no answer” 或者卡在 NS 地址解析。

2. Glue 在子区里有、父区里没有

你在子区里加了 ns1 的 A 记录(internal.yourdomain.com 区文件里 ns1 A 10.0.0.1),但父区(yourdomain.com)没有同一条 A 记录。已缓存子区的内部解析器可能能用;外部解析器做新查询就挂。

怎么判断dig @8.8.8.8 internal.yourdomain.com 挂。dig @ns1.internal.yourdomain.com internal.yourdomain.com 通。数据存在,父区没告诉外部世界去哪找。

3. 注册商 glue 入口很不显眼

TLD 级 glue(用域名自身内部的 NS 委派整个域,比如 yourdomain.com. NS ns1.yourdomain.com.)需要在注册商通过他们的 EPP 通道注册到 TLD 注册局——大多数注册商有一个独立的”register host” / “child nameservers”面板,跟 DNS 记录 UI 分开。

怎么判断:你在 DNS 面板里加了 A 记录,但从 TLD 看 dig @a.gtld-servers.net yourdomain.com NS +additional 没有 additional A 记录——注册局里压根没有。

4. 旧 glue 指向已下线的 IP

你换了 NS 到新 IP。子区里的内部 NS 记录改了,父区的 glue 还指着旧 IP。解析器去打旧地址超时。

怎么判断dig +trace 显示解析器拿到了父区的 additional A,但连那个 IP 超时。

5. 注册商和 DNS 服务商两边 glue 不一致(劈裂配置)

很多场景下 NS 记录在 DNS 服务商 UI 里、父区 glue 在注册商那里,两边漂移。某些解析器认一个、某些认另一个。

怎么判断dig yourdomain.com NS @registrar-sidedig yourdomain.com NS @dns-provider-side 返回不一样的 IP。

6. IPv4 glue 有、IPv6 glue 没有

你在父区设了 ns1 A 192.0.2.1 但没 ns1 AAAA 2001:db8::1。只走 v6 的解析器到不了。

怎么判断:v4 路径解析正常,v6-first 解析器间歇失败。某些移动运营商遇到问题。

开始前

  • 弄清楚父区、被委派子区、各自的 NS 归属。
  • 知道父域在哪家注册商、那家是只管注册还是同时管 DNS。
  • 准备好每台委派 NS 的 IP 地址(v4 和 v6 如果有)。
  • 把父区现在的 NS 记录、父区的 glue(或注册商 host 列表)当前状态存下来。

需要收集的信息

  • 外部网络做的 dig +trace internal.yourdomain.com 输出。
  • dig @8.8.8.8 NS internal.yourdomain.com +additional 输出。
  • dig @a.gtld-servers.net yourdomain.com NS +additional 输出(TLD 看你的区是什么样的)。
  • 注册商”host 注册” / “child nameservers”页面截图。
  • DNS 服务商里父区和子区两边的 NS 记录列表。

一步步修

走 A 路径(NS 在子区外)或 B 路径(NS 在子区内——需要 glue)。

第 1 步:先想清楚到底要不要 glue

仅当 NS 目标的名字在被委派的区时才需要 glue。例子:

  • 需要 glue:internal.yourdomain.com NS ns1.internal.yourdomain.com.(ns1 在 internal.yourdomain.com 里)。
  • 不需要 glue:internal.yourdomain.com NS ns1.dnshost.com.(ns1 在 dnshost.com 这个独立区里)。

如果能用别的区的 NS 目标避开 glue(比如直接用 DNS 服务商的 NS),就这么做,这整类问题就没了。

第 2 步:要 glue 的话,父区里加 A 和 AAAA 记录

在父区(yourdomain.com)里:

ns1.internal.yourdomain.com.  3600  IN  A     192.0.2.1
ns1.internal.yourdomain.com.  3600  IN  AAAA  2001:db8::1
ns2.internal.yourdomain.com.  3600  IN  A     192.0.2.2
ns2.internal.yourdomain.com.  3600  IN  AAAA  2001:db8::2

注意这些是父区里的记录、名字看起来像属于子区。这就是 glue——父区把 out-of-bailiwick 的查找短路掉。

第 3 步:apex 级委派(yourdomain.com NS ns1.yourdomain.com)需要通过注册商在 TLD 注册 glue

大多数注册商把它叫”child nameservers”、“register host”、“host 注册”:

  • Namecheap:Domain → Advanced DNS → “Personal DNS Server” / register host。
  • GoDaddy:Domain settings → DNS → Host names。
  • Cloudflare Registrar:账户级 → Custom nameservers(有限制)。
  • Google Domains / Squarespace Domains:Domain → DNS → “Glue records”。

加每个 NS 主机名 + 它的 IP。注册商通过 EPP 推到 TLD 注册局。验证:

dig @a.gtld-servers.net yourdomain.com NS +additional

ADDITIONAL section 应该有你 NS 主机名对应的 A/AAAA 记录。

第 4 步:子区里也要权威保存这些 glue 地址

为了一致性,子区(internal.yourdomain.com)里也要有相同的 A 记录:

$ORIGIN internal.yourdomain.com.
@      IN  NS    ns1
@      IN  NS    ns2
ns1    IN  A     192.0.2.1
ns1    IN  AAAA  2001:db8::1
ns2    IN  A     192.0.2.2
ns2    IN  AAAA  2001:db8::2

最终解析器直接查到子区时拿到同样的答案。Glue 是引导、in-bailiwick 记录是权威源。

第 5 步:从外部端到端验证

dig +trace internal.yourdomain.com

要看到:

  1. 根 NS → .com TLD。
  2. .com TLD → 你的权威 NS、ADDITIONAL 里带地址。
  3. 你的 NS → 最终答案。

每一跳都有清晰的 A 记录,无卡顿、无超时。

也从另一个网络测(手机流量 / 另一个区的 VPS)——本地 DNS 缓存可能掩盖问题。

第 6 步:改动期间降 TTL,稳定后提上去

改动期间 NS 和 glue 都设 TTL = 300。稳定 24 小时后:

ns1.internal.yourdomain.com.  86400  IN  A  192.0.2.1

提到 86400(1 天)增加稳定性。长 TTL 减轻 NS 查询压力、提高解析器缓存命中率。

验证

  • dig +trace internal.yourdomain.com 干净走完,每一步 ADDITIONAL 里都有地址。
  • dig @8.8.8.8 NS internal.yourdomain.com 返回 NS 记录。
  • dig @8.8.8.8 ns1.internal.yourdomain.com 返回 A 记录(通过父区 glue 解出来)。
  • 至少 3 个外部网络(手机流量、公共 DNS 检查工具、另一个区的 VPS)解析结果一致。
  • intodns.comdnsviz.net 查子域没有缺 glue 警告。

长期预防

  • 能不在被委派区里放 NS 目标就别放。完全避开 glue。
  • 任何 zone 委派 runbook 把 glue 记录列成 checklist 项——它经常被忘。
  • 用 DNS-as-code(Terraform dns_* 资源、OctoDNS)把 glue 跟委派一起进版本控制。
  • 每次 NS IP 改动,父区 glue 立刻更新、并从外部 dig +trace 验证。
  • 每周 cron 跑 intodns.comdnsviz.net——先于用户发现 glue 问题。

常见坑

  • 子区里加 NS 的 A 记录就以为够了。父区也得有 glue。
  • 子区里更新了 NS IP、注册商那边的父区 glue 忘了改。
  • DNS 服务商 UI 里加了 glue,但没推到 TLD 注册局(部分注册商需要单独的”child nameserver”注册)。
  • Lame delegation——NS 列了但实际不为该区应答(前一家服务商遗留)。
  • 把”vanity nameservers”(装饰用、ns1.yourbrand.com alias 到服务商)跟需要 glue 的真委派搞混。

FAQ

Q:为什么内网解析得出、外网解析不出?

内网解析器可能直接缓存了子区记录,或者配了 stub zone。外网解析器走完整委派链,在缺 glue 那挂。仅内网能用是 glue 问题的强信号。

Q:注册商没有 glue / child nameserver 页面怎么办?

要么注册商不支持 glue(真 TLD 上罕见),要么藏起来了。找客服问”EPP host registration”或”child nameserver”——任何获得 TLD 认证的注册商都必须支持。它要是拒绝,换一家。

Q:TLD 注册局缓存 glue 多久?

按 TLD NS 返回 additional 记录的 TTL,.com/.net 一般 1-2 天。注册商通过 EPP 推上去后,这个时间窗内传播完。

Q:能不能只用一个 NS?

技术上行,实际不行。大多数 TLD 要求委派至少 2 条 NS 记录。2 是下限,4 比较稳。

延伸阅读:Name server 跟 DNS records 分不清DNS 改了站点还是打不开子域名不解析

标签: #排查 #DNS #delegation #排查