很多人以为有了域名和 WordPress,DNS 就和自己无关了——其实自托管的"域名解析"才是整个体系里最基础也常被忽视的环节:你想给 `service.example.com` 指内网 IP、想给邮件配 MX/SPF/DKIM、想让自己人访问一个不对外公开的子域,都绕不开"这名字到底解析到哪"。DNS 分为"权威"(我负责声明某域的记录)与"递归"(替用户一路查到底)。这篇讲清 DNS 解决什么、自建权威 DNS 与递归 DNS 怎么落地(Bind9/PowerDNS 为代表)、常见记录与坑,以及它的边界。
一、DNS 解决什么:把"人类可读的名字"翻译成"机器可用的地址/服务信息"
公网访问靠 IP,但 IP 难记、会变,所以有了"域名 + 解析"这层:你发请求时操作系统问递归解析器,解析器一路查到对应的权威服务器,后者返回最终地址。DNS 记录不只是"A/AAAA 指 IP",还包括 MX(邮件服务器)、TXT/SPF/DKIM(校验邮件来源)、CNAME(别名)、SRV(服务端口)、TXT(任意配置)等,因此它既是指路牌,也是"服务声明层"。自托管里有两种诉求:一是权威:"想管自己的域名或内部域,自己声明记录、不依赖第三方控制台";二是递归/转发:"给自己的机器配一个本地的解析端点,做缓存与内网解析(如把内网机器名解析成内网 IP)"。二者可拆可合,理解分工才能搭得明白。
二、权威 DNS:用 Bind9 声明一段自己说了算的域名
权威服务器的职责是"对一段域名(zone)给出权威答案"。最常见开源实现是 Bind9:声明一个 zone,定义 SOA(区域起始权威)、NS(本域由哪些权威负责)、A/AAAA(地址)、CNAME、MX、TXT 等记录,然后让公网或内网的解析器来查。自托管里两种典型用法:一是"内部域/内网解析",让内网管理域名直接指向内网 IP(如 `nas.lan`);二是"子域托管",把 `example.com` 的一部分(如一个独立子域)指向自己的机器。声明 zone 并用 `named-checkzone` 校验语法,是避免配置无效的硬门槛。
# 一个极简权威 zone 定义(/etc/bind/zones/db.lan,域 lan)
$TTL 86400
@ IN SOA ns.lan. admin.lan. (
2026091001 ; Serial,每次改动+1,否则从服务器不更新
7200 3600 1209600 3600 )
IN NS ns.lan.
ns IN A 10.0.0.2
router IN A 10.0.0.1
nas IN A 10.0.0.5
git IN CNAME ns.lan.
# 校验 zone 后重载(改记录必做:Serial 先+1)
named-checkzone lan /etc/bind/zones/db.lan
systemctl reload bind9
权威 DNS 的坑:一是"Serial 忘了 +1"——改了内容但 Serial 不变,从服务器/缓存不会刷新,排查半天发现是它;二是"SOA 里 NS/管理员地址写成句点结尾之外的形式"导致 zone 无效;三是"权限配了但没开 TCP/UDP 53"或没允许对应来源——解析器总是拿不到答案。记牢"改动三件套:内容改对 + Serial +1 + 重载/校验"。
三、递归 DNS:给内网一台"自己人专用的解析器"
递归解析器替客户端一路把名字查到底并缓存结果。自托管常在这里做两件事:一是本地缓存(减少反复外查、稍微加速);二是"内网解析 + 安全/隐私"(把公网查询进行加密转发,或不把内网查询发给公网)。配合上文权威 zone,递归器就能让内网用户直接解析内网域;要对公网域名做上游转发,则配置转发器(如走 DoT/DoH 加密)。给每台机器设 `nameserver` 指向这台递归器,内网解析就统一了。
# Bind9:既本地解析 lan,又把其它域名转发到上游(DoT 加密)
options {
recursion yes;
allow-query { localnets; };
forward only;
forwarders { 9.9.9.9; 1.1.1.1; }; # 例:带 DoT 的上游
};
zone "lan" { type master; file "/etc/bind/zones/db.lan"; }; # 同时管内网域
# 客户端侧
# /etc/resolv.conf 里 nameserver 10.0.0.2 (指向这台递归器)
递归 DNS 的坑:一是"开递归却暴露在公网"——成为开放解析器被人滥用做 DDoS 放大,务必 `allow-query` 限制来源;二是"解析器单点"——内网一台挂了全网解析断,可设多台或配合可靠上游;三是"缓存 TTL 造成旧结果"——改了记录别忘等旧 TTL 过期或用 `rndc flush`。
四、边界与应用场景:它是指路牌,不是内容本身
DNS 是"名字到信息的翻译层",它改变的是"解析到哪",不改变业务内容本身。别把它与反向代理/证书混为一谈:反代决定"接到请求交给谁"、TLS 证书校验"这个域名/加密是否可信",而 DNS 只负责"把名字解析成地址"——但它常常是这几者配合链条的第一环。适合自托管用:内部域解析、子域拆分托管、把公共服务统一走一个内网解析入口配合 CNAME 收敛。不合适的:拿 DNS 做高并发缓存层、倚仗 DNS 做权威内容分发(TTL 限制)。把"权威声明"与"递归访问"两条路分开想清楚,DNS 就从"玄学"变成"可复现的配置"。



