DNS 泛解析是什么?*.example.com 为什么可能带来安全和运维问题?
简化版
DNS 泛解析是用通配符记录匹配未显式配置的子域名,例如 *.example.com A 1.2.3.4。
当用户查询 abc.example.com,如果没有更具体的记录,就可能命中泛解析,返回同一个 IP。它适合多租户、临时子域、统一入口等场景。
风险是拼错域名也可能解析成功,隐藏配置错误;还可能扩大子域接管、钓鱼、Cookie 域作用域和日志噪声等问题。
详细版
示例:
*.example.com. 300 IN A 203.0.113.10
查询:
foo.example.com -> 203.0.113.10
bar.example.com -> 203.0.113.10
如果已经存在更具体记录:
api.example.com. 300 IN A 203.0.113.20
那么 api.example.com 通常优先匹配显式记录,而不是泛解析。
泛解析不是正则表达式,也不是无限层级万能匹配,它有 DNS 自己的匹配规则。
完整版教学
1. 先定义泛解析
泛解析就是在 DNS 中配置通配符名称。
常见形式:
*.example.com. IN A 203.0.113.10
它表示某些未显式存在的子域名可以匹配这个记录。
泛解析解决的是“大量未知子域名统一指向”的问题。
2. 显式记录优先
如果同时存在:
*.example.com. IN A 203.0.113.10
api.example.com. IN A 203.0.113.20
查询 api.example.com 时,通常返回显式记录。
查询 test.example.com 时,如果没有显式记录,才命中通配符。
这意味着泛解析更像兜底规则,不是覆盖所有规则。
3. 常见应用场景
泛解析常用于:
- SaaS 多租户子域名。
- 用户个人站点。
- 临时预览环境。
- 统一网关入口。
- 内网开发环境。
例如每个租户一个子域:
tenant-a.example.com
tenant-b.example.com
tenant-c.example.com
泛解析可以把所有租户请求先打到同一入口,再由应用按 Host 路由。
4. 风险对比表
| 风险 | 表现 | 影响 |
|---|---|---|
| 拼写错误被掩盖 | 错域名也解析成功 | 排查困难 |
| 钓鱼子域 | 任意子域都可访问入口 | 品牌风险 |
| Cookie 作用域过大 | .example.com Cookie 被更多子域携带 | 安全边界变宽 |
| 日志噪声 | 大量随机子域请求 | 监控告警污染 |
| 子域接管混淆 | 不清楚哪个子域真实存在 | 安全扫描复杂 |
所以泛解析要配合应用层 Host 校验。
5. 泛解析不是应用路由
DNS 只负责把名称解析到地址。
真正决定 a.example.com 对应哪个租户,通常在应用、网关或反向代理里完成。
例如 Nginx 或应用会读取:
Host: tenant-a.example.com
然后路由到对应租户。
如果应用没有白名单校验,任意随机子域都可能进入业务逻辑。
6. 运维建议
使用泛解析时建议:
- 明确哪些子域允许访问。
- 应用层做 Host 白名单或租户校验。
- 关键子域使用显式记录。
- 监控异常随机子域流量。
- 谨慎设置顶级 Cookie Domain。
- 对废弃租户或预览环境及时清理。
如果只是少量固定子域,不一定需要泛解析。
显式记录更清晰。
7. 常见误区与追问
- 误区:*.example.com 会匹配 example.com。 根域通常需要单独配置记录。
- 误区:泛解析能替代应用层租户校验。 DNS 只解析地址,租户合法性要应用判断。
- 误区:泛解析没有安全影响。 它会扩大可访问主机名集合,影响 Cookie、日志和钓鱼风险。
- 追问:显式记录和泛解析谁优先? 通常更具体的显式记录优先。
- 追问:泛解析适合 SaaS 吗? 适合,但必须配合 Host 路由和租户校验。
- 追问:为什么拼错域名也能访问? 因为未显式配置的子域可能命中通配符记录。
8. 加强记忆
泛解析记成“DNS 兜底入口”。
它让未知子域有路可走,但应用必须判断这条路该不该让它进门。