本文档介绍如何为您的域名开启 DNSSEC(DNS Security Extension)。
作为 DNS 的扩展协议,DNSSEC 为 DNS 数据的来源和完整性提供了鉴权机制,可以验证 DNS 响应是否来自权威 DNS 服务器,从而避免 DNS 缓存投毒(DNS cache poisoning)等攻击。参见 DNSSEC 了解更多信息。
DNSSEC 引入了以下记录类型:
递归 DNS 服务器发送 DNS 查询请求时,DNSSEC 验证过程如下:
您的域名必须同时满足以下条件才能开启 DNSSEC。
警告
如果您的域名开启了 DNSSEC,且该域名的付费版本实例到期时没有及时续费,您的域名解析会失败。如果你计划不再为您的域名的付费版本实例续费,您需要在域名注册服务商处删除 DS 记录,然后在云解析 DNS 中关闭 DNSSEC。
说明
如果您的域名开启了 DNSSEC,但用户的 Local DNS 服务器不支持 DNSSEC,域名可能无法被正常解析。
说明
如果您的域名下有域名前缀为 @ 的 CNAME 解析记录,则您的域名无法开启 DNSSEC。如果您的域名开启了 DNSSEC,您也无法添加域名前缀为 @ 的 CNAME 解析记录。
参见以下步骤在云解析 DNS 中为您的域名开启 DNSSEC。
参数 | 描述 |
|---|---|
DS记录 DS Record | DS(Delegation Signer)记录。该记录包含 DNSKEY 记录中的 KSK 公钥的哈希值。 |
密钥标签 Key Tag | Key Tag 是一个 16 bit 的数字,用于从 DNSKEY 记录的 RRSet 中标识一条 DNSKEY 记录。该参数标识了包含 KSK 公钥的 DNSKEY 记录。 |
加密算法 Algorithm | 计算 KSK 公钥的哈希值所使用的算法。 |
摘要类型 Digest Type | KSK 公钥的哈希值的类型。 |
摘要 Digest | KSK 公钥的哈希值。 |
公钥 Public Key | KSK 公钥。 |
公钥类型 Flags | 公钥的类型。该参数为 257(KSK)。 |
参见域名注册服务商的产品文档,使用从步骤一获得的信息为您的域名添加 DS 记录。
添加 DS 记录后,您可以验证 DNSSEC 是否生效。
DNSViz 是一个在线、开源的 DNS 分析工具。下面的步骤以 DNSViz 为例,介绍如何验证 DNSSEC 是否已经对您的域名生效。
example.com 为例展示了有效的 DNSSEC。
brokendnssec.net 为例展示了因权威 DNS 服务器缺少 DNSKEY 记录导致其无法匹配顶级域 DNS 服务器的 DS 记录,从而造成信任链中断。
您可以使用 dig +dnssec 命令验证 DNSSEC。
$ dig +dnssec www.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59330 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 512 ;; QUESTION SECTION: ;www.example.com. IN A ;; ANSWER SECTION: www.example.com. 19439 IN A 93.184.216.34 www.example.com. 19439 IN RRSIG A 13 3 86400 20240207154702 20240117103421 60960 example.com. nZz4JmYshN2qjQtcgt5Lfh9AXE04X7jp3p/ORq5j7m8JWEqtuqlEOzr7 W4DOBmrPg7NFiP7Ij+t3+YxtgW89iQ==
如果 DNS 响应中包含 RRSIG 记录,则说明 DNS 响应经过 DNSSEC 验证。另外,返回信息中的 ad flag 也说明 DNS 响应是经过 DNSSEC 验证的。
说明
如果 dig +dnssec 命令没有返回 RRSIG 记录,也可能是因为您使用的递归 DNS 服务器(公共 DNS 服务器或 Local DNS 服务器)不支持 DNSSEC。你可以使用一个支持 DNSSEC 的公共 DNS 服务器进行验证,例如 1.1.1.1 或 8.8.8.8。
$ dig +dnssec www.example.com @1.1.1.1
您可以使用 dig DNSKEY 命令获取 example.com 的 DNSKEY 记录:
$ dig DNSKEY example.com +short 256 3 13 joM9sPIlr483WIEP5ra1SdYGDRemvZgXUZ3HSZs9EK8GTYti4eTuGkrT L/4NBJOW/9TxpJ9MfrBA0H21hkxvlg== 257 3 13 kXKkvWU3vGYfTJGl3qBd4qhiWp5aRs7YtkCJxD2d+t7KXqwahww5IgJt xJT2yFItlggazyfXqJEVOmMJ3qT0tQ== 256 3 13 PSaUY8snD++LwIab0JNMP9zyx2whZOhc3kciM2XOR4gk09wr4uDxWwr3 Zzq84rk30l8fwxI/94QWRIgwZFNaFw==
其中,256 代表公钥类型是 ZSK;257 代表公钥类型是 KSK。
您可以通过 dig DS 命令获取 example.com 在域名注册服务商处添加的 DS 记录。
$ dig DS example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19632 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;example.com. IN DS ;; ANSWER SECTION: example.com. 86400 IN DS 370 13 2 BE74359954660069D5C63D200C39F5603827D7DD02B56F120EE9F3A8 6764247C ;; Query time: 459 msec ;; SERVER: 1.1.1.1#53(1.1.1.1) ;; WHEN: Thu Jan 18 16:28:57 CST 2024 ;; MSG SIZE rcvd: 88