你想让 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-side 和 dig 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
要看到:
- 根 NS →
.comTLD。 .comTLD → 你的权威 NS、ADDITIONAL 里带地址。- 你的 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.com或dnsviz.net查子域没有缺 glue 警告。
长期预防
- 能不在被委派区里放 NS 目标就别放。完全避开 glue。
- 任何 zone 委派 runbook 把 glue 记录列成 checklist 项——它经常被忘。
- 用 DNS-as-code(Terraform
dns_*资源、OctoDNS)把 glue 跟委派一起进版本控制。 - 每次 NS IP 改动,父区 glue 立刻更新、并从外部
dig +trace验证。 - 每周 cron 跑
intodns.com或dnsviz.net——先于用户发现 glue 问题。
常见坑
- 在子区里加 NS 的 A 记录就以为够了。父区也得有 glue。
- 子区里更新了 NS IP、注册商那边的父区 glue 忘了改。
- DNS 服务商 UI 里加了 glue,但没推到 TLD 注册局(部分注册商需要单独的”child nameserver”注册)。
- Lame delegation——NS 列了但实际不为该区应答(前一家服务商遗留)。
- 把”vanity nameservers”(装饰用、
ns1.yourbrand.comalias 到服务商)跟需要 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 #排查