2025年6月11日星期三

权威 DNS 启用 DNSSEC


BIND9 启用 DNSSEC


主DNS服务器上操作

# 创建key 目录
mkdir /etc/bind/keys

vim named.conf

# 追加下面配置

#  定义了一个名为 default-policy 的 DNSSEC 策略:
# - 使用 ECDSA P-256 算法。
# - KSK 不轮换,便于长期固定部署。
# - ZSK 每 90 天轮换一次,提高安全性。
# 该策略可用于区域的自动密钥管理与签名。

dnssec-policy "default-policy" {
keys {
ksk lifetime unlimited algorithm ECDSAP256SHA256;
zsk lifetime 90d algorithm ECDSAP256SHA256;
};
};

# 指定 keys 路径
# 启用 DNSSEC 验证,并使用 DNS 根区域的默认信任锚
vim named.conf.options
options {
...
key-directory "/etc/bind/keys";

           dnssec-validation auto; 

...
};

# 启动自动签名和自动生成密钥
vim named.conf.local

zone "f78fkdns.top" {
type master;
...
inline-signing yes;   // 启用实时签名,避免维护单独的.signed文件
dnssec-policy "default-policy";   // 使用内置的默认DNSSEC策略(自动密钥生成/轮换/签名)
};

这样设置了就意味着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 的公钥都有,说明权威服务器配置正常,公钥部分也已经向全世界公开了。

继续验证:

首先使用 verisignlabs 验证 。

输入域名,f78fkdns.top 回车

返回了:

Analyzing DNSSEC problems for f78fkdns.top

.
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
top
Found 1 DS records for top in the . zone
DS=26780/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 top
DS=26780/SHA-256 verifies DNSKEY=26780/SEP
Found 1 RRSIGs over DNSKEY RRset
RRSIG=26780 and DNSKEY=26780/SEP verifies the DNSKEY RRset
f78fkdns.top
Found 1 DS records for f78fkdns.top in the top zone
DS=42980/SHA-256 has algorithm ECDSAP256SHA256
Found 1 RRSIGs over DS RRset
RRSIG=15030 and DNSKEY=15030 verifies the DS RRset
Found 2 DNSKEY records for f78fkdns.top
DS=42980/SHA-256 verifies DNSKEY=42980/SEP
Found 1 RRSIGs over DNSKEY RRset
RRSIG=42980 and DNSKEY=42980/SEP verifies the DNSKEY RRset
ns1.f78fkdns.top is authoritative for f78fkdns.top
Found 1 RRSIGs over NSEC RRset
RRSIG=64284 and DNSKEY=64284 verifies the NSEC RRset
NSEC proves no records of type A exist for f78fkdns.top
Found 1 RRSIGs over SOA RRset
RRSIG=64284 and DNSKEY=64284 verifies the SOA RRset
f78fkdns.top
ns2.f78fkdns.top is authoritative for f78fkdns.top
Found 1 RRSIGs over NSEC RRset
RRSIG=64284 and DNSKEY=64284 verifies the NSEC RRset
NSEC proves no records of type A exist for f78fkdns.top
Found 1 RRSIGs over SOA RRset
RRSIG=64284 and DNSKEY=64284 verifies the SOA RRset
f78fkdns.top
ns3.f78fkdns.top is authoritative for f78fkdns.top
Found 1 RRSIGs over NSEC RRset
RRSIG=64284 and DNSKEY=64284 verifies the NSEC RRset
NSEC proves no records of type A exist for f78fkdns.top
Found 1 RRSIGs over SOA RRset
RRSIG=64284 and DNSKEY=64284 verifies the SOA RRset

dnsviz.net 继续验证 :




















































可以看到,从根域(.)到顶级域(.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测试一下。

首先 verisignlabs 先来 :

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


看起来整个链条的验证都是完美的。

接下来换 dnsviz.net 测 :




















































同样可以看到,从根 .  到 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

XG-040G-XX SuPassword 解密工具

 买了新光猫 XG-040G-TF ,  所以写了一个 SuPassword 解密工具, 以备不时之需 . 点击下载