【DNSSEC 01】VPS 自建 DNS 并开启 DNSSEC:防劫持、签区与链式验证实操(2026)

担心域名被劫持?本文在 VPS 上用 Bind9 或 PowerDNS 自建权威 DNS,并给区域签上 DNSSEC(KSK/ZSK、RRSIG、DS),再到注册商提交 DS 完成信任链验证,附 delv 自查与密钥轮转实践。

很多站长买了 VPS 第一反应是装面板、建站、套 CDN,却忽略了一件更根本的事:你的域名解析到底由谁说了算。把 NS 全权交给别人,等于把"用户怎么找到你"的钥匙交出去。更危险的是,传统 DNS 是明文、无签名的"君子协定",攻击者可以在链路里伪造应答、把你的域名指向钓鱼 IP——这就是 DNS 劫持与缓存投毒。本文讲的就是在 VPS 上自建权威 DNS(Bind 或 PowerDNS),并给区域签上 DNSSEC:用一条密码学信任链,让全世界解析器都能验证"这个答案是真的、没被改过"。从原理到两条主流方案的实操,再到注册商 DS 记录这一步,一步步带你补齐安全与主权这块空白。如果你不想自己跑权威服务器、只想在 Cloudflare 上点一下开启,直接看系列第 02 篇:DNSSEC 02 · 域名总被劫持?在 VPS + Cloudflare 上开启 DNSSEC 防篡改,那篇会先讲清"为什么会被劫持"以及 Cloudflare 一键开启的具体步骤。

延伸阅读

更多相关攻略推荐:【购买指南 01】新手如何选购第一台 VPS:配置/线路/支付/退款【VPS 网络极客与负载均衡 01】从域名到 IP:DNS 解析全过刚买的 VPS 怎么连上去?SSH 新手教程(Windows / M2026 决策指南:本地模型 vs 云 API 成本对比——你的 V【VPS 硬件选型指南 (存储 篇) 03】主流商家磁盘实情横向盘点

为什么要在 VPS 自建权威 DNS

用商家或 Cloudflare 的 DNS 当然省事,但"省事"的代价是主权让渡:记录怎么存、日志归谁、哪天政策变了你只能跟着改。自建权威 DNS 把 NS 指向你自己的 VPS,域名解析完全在你掌控之下,适合多域名集中管理、需要私有 NS(ns1.yourdomain.com)、或与自建邮件/服务深度绑定的场景。配合 DNSSEC,你还能对外证明解析结果的真实性,这是单纯用别人 DNS 拿不到的"可验证信任"。对隐私敏感、想摆脱大厂依赖的用户,在 VPS 上自己跑一台权威 DNS,是"我的域名我做主"的第一步。

DNSSEC 到底防什么

先把边界说清:DNSSEC 不加密解析内容,也不隐藏你访问了什么网站(那是 DoH/DoT 的事)。它只做一件事——给每条记录加盖数字签名,让递归解析器能确认"这条 A 记录确实来自真正的权威服务器,且传输中没被篡改"。它防的是缓存投毒、中间人伪造应答这类"把你指向假 IP"的攻击。没有它,攻击者若控制了某台解析器或链路,就能把你 example.com 的流量引到钓鱼站,用户毫无察觉。换句话说,DNSSEC 给你的域名上了一把"真伪锁",锁的是答案的真实性,不是内容的机密性。

信任链:从根到你的区域

DNSSEC 的核心是"链信任(chain of trust)"。根区(.)由 ICANN 管,它对 .com 的 DS 记录签名;.com 的 TLD 再对你的域的 DS 记录签名;你自己的区域里放 DNSKEY(公钥)和 RRSIG(签名)。解析器从根一路验下来,任一环对不上就判失败(SERVFAIL)。涉及几个关键角色:

角色作用谁持有
DNSKEY区域公钥,含 KSK 与 ZSK 公钥你的权威服务器
RRSIG对每条资源记录集的签名你的权威服务器
DSKSK 的哈希,挂在父区注册商(父区)
NSEC / NSEC3证明"某名字不存在"的签名你的权威服务器

KSK(Key Signing Key)只用来签 DNSKEY 这个资源记录集,它的指纹(哈希)就是你要交给注册商的 DS 记录;ZSK(Zone Signing Key)负责签区域里其余所有记录。分两把钥匙,是为了让频繁轮换的 ZSK 不影响上层 DS。NSEC/NSEC3 解决"否认存在"的验证——证明某个名字确实不存在,而不是被悄悄吞掉。NSEC 会按顺序列出存在的名字(可被枚举),NSEC3 用哈希掩盖,更护隐私。

方案对比:Bind9 还是 PowerDNS

两大开源权威服务器都能签 DNSSEC,取向不同:

维度Bind9PowerDNS
配置形式zone 文本文件数据库后端(MySQL/PostgreSQL/LMDB)
签名方式dnssec-policy 自动 或 手动 keygen+signzonepdnsutil secure-zone 一条命令
学习曲线文档最全、资料最多命令少、上手快
适合谁想看清每一步、传统运维不想碰 zone 文件、用 API 管记录

Bind 是老牌标准、文档最全,适合想理解每一步的人;PowerDNS 用 pdnsutil 一条命令搞定,对数据库后端友好,适合不想碰 zone 文件的人。下面两种都给,你可以按口味挑。

实战一:Bind9 签区

现代 Bind(9.16+)推荐用 dnssec-policy 全自动:在 named.conf 里给区域加 dnssec-policy default; inline-signing yes;,Bind 会自动生成 KSK/ZSK、签区、轮转。想看每一步就走手动:先建密钥目录,再用 dnssec-keygen 生成 ZSK 和 KSK(推荐 ECDSAP256SHA256,算法号 13,签名小、验得快),最后 dnssec-signzone 产出 .signed 文件,把 named.conf 的 zone file 指向它。

zone "example.com" {
    type primary;
    file "/etc/bind/db.example.com";
    dnssec-policy default;
    inline-signing yes;
};

若走手动流程,命令如下:

mkdir -p /etc/bind/keys
chown bind:bind /etc/bind/keys
dnssec-keygen -a ECDSAP256SHA256 -n ZONE example.com
dnssec-keygen -a ECDSAP256SHA256 -f KSK -n ZONE example.com
dnssec-signzone -o example.com -3 a1b2c3d4 -N INCREMENT -t /etc/bind/db.example.com
rndc reload example.com

解释:dnssec-keygen 用 -a ECDSAP256SHA256 选算法(RSA 用 RSASHA256,算法号 8,密钥更长但兼容性最好);-f KSK 表示生成密钥签名钥;dnssec-signzone 的 -o 是区域名,-3 后接 NSEC3 的 salt,-N INCREMENT 自动把 SOA 序列号加一,-t 打印统计。完成后会多出 dsset-example.com. 文件,里面就是给注册商的 DS。把公钥用 $INCLUDE 加进 zone 文件,或直接用 inline-signing 让 Bind 自己管,最后 rndc reload 生效。注意算法号 13 当前是推荐默认,密钥更短、校验更快。

实战二:PowerDNS 一条命令 secure-zone

如果你选 PowerDNS,整个签名流程被压成一条命令:

pdnsutil secure-zone example.com
pdnsutil rectify-zone example.com
pdnsutil show-zone example.com

secure-zone 默认就用 ECDSAP256SHA256 同时生成 KSK 和 ZSK 并立即激活;rectify-zone 计算 NSEC/NSEC3 和顺序哈希;show-zone 末尾会打印出要交给注册商的 DS 记录(多种摘要格式)。想换默认算法就 pdnsutil secure-zone example.com ecdsap256sha256。导出 DS 用 pdnsutil export-zone-ds example.com。比 Bind 手动流程清爽太多,而且记录改了不用重签 zone 文件——PowerDNS 在后端里实时签。

把 DS 记录交给注册商:完成链式验证

这一步最容易被忘,却最关键:你签了区、自己机器验证没问题,但若注册商(父区)那儿没有对应的 DS 记录,解析器的信任链就断在 TLD 那一环,结果要么不验证、要么直接 SERVFAIL。到你的域名注册商后台(Namecheap、Porkbun、阿里云、CloudCone 等),找到 DNSSEC / DS 记录填写处,按 show-zone 或 dsset 文件里的四个字段录入:

字段含义本文示例
Key Tag密钥标签(密钥指纹编号)12345
Algorithm签名算法13(ECDSA P-256 SHA-256)
Digest Type摘要算法2(SHA-256)
DigestDS 摘要值(长字符串)49FD46E6...(省略)

Algorithm 填 13(ECDSA P-256 SHA-256),Digest Type 填 2(SHA-256)。提交后等最长 48 小时传播。接着用 delv @8.8.8.8 example.com A +multiline 验证,看到 "; fully validated" 就成功了;dig +dnssec example.com A 在走校验的解析器上会带 ad(Authenticated Data)标志。很多人在这一步栽跟头:只签区不交 DS,等于锁了门却没把钥匙交给门卫。

验证你的签名

三件套自查:一是 dig +dnssec example.com DNSKEY 看得到 DNSKEY 和 RRSIG;二是 dig example.com DS 在父区能看到 DS;三是用 delv 或在线工具(dnsviz.net、dnssec-analyzer.verisignlabs.com)做全链追踪。常见现象:只签区没交 DS,在线工具会提示"链在父区断开";DS 填错算法或 digest,则整域解析可能变 SERVFAIL——所以 DS 一旦提交,改密钥要按"双签名"流程先加新 KSK 的 DS、等传播、再撤旧的。验证时耐心等传播,别刚提交就判定失败。

密钥轮转与签名过期

手动签的区有"保质期":RRSIG 默认有效期约 30 天,到期不重签,记录就变"未验证"。要么上 Bind 的 dnssec-policy 自动维护,要么写个 cron 每月重跑 dnssec-signzone。ZSK 建议 30-90 天一轮(DNSSEC 的安全来自频繁轮换),KSK 可一年一换。轮转别硬删:先并排放新旧两把(双签名),等旧签名 TTL 过期,再撤旧钥,否则会出现"新签名旧 DS"对不上的窗口。PowerDNS 的 secure-zone 之后想加新 ZSK,用 pdnsutil add-zone-key example.com zsk active ecdsap256sha256,再 deactivate 旧钥,过 TTL 后 remove,流程更平滑。

常见坑

坑一:签了区却忘了交 DS——等于锁了门却没把钥匙交给门卫,信任链断了。坑二:NSEC 会暴露区域里所有存在的名字(区域枚举),在意隐私就上 NSEC3(PowerDNS 用 pdnsutil set-nsec3,Bind 在 signzone 加 -3 salt)。坑三:单台 VPS 当权威 DNS,机器一宕整个域失联,生产至少主从两台不同机房。坑四:IPv4 在 2026 年租用价已涨到约 0.30-0.55 美元/IP/月,自建 DNS 要多占 IP 和 53 端口,算清成本。坑五:签名过期忘了重签,某天突然整域 SERVFAIL,所以自动化轮转不是可选项而是必选项。

选型建议:CloudCone / RackNerd / Vultr

三家都能跑 Bind/PowerDNS,差别在运维便利性:

厂商备注自建 DNS 建议
CloudCone后台自带简单 DNS、又卖域名DS 填写顺手,解析与注册可放一起
RackNerd年付便宜、洛杉矶节点稳适合做主 DNS,NS 指向自有 VPS
Vultr按小时计费、能保留浮动 IP切换机器解析不用大改,适合做从 DNS

CloudCone 后台自带简单 DNS、又卖域名,DS 记录填写顺手,适合想把解析和注册放一起的人;RackNerd 年付便宜、洛杉矶节点稳,适合做主 DNS;Vultr 按小时计费、能保留浮动 IP,切换机器时解析不用大改,适合做从 DNS 或做实验。无论选谁,权威 DNS 至少两台跨机房,DS 提交后静候传播,再用 delv 收尾验证。延伸阅读:更多 VPS 网络与带宽主题,见 VPS 主题导读中心

#VPS自建DNS #DNSSEC #Bind9 #PowerDNS #域名安全