这样设置了就意味着BIND 将自动为该 zone 生成和维护 DNSSEC 签名记录(如 RRSIG/NSEC),并依据配置的 default-policy 策略自动管理密钥生命周期,包括 KSK/ZSK 的生成、激活、轮换和失效。
# 检查语法错误
named-checkconf
# 重新载入配置
rndc reconfig
# 检查密钥生成情况
ls etc/bind/keys -l
看到BIND成功生成了2对密钥。
继续确认下有没有自动生成签名版的 zone
ls /etc/bind/zones -l
f78fkdns.top.zone.signed
看到签名版的 zone 已经成功生成了。
签名验证
dig @127.0.0.1 f78fkdns.top SOA +dnssec
-----------------------------------------------------------------------------------------------
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25100
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
; COOKIE: 23d176608b92e04d010000006848621828b663b0febe93a0 (good)
;; QUESTION SECTION:
;f78fkdns.top. IN SOA
;; ANSWER SECTION:
f78fkdns.top. 3600 IN SOA ns1.f78fkdns.top. admin.f78fk.com. 2025061006 3600 600 604800 3600
f78fkdns.top. 3600 IN RRSIG SOA 13 2 3600 20250624163155 20250610153155 64284 f78fkdns.top. 0hSIHd9Sa57evZn8AWUr4t4iRf5ikvKAbEg1+kt7lWGnE7V+JmiiIsiB 4vRm3AyMbMEXdMnu0YSKrgfZpYkzEg==
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Wed Jun 11 01:49:28 JST 2025
;; MSG SIZE rcvd: 232
-----------------------------------------------------------------------------------------------
看到 RRSIG 记录和数字签名,说明 DNSSEC 已成功启用并开始对区域数据进行签名保护。
# 再看下当前zone的状态
rndc zonestatus f78fkdns.top
-----------------------------------------------------------------------------------------------
name: f78fkdns.top
type: primary
files: /etc/bind/zones/f78fkdns.top.zone
serial: 2025061166
signed serial: 2025061166
nodes: 4
last loaded: Tue, 10 Jun 2025 16:46:15 GMT
secure: yes
inline signing: yes
key maintenance: automatic
next key event: Tue, 10 Jun 2025 18:36:48 GMT
next resign node: f78fkdns.top/NS
next resign time: Thu, 19 Jun 2025 09:32:19 GMT
dynamic: no
reconfigurable via modzone: no
-----------------------------------------------------------------------------------------------
# 详解
secure: yes:DNSSEC 已经启用。
inline signing: yes:BIND 正在自动签名此 zone 。
key maintenance: automatic:使能了 dnssec-policy,BIND 会自动生成、滚动密钥。
生成 DS 记录
先找到KSK(Key Signing Key)和 ZSK(Zone Signing Key)
cat Kf78fkdns.top.+013+42980.key
f78fkdns.top. 3600 IN DNSKEY 257 3 13
DNSKEY后面的 257 表示这个是 KSK
cat Kf78fkdns.top.+013+64284.key
f78fkdns.top. 3600 IN DNSKEY 256 3 13
DNSKEY后面的 256 表示是ZSK
我们是使用 KSK 来计算生成 DS 记录:
/opt/bind-9.20.9/bin/dnssec/dnssec-dsfromkey ./Kf78fkdns.top.+013+42980.key
# 成功生成
f78fkdns.top. IN DS 42980 13 2 16DBE0D3003C2AFE68CF48E9BD301EE6001615D498BA8536008E538101D66A36
# 解释
42980 13 2 以及 一长串16进制
42980 代表 keyid
13 代表加密算法 (Algorithm) 是 ECDSAP256SHA256
2 代表 摘要类型(Digest Type) 是 SHA256
一长串16进制代表 摘要(Digest) ,其实就是DNSKEY公钥 做了SHA-256 得到的哈希。
DS 记录上传到域名注册商
我的域名注册在阿里云,登录控制台,添加DNSSEC设置,点击添加DS记录。
密钥标签(Key Tag) 填 (keyid) 42980
加密算法(Algorithm) 选 (13) ECDSA Curve P- 256 with SHA - 256
摘要类型(Digest Type) 选 (2) SHA-256
摘要(Digest) 填 (Digest) 16DBE0D300 ...
全面验证
dig @ns1.f78fkdns.top f78fkdns.top DNSKEY
-----------------------------------------------------------------------------------------------
f78fkdns.top. 3600 IN DNSKEY 256 3 13 gHFpWZIpgjxyBZCv1h0iI000UriMOVhFLLiqn7V/ciqXfcPPMpx6nAX6 ZSG1ZUO7N85VqQyw7lH7q04F8A5Lfw==
f78fkdns.top. 3600 IN DNSKEY 257 3 13 zERhvxYmjqGElHUv40EDJ6dChvMqwm40A9BrM1df8Icx9trohkxiAwtX f4l+HUYksBHMuHUlvaUKQIZ6mz9S5Q==
-----------------------------------------------------------------------------------------------
能看到DNSKEY,无问题。
dig @ns2.f78fkdns.top f78fkdns.top DNSKEY
-----------------------------------------------------------------------------------------------
;; AUTHORITY SECTION:
f78fkdns.top. 3600 IN SOA ns1.f78fkdns.top. admin.f78fk.com. 2025061100 3600 600 604800 3600
-----------------------------------------------------------------------------------------------
没有DNSKEY,ns3同样缺少DNSKEY,看来是备用DNS服务器还没有同步到,先不等了,手动拉吧。
ssh 登录ns2和ns3,执行
rndc retransfer f78fkdns.top
主动同步一次,再次查询。
-----------------------------------------------------------------------------------------------
;; ANSWER SECTION:
f78fkdns.top. 3600 IN DNSKEY 256 3 13 gHFpWZIpgjxyBZCv1h0iI000UriMOVhFLLiqn7V/ciqXfcPPMpx6nAX6 ZSG1ZUO7N85VqQyw7lH7q04F8A5Lfw==
f78fkdns.top. 3600 IN DNSKEY 257 3 13 zERhvxYmjqGElHUv40EDJ6dChvMqwm40A9BrM1df8Icx9trohkxiAwtX f4l+HUYksBHMuHUlvaUKQIZ6mz9S5Q==
-----------------------------------------------------------------------------------------------
成功返回了 DNSKEY 记录,ZSK 与 KSK 的公钥都有,说明权威服务器配置正常,公钥部分也已经向全世界公开了。
继续验证:
可以看到,从根域(.)到顶级域(.top),再到我的域名(f78fkdns.top),整条 DNSSEC 信任链已成功验证。DS、DNSKEY 以及各类 RRSIG 记录均匹配正确,三台权威服务器(ns1、ns2、ns3)返回一致的签名结果,NSEC 记录也已正确签名,未匹配记录的应答同样具备加密签名,从而确保“记录不存在”这一信息的真实性,说明 DNSSEC 配置已完整生效。
可能有人不明白,配置这个有什么用呢,举个通俗的例子,google.com 开启了 DNSSEC ,如果客户端访问了 google.com ,结果被攻击者挟持或污染了,返回了错误的 IP 如: 1.2.3.4 ,由于客户端能够通过 DNSSEC 验证发现签名不匹配,就明确知道了这个结果是伪造的,即使被攻击者返回了 NXDOMAIN (域名不存在),客户端仍然能知道这个结果是被伪造过的。如果未启用 DNSSEC ,客户端就无法得知结果是权威DNS服务器提供的真实IP? 是被伪造的吗? 域名真的不存在?这结果到底有没有被改过?反正也不知道,所以只能把结果原封不动的给用户了。
在用户那里体现也是意义很重大的,开启了 DNSSEC ,当DNS被劫持或污染,用户浏览器或者其他前端可以提示给用户,“ 警告:您访问的地址的 DNS 信息被伪造或篡改 ”,而不是直接打不开网页,或者打开了一个被攻击者重定向后的伪造网站。
下面是验证的流程:
从流程图可以看到,从根(.)到 .top,再到 f78fkdns.top,每一级 DNS 响应都带有签名,并且都能通过上一层的公钥验证,确保整个过程中的每一环都没有被篡改,来源是可信的。
-----------------------------------------------------------------------------------------------
我的f78fk.com域名,Cloudflare买的,买了后才知道不支持指定NS和Glue Record,转到NameSilo的话,需要等待60天,之后把 f78fk.com 委任到 (ns1/ns2/ns3).f78fkdns.top 上,并且同样开启DNSSEC的话就是这样的流程了。
等60天后再次部署验证吧。
2025年06年12日更新 :
昨天买了新域名 538053.xyz 委任到了我的自建权威DNS上,同样方法开启了DNSKEY测试一下。
Analyzing DNSSEC problems for 538053.xyz
. |  | Found 3 DNSKEY records for . |  | DS=20326/SHA-256 verifies DNSKEY=20326/SEP |  | Found 1 RRSIGs over DNSKEY RRset |  | RRSIG=20326 and DNSKEY=20326/SEP verifies the DNSKEY RRset |
|
xyz |  | Found 2 DS records for xyz in the . zone |  | DS=18130/SHA-256 has algorithm RSASHA256 |  | DS=3599/SHA-256 has algorithm RSASHA256 |  | Found 1 RRSIGs over DS RRset |  | RRSIG=53148 and DNSKEY=53148 verifies the DS RRset |  | Found 2 DNSKEY records for xyz |  | DS=18130/SHA-256 verifies DNSKEY=18130/SEP |  | Found 1 RRSIGs over DNSKEY RRset |  | RRSIG=18130 and DNSKEY=18130/SEP verifies the DNSKEY RRset |
|
538053.xyz |  | Found 1 DS records for 538053.xyz in the xyz zone |  | DS=52830/SHA-256 has algorithm ECDSAP256SHA256 |  | Found 1 RRSIGs over DS RRset |  | RRSIG=65206 and DNSKEY=65206 verifies the DS RRset |  | Found 2 DNSKEY records for 538053.xyz |  | DS=52830/SHA-256 verifies DNSKEY=52830/SEP |  | Found 1 RRSIGs over DNSKEY RRset |  | RRSIG=52830 and DNSKEY=52830/SEP verifies the DNSKEY RRset |  | ns2.f78fkdns.top is authoritative for 538053.xyz |  | 538053.xyz A RR has value 1.1.1.1 |  | Found 1 RRSIGs over A RRset |  | RRSIG=23040 and DNSKEY=23040 verifies the A RRset |
|
538053.xyz |  | ns3.f78fkdns.top is authoritative for 538053.xyz |  | 538053.xyz A RR has value 1.1.1.1 |  | Found 1 RRSIGs over A RRset |  | RRSIG=23040 and DNSKEY=23040 verifies the A RRset |
|
538053.xyz |  | ns1.f78fkdns.top is authoritative for 538053.xyz |  | 538053.xyz A RR has value 1.1.1.1 |  | Found 1 RRSIGs over A RRset |  | RRSIG=23040 and DNSKEY=23040 verifies the A RRset |
|
看起来整个链条的验证都是完美的。
同样可以看到,从根 . 到 xyz 域,再到我的 538053.xyz 域,整个链条验证也是完整的,所有签名校验均成功通过。但是多了一个警告信息, xyz/DNSKEY(算法 8,ID 3599) 不存在 。
这个通常是因为 .xyz 的 TLD 在更换 DNSSEC Key 时,向根域提交了新的(有效的)DS,但旧的(无效的)DS记录可能未及时从缓存或根域删除,导致出现多余的DS记录。完全不用担心,因为根域中已经有一条有效的DS可以正常验证 XYZ 域了。
常用命令
# 重启服务
systemctl restart named
# 查看日志
journalctl -u named -xe | tail -n 30
journalctl -xeu named.service
# 检查配置文件语法
named-checkconf
# 重新载入配置文件,识别新 zone
rndc reconfig
# 热加载所有 zone
rndc reload
# 热加载指定 zone
rndc reload f78fkdns.top
# 立即从主DNS同步
rndc retransfer f78fkdns.top