通配 DNS 不命中三级子域:3 个原因 + 修复路径

*.example.com 配了 A 记录,但 a.b.example.com 仍 404——通配只配一层。

你配了通配 DNS:*.example.com10.0.0.1foo.example.com 正常解析。但 a.b.example.com(深子域)返回 NXDOMAIN。为什么?DNS 通配(RFC 4592)只匹配一个 label。*.example.com 匹配 foo.example.com匹配 foo.bar.example.com——后者需要单独的 *.bar.example.com 记录。这经常坑住搭建多租户 app(客户子域有嵌套结构)的团队。

常见原因

按命中率从高到低。

1. 通配只覆盖一层

*.example.com 匹配:

  • foo.example.com
  • bar.example.com

匹配:

  • foo.bar.example.com
  • a.b.c.example.com

怎么判断:单层子域通;多层子域不通。

dig foo.example.com +short            # 解析
dig foo.bar.example.com +short        # NXDOMAIN 或错的值

2. 每一层都需单独通配

要覆盖嵌套通配,必须显式加:

*.example.com       A    10.0.0.1
*.bar.example.com   A    10.0.0.1

子域层级多就每一层都要自己的通配。

怎么判断:多租户 app 客户能创建任意嵌套子域。每一层都要显式通配。

3. DNS 提供商对深层通配处理不一致

某些 DNS 提供商(老配置、自托管)对通配解释不一致。Cloudflare 一般宽松,其它更严。

怎么判断:一家提供商 *.example.com 确实匹配更深层,另一家不匹配——提供商解释非 RFC 合规(工作)或严格(不工作)。

4. SSL 证书不覆盖更深子域

哪怕 DNS 解析,通配 SSL 证书可能只覆盖一层。Let’s Encrypt 通配通常只是 *.example.com,不是 *.bar.example.com

怎么判断:DNS 解析但浏览器证书错。证书 SAN 不包含更深子域。

5. CDN 不代理嵌套通配

Cloudflare 和类似 CDN 要求每一层显式通配。代理了 *.example.com 但没代理 *.bar.example.com,更深子域直接打源站(或失败)。

怎么判断:Cloudflare DNS 面板——验证每一层通配都加了。

6. 缺 IPv6 AAAA 记录

*.example.com A 但没 AAAA。偏好 IPv6 的用户在嵌套子域上失败。

怎么判断:部分用户能用,部分不能。dig AAAA foo.bar.example.com——A 解析但 AAAA 为空就需要 IPv6 fallback。

最短修复路径

第 1 步:搞清楚到底需要什么

画一下子域结构:

foo.example.com          → 1 层
bar.foo.example.com      → 2 层
baz.bar.foo.example.com  → 3 层

每一层想覆盖都需要显式通配或显式记录。

第 2 步:每层加一个通配

*.example.com               A    10.0.0.1
*.foo.example.com           A    10.0.0.1
*.bar.foo.example.com       A    10.0.0.1

繁琐但管用。

第 3 步:或给已知子域加显式记录

子域有限(不是用户生成)就直接枚举:

foo.example.com               A    10.0.0.1
bar.foo.example.com           A    10.0.0.1
baz.foo.example.com           A    10.0.0.1

记录多但更清晰。

第 4 步:多租户 app 重设计子域

customer.team.app.example.com 这种就拉平成 customer-team.example.com。一层子域 + 一个通配就够。

第 5 步:拿到匹配的 SSL 证书

通配 SSL 覆盖多层需要:

  • 多个通配证书(*.example.com*.foo.example.com
  • multi-SAN 证书显式列每一层
  • 用 DNS-01 challenge + Let’s Encrypt 给每层签通配

第 6 步:用多个 DNS resolver 测

for resolver in 8.8.8.8 1.1.1.1; do
  for sub in foo bar.foo baz.bar.foo; do
    echo -n "$sub.example.com @$resolver: "
    dig @$resolver +short $sub.example.com
  done
done

应该全都解析。

预防建议

  • 设计子域层级时考虑 DNS 限制;尽量 ≤2 层。
  • 多租户 app 用一层子域:customer-team.example.com,不要 team.customer.example.com
  • 每个通配层都要配对应的 SSL 策略。
  • 加新子域层时一次性审 DNS、SSL 证书、CDN 配置。
  • DNS 笔记里记下通配结构,免得后来的工程师踩坑。

相关阅读

标签: #排查