用 BIND 搭建高可用性 DNSSEC Hidden Master Server - 2016 年版

2016-03-28 05:51:46 +08:00
 TrustyWolf

V2.0 - 2016.03.28 2016 年版 - DNSSEC Test Project
V1.0 - 2014.10.31 2014 年版 - 发表于 V2EX /t/143009

这是一个大坑 Orz
距上一版发布已经一年半了,想想自己在 V2EX 发布过的所有主题贴,
只有这篇有些许技术含量和参考价值,很是残念。
这次春假打算把这个坑填完,也算是对自己有个交代了。

因本人能力有限,本文可能存在错误或者过于主观的个人观点。
希望大家能抱着批判的态度阅读 Orz

本文同时发布于我的 个人博客
并使用 CC BY-NC-SA 4.0 进行许可

1. 关于 DNSSEC

关于 DNSSEC 的背景、目的和原理,强烈建议大家先阅读清华大学段海新老师的这篇文章,讲解的非常好,只是由于年代原因,其中 BIND 配置的章节已经过时,关于配置部分请大家参考下文。

简而言之, DNSSEC 通过数字签名的方法得以让用户验证 DNS 解析结果的真实性和完整性,但并不提供对 DNS 信息的加密,也就是说,在网络上传输的 DNS 信息依然是明文的,但是经过了可靠的签名。个人感觉这很类似于电子邮件领域的 PGP 签名,但 PGP 的公钥是自由发布的,可能并不可靠,而 DNSSEC 则建立了一套可靠的公钥基础设施( PKI ),使得公钥像 SSL 证书一样也有了证书信任链。段老师的文章里还提到了可信锚( Trust Anchors ),这就像 SSL 的根证书,在早些年 DNSSEC 的证书链还并未完善,有些顶级域的 DS 记录并未进入根域,这时候就需要 DNSSEC Look-aside Validation (DLV) 来提供证书信任链的支持,现在绝大部分的顶级域都已不再需要 DLV , ISC 也将于 2017 年停止对 DLV 的支持。

另一方面, DNSSEC 虽然是对现有 DNS 协议的扩展,但是对 DNS 报文的大小提出了更高的要求,支持 DNSSEC 的域名服务器必须支持 EDNS0 (见 RFC2671 ),即允许 DNS 报文大小必须达到 1220 字节(而不是最初的 512 字节),在目前的实际操作中, DNS 报文大小通常是 4096 字节。

我们来做一个小实验验证一下:

$ dig icann.org +dnssec +noadditional +multiline

; <<>> DiG 9.10.3-P4-RedHat-9.10.3-12.P4.fc25 <<>> icann.org +dnssec +noadditional +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50665
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 5, ADDITIONAL: 8

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;icann.org.             IN A

可以看到 udp: 4096 ,代表报文大小。并且 DNSSEC 的验证并不是直接查询一次递归服务器得到 RRSIG 记录就行了的,还需要查询上一级域中的 DS 记录才能完成验证,所以说如果 DNSSEC 被广泛部署和运用,无疑大量增加了 DNS 服务器和网络的负担,也成为了 DNSSEC 部署的最大阻力之一。

一个网域完成 DNSSEC 的部署需要以下前提条件:

  1. YOUR TOP-LEVEL DOMAIN (TLD) MUST BE SIGNEDTLD (顶级域的支持)
  2. YOUR DOMAIN REGISTRAR MUST SUPPORT DNSSEC (域名注册商的支持)
  3. YOUR DNS HOSTING PROVIDER MUST SUPPORT DNSSEC ( DNS 服务提供商的支持)

早在 2010 年 5 月, ICANN 就已在全球 13 台 Root DNS Server 上部署了 DNSSEC ,并设立了专门的网站。根据最近的 TLD DNSSEC Report,全球 1262 个 TLD 中已有 1093 个的 DS 记录被添加进了 Root Zone ,也就是说 86.6% 的顶级域都已支持 DNSSEC 。域名注册商的支持方面也取得了不小的进展,国外各大域名注册商都逐渐对 DNSSEC 的 DS 记录添加功能提供了支持,比如 GoDaddyNamecheapGandi.net 以及被 V2EXer 们讨论较多,性价比很高的NameSilo 等。具体的支持情况可以查询 ICANN 的 报表(不断更新中)。

如上所述,目前看来 DNSSEC 部署最薄弱的环节还是在 DNS 服务提供商提供的 Master DNS 和运营商的递归 DNS ,当然,对于经济和技术实力有限的服务商来说,对 DNSSEC 保持谨慎的态度的确是一个明智的选择,因为在当今的网络环境中 DNS 非常脆弱, DNSSEC 并没有从根本上解决 DNS 服务本身的安全问题,针对 DNS 的 DDos 攻击依然存在,并且部署了 DNSSEC 之后被攻击所造成的后果可能更加严重,还可能产生新的隐私和安全问题,比如针对 DNSSEC NSEC 记录的恶意遍历攻击。

在公共递归 DNS 领域,Google Public DNS 从 2013 年开始支持 DNSSEC 查询请求。国内, CNNIC 的 SDNS 云解析服务 也提供对 DNSSEC 的支持。而在运营商的递归 DNS 领域,国内基本还没有运营商支持 DNSSEC ,下面给出验证一台递归 DNS 是否支持 DNSSEC 的方法。

$ dig icann.org +dnssec +noadditional +multiline @1.2.4.8 | grep RRSIG
icann.org.              600 IN RRSIG A 7 2 600 (
icann.org.              66748 IN RRSIG NS 7 2 86400 (

如上所示, icann.org 是支持 DNSSEC 的域名,而 @1.2.4.8 指定了查询的 DNS 服务器(这里是 CNNIC 的公共 DNS ),当然如果不知道本地的递归 DNS 地址的话也可以留空。 dig 查询到了 RRSIG 记录,证明该递归 DNS 支持 DNSSEC 。

而在 DNS 服务提供商领域,几乎很少有支持 DNSSEC 的免费 DNS 托管服务, Dyn, Inc. 和 Amazon 等服务提供商都在收费 DNS 产品中提供了对 DNSSEC 的支持。特例也是有的,那就是大土豪 CDN 服务提供商 CloudFlare ,在其与免费 CDN 所配套的 DNS 服务中提供了对 DNSSEC 的支持,并采用了 ECDSA 加密算法减少加密带来的服务器负担。

2. DNSSEC Test Project

好了,关于 DNSSEC 我们就介绍到这里,虽说 DNSSEC 有上述的缺点,但是作为一名励志成为大牛技术者的技术宅学生( 大雾,并不妨碍咱的学习,当然学习了解 DNSSEC 的最好的方法就是自己动手部署一个支持它的网域。下面咱就从一个网域管理员的角度从零开始用 BIND 进行部署 DNSSEC 的测试。

BIND 和 NSD 这两款常用的 DNS 服务器软件从很早的版本开始就已支持 DNSSEC 。 BIND 与 NSD 相比,虽然性能稍弱,但是相关的功能和文档都更加丰富,在各大 Linux 发行版的文档中都有 BIND 的身影,在 DNSSEC 领域更是如此,从 BIND 9.9 开始,新增了 Inline Signing 功能,这意味着 DNSSEC 的签名过程可以实现全自动,设定完毕后,平时的使用与维护操作与未导入 DNSSEC 功能时基本无异。

本次测试搭建的是 Hidden Master Server ,关闭递归功能并开启区域传递,实际 DNS 查询流量由右侧的 Secondary DNS Server 负担,感谢 PUCK Free Secondary DNS ServiceRoller Network 提供免费并且支持 DNSSEC 的 Secondary DNS 服务,整体架构如下:

为了实现高可用性,运用了 Inline Signing 并用无期限的 KSK 签署整个域,不使用 ZSK ,避免了密钥的期限和更新问题。生成密钥的算法使用了 ECDSAP256SHA256 。

0 )测试环境

$ cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
$ named -v
BIND 9.9.4-RedHat-9.9.4-29.el7_2.3 (Extended Support Version)

其他的发行版可能在命令或者配置文件的位置上稍有不同,本文仅供参考。

1 )系统准备

2 ) DNSSEC Master Server 的部署

3 ) DNSSEC Master Server 的后续维护和管理

由于此次搭建的是高可用性 DNSSEC Master Server ,并没有设置密钥的有效期,而且整个签署过程都是自动完成的。所以维护起来相当方便,不会造成因为密钥过期等原因导致的认证故障。

当对 Zone 进行过修改后,使用 rndc reload 命令即可完成对整个域的重新签署,无需人工干预。

但是出于安全考虑,强烈建议定期重新生成 KSK 密钥并更新 DS 记录,并确保密钥文件权限的正确。

3. DNSSEC 的其他应用

DNSSEC 除了可以验证域名解析结果之外,还可以与 TLSA 记录结合用来验证 x509 (SSL) 证书的真实性。这种技术被成为 DNS-based Authentication of Named Entities (DANE),被定义于 RFC 6698 。

生成 TSLA 的过程也很简单:

$ openssl x509 -noout -fingerprint -sha256 < server.crt | tr -d :
SHA256 Fingerprint=2164CDDDCFAF27FF6A280043E6E3906CCB6BB4DD99938B795C0BA64ED42D7989

其中 server.crt 就是 SSL 证书。

然后在 Zone 文件中添加如下的记录:

_443._tcp.dnssec       3600	IN	TLSA    1 0 1 2164CDDDCFAF27FF6A280043E6E3906CCB6BB4DD99938B795C0BA64ED42D7989

dnssec 是原有的记录,可以按需替换为 www 等。之后使用 rndc reload 命令重新自动配置 BIND 。

$ dig +dnssec +noall +answer +multi _443._tcp.dnssec.wolflab.net. TLSA
_443._tcp.dnssec.wolflab.net. 3600 IN TLSA 1 0 1 (
                                2164CDDDCFAF27FF6A280043E6E3906CCB6BB4DD9993
                                8B795C0BA64ED42D7989 )
_443._tcp.dnssec.wolflab.net. 3600 IN RRSIG TLSA 13 5 3600 (
                                20160426190854 20160327182354 27278 wolflab.net.
                                MupIX+iMEAItSiKOLz97pSGVcpkAyE4U6yu4cGnY6p5C
                                d9f/xf72KRGLyJ3Dkshy2BFAZoqkBxd7HACUA9zbxg== )

使用 CZ.NIC Labs 提供的两款浏览器插件可以得到更加直观的显示效果,如图:

这款插件也可以对 DNSSEC 进行检测。

4. 总结

从 1997 年第一个有关 DNSSEC 的标准 RFC 2065 发布至今已经快 20 年了,但是很显然还有很漫长的路要走。

最后很想用一个小时候看的动画片《春田花花同学会》里校长一段很经典的台词来结束这篇文章,也算是抒发一下心中的感慨了。

各位同学,本校创校快将五十年,未够五十年,但是,差不多五十年啦。很快,本校创校就要超过五十年啦。 恩,在这接近五十年,未够五十年间,本校已经为社会培养了很多条栋梁,很块,本校会为社会培养出更多条栋梁。 也许有人会问,校长,你在这五十年里,培养了这么多条社会栋梁,实际上,又有什么用呢?在这,我可以很清楚地告诉大家,本校创办,还要很久才够五十周年。 至于本校会不会有机会去庆祝我们的五十周年呢?为我们的社会,培养出更多的栋梁。就要看本校这个月……能不能收齐同学的学费啦。谢谢各位。

在技术进步的路上,的确还有很多的学费要交。不研究历史的人,注定要重复历史。

最后,感谢方校长,让我下定决心踏上异国求学之路。

Trusty Wolf

2016 年 3 月 28 日于东京

Ps. 由于目前支持 DNSSEC 的免费 Secondary DNS 服务太少且都集中在欧美,如果您觉得这篇文章对您有所帮助且您有长期稳定运行并支持 DNSSEC 的 DNS 服务器,希望您也能为 wolflab.net 提供 Secondary DNS QAQ

PPs. @CloudXNS 你家的 DNS 蜘蛛简直丧心病狂 Log 满屏幕的 *.ns.dns-spider.ffdns.net 和 *.ns.dns-spider.myxns.cn Orz

7413 次点击
所在节点    DNS
25 条回复
heiybb
2016-03-28 06:45:38 +08:00
支持一下
dynaguy
2016-03-28 07:45:38 +08:00
我有一个域名,注册在 GODADDY 。使用它家的 DNS 服务器。没有自己的 DNS 服务器如何使自己的域名得到 DNSSEC 呢?我到 GODADDY 看了一下,要升级账号(交月费)就会有自动 DS 记录。我这种基本客户有啥办法吗?
msg7086
2016-03-28 08:27:28 +08:00
其实 DANE 能认证自签名证书么……
laincat
2016-03-28 09:11:39 +08:00
好详细~!支持一下!
bobopu
2016-03-28 10:27:23 +08:00
支持。
bubbles
2016-03-28 10:35:28 +08:00
支持一下,先收藏,再慢慢看。
SFJ4MEGabMk2
2016-03-28 10:46:04 +08:00
👍, CloudXNS 的 DNS 爬虫是想干嘛?
erenno1
2016-03-28 12:06:26 +08:00
礼貌回帖,支持下
TrustyWolf
2016-03-28 12:23:39 +08:00
@dynaguy 如果不打算自己搭建 DNS 的话,可以使用 CloudFlare 的 DNS 服务器,大土豪 CF 是免费支持 DNSSEC 的。而且他家的 DNS 使用了任播技术,生效很快。
TrustyWolf
2016-03-28 12:26:57 +08:00
@msg7086 可以的,但是要稍微改一下文中的 TLSA 记录,变为 IN TLSA 3 0 1 哈希值,也就是吧开头的 1 改为 3 。
bclerdx
2016-03-28 13:11:59 +08:00
科普知识,记号~
chinvo
2016-03-28 13:20:52 +08:00
我在主从 ns 之间用的 dnscrypt /斜眼
CloudXNS
2016-03-28 14:21:23 +08:00
@TrustyWolf
@i386
很抱歉影响到你们, CloudXNS 的爬虫是为运维工具 http://tools.cloudxns.net 服务的。
若你们感觉受到干扰,可通过服务器防火墙屏蔽,亦可联系 CloudXNS 官方客服提供您的服务器 IP ,我们将联系技术人员在爬虫系统上过滤。
TrustyWolf
2016-03-28 15:45:54 +08:00
@CloudXNS 嘛,并没有受到干扰啦,咱就是觉得 CloudXNS 的爬取机制稍微有点问题,其他国外的 DNS 爬虫并不会在一个周期内进行多达 22 次的爬取,而且被服务器 denied 之后依然会爬。还有咱这台服务器只是在 SOA 记录里出现的啊,并不是 NS 记录里的服务器 QAQ
TrustyWolf
2016-03-28 15:51:47 +08:00
@chinvo 咱用的两台从服务器并不支持 TSIG QAQ
dreammes
2016-03-28 16:05:38 +08:00
支持一下
abel163
2016-03-28 16:26:39 +08:00
绑定
ovear
2016-03-28 16:28:09 +08:00
菊巨。。前排支持
TrustyWolf
2016-03-28 16:30:17 +08:00
@ovear 并不是菊苣啦 =w=
kn007
2016-03-28 16:36:05 +08:00
前排支持!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/266750

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX