当租到一个一级域名(例如 example.com)之后,就可以在托管商提供的界面,配置二级域名来设置对应的解析记录。
但这种配置方式,在域名多了之后就很不方便了,特别是当需要开始为域名配置三级域名的时候,问题就开始多样化起来:
- 例如 area-name-01.oss.example.com 这种一般是 Object Storage Server 的域名解析,数量多了起来一般是用自动化,再使用面板很明显不合适。
- 再例如 project.page.example.com 这种类似 GitHub Page 的用法,虽然可以通过 *.page.example.com 的方式搞定,但有些 NS 服务方为了防滥用,禁用了通配解析,这下就很尴尬了。
- 还有一些基建设施,hostname.infra.example.com 这种,即便接受频繁上去界面修改 zone file,面对着大量的记录的时候,就很不实际。
所以就想到,有没有一种方法,让某个二级域名的解析,从托管方转移到我自己搭建的域名解析服务上。根据 DNS 的递归查询机制的特性来说,这当然是可行的,可应该要怎么实现呢?
上网搜了一下好像并没有多少资料,不知道是不是我的搜索姿势不是很对。但还是想办法通过 LLM 搜索找到一点资料:https://serverfault.com/questions/530415/what-is-dns-delegation
Phind 给我生成了个很简短的答案,大概意思就是,设置一个 Glue record,另起一个询问之后,才明白这其实是标准的 DNS Delegation。
一级域名是顶级域名的 subzone,二级域名是一级域名的 subzone。按照 subzone(子域)的概念来理解就方便了。
很绕口,但说这么多其实操作就是这样,以 subzone.example.com 为例:
- 新建一个 A record 或者 AAAA record,指向 DNS 服务器软件的地址,这种域名一般开头加 ns1, ns2 这样的名字(ns1.subzone.example.com)
- 新建一个 NS record
subzone.example.com
,NS 需要是个 server name,填解析服务器的 A 记录名称(ns1.subzone.example.com) - 在 ns1.subzone.example.com 对应的服务器上,配置好 zone file 解析(不同的软件有不同的做法,但 zone file 格式是通用的)
1 | $ORIGIN subzone.example.com. |
然后,测试一下解析 www.subzone.example.com ,成功的话就会发现权威解析来自于自己的服务器,查询返回的地址是 192.168.0.2 了。
这里需要注意:
- 本质上是域名解析服务们做了这个递归查询过程,从 . 开始到 com. 到 example.com. 到 subzone.example.com. ,所以用途不管是否是解析内网地址,DNS 服务器都需要正常被外网访问。因为 DNS 查询不分服务器和客户端,“执行递归查询的实际机器”是个未定义角色,任何方都可能是解析者。
- 以上仅适用于本文讨论的,在国际互联网上注册过的二级域名下的三级域名的 DNS 代理性解析,如果是从根开始就独立解析,那么服务器就当然是可以全内网了。
- Zone File 里,域名(也就是所谓的 host name,主机名)都需要写上根的名字
.
,平常各种面板和界面为了方便都将它简化掉了,但标准上 subzone.example.com. 才是正确的主机名。
这种操作可以一路扩展下去,不断增加子域,直到超出标准允许的长度为止。但我认为,一般来说,给二级域名配三级域名解析代理,就已经是管理实践上的极限,也是实用性上的极限。