用 BIND 搭建高可用性 DNSSEC 仅权威服务器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rustyWolf
V2EX    DNS

用 BIND 搭建高可用性 DNSSEC 仅权威服务器

  •  1
     
  •   TrustyWolf 2014-10-31 18:07:07 +08:00 12335 次点击
    这是一个创建于 4075 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Setup Hign-Availability DNSSEC Authoritative Only BIND DNS Server

    本文的目的在于分享最近业余一直在研究的DNSSEC相关内容以及相关服务器的设置过程。
    来V2EX没几个月,作者小狼是学生党,总之属于新人啦~ 所以肯定有不足的地方,大家多多包涵~
    本文可以随意转载,但是一定要署名。<del>其实还有个重要的目的,由于博客还没有搭建好所以先找个地方存放供以后参考。</del>


    关于DNSSEC的介绍:

    请大家参阅ICANN的官方介绍: https://www.icann.org/resources/pages/dnssec-qaa-2014-01-29-zh (有中文翻译,大赞!)
    台湾地区从2012年开始进行了大规模的DNSSEC部署,并开设了相关的教学网站: http://dnssec.tanet.edu.tw/
    懂日语的同学还可以参考JPNIC的十分钟讲座https://www.nic.ad.jp/ja/newsletter/No43/0800.html


    关于DNSSEC目前的普及情况(2014年10月):

    所有的根域名()和大部分的顶级域名服务器(超过70%)都部署了DNSSEC。
    738 TLDs in the root zone in total
    556 TLDs are signed;
    546 TLDs have trust anchors published as DS records in the root zone;
    6 TLDs have trust anchors published in the ISC DLV Repository.
    想了解自己注册的顶级域名是否支持DNSSEC可以参考ICANN的TLD DNSSEC Report:
    http://stats.research.icann.org/dns/tld_report/
    想了解自己域名的注册商是否支持DNSSEC可以参考:
    https://www.icann.org/resources/pages/deployment-2012-02-25-en
    完成自己域名的DNSSEC权威服务器的部署需要以下前提条件:
    1. YOUR TOP-LEVEL DOMAIN (TLD) MUST BE SIGNED (目前有73%左右的顶级域名达到条件)
    2. YOUR DOMAIN REGISTRAR MUST SUPPORT DNSSEC (悲剧的是大部分人都卡在了这一步,目前支持DNSSEC的域名注册商太少,而且大部分支持DNSSEC的注册商只提供部分域名的支持,详情可以参考上面的链接。目前对DNSSEC支持比较好的知名域名注册商有Godaddy和GANDI以及Name.com)
    3. YOUR DNS HOSTING PROVIDER MUST SUPPORT DNSSEC (这一步也有很多人卡住,部署了DNSSEC的DNS会比没有部署之前消耗更多的资源,所以大部分DNS服务商也都没有提供DNSSEC的支持。Godaddy和DYN的付费DNS提供的DNSSEC的支持。)


    关于DNSSEC在递归DNS服务器上的普及情况:

    目前国内的大部分运营商的递归服务器还不能支持DNSSEC,不过互联网企业的公共DNS基本已经完成了DNSSEC的支持,以下是小狼目前测试到支持DNSSEC DS记录的DNS:(有待补充)
    阿里 AliDNS 223.5.5.5 223.6.6.6
    CNNIC SDNS 1.2.4.8 210.2.4.8
    114 DNS 114.114.114.114 114.114.115.115
    oneDNS 112.124.47.27 114.215.126.16
    DNS 派 101.226.4.6 218.30.118.6
    123.125.81.6 140.207.198.6
    Google DNS 8.8.8.8 8.8.4.4
    OpenDNS 208.67.222.222 208.67.220.220
    北京电信 219.141.136.10 219.141.140.10
    北京联通 202.106.196.115 202.106.46.151 202.106.0.20
    黑龙江联通 202.97.224.69
    江苏电信 218.2.2.2 218.4.4.4
    61.147.37.1 218.2.135.1 (几乎全线支持)
    其他很多地区的递归服务器小狼还没有测试,希望各位V友能帮忙测试一下0.0
    检查方法很简单:dig +noadditional DS icann.org. @DNS 的IP | grep DS
    如果有DS记录返回则说明该服务器支持DNSSEC,如:
    [root@0w0 ~]# dig +noadditional DS icann.org. @114 .114.114.114 | grep DS
    ; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> +noadditional DS icann.org. @114 .114.114.114
    ;icann.org. IN DS
    icann.org. 86400 IN DS 41643 7 1 93358DB22E956A451EB5AE8D2EC39526CA6A87B9
    icann.org. 86400 IN DS 41643 7 2 B8AB67D895E62087F0C5FC5A1A941C67A18E4B096F6C622AEFAE30DD 7B1EA199


    关于DNSSEC在DNS服务器软件上的普及情况:

    目前的BIND、PowerDNS、NSD等主流的DNS服务器软件都已无缝支持DNSSEC,并且经过一段时间的技术演进性能已趋于稳定。但是部署DNSSEC后会加重服务器的负载也成为不争的事实。这也在一定程度上减缓了DNSSEC的普及速度。

    所以,虽然DNSSEC的普及还有很长的一段路要走,但是目前的情况已经比之前好很多,如果找到一家靠谱的支持DNSSEC的域名注册商,完全可以通过自己搭建DNS仅权威服务器的方式使自己的域名支持DNSSEC。


    DNSSEC部署方面的相关分享(属于纯粹的实验总结分享,并不是严肃的教程=_=,所以不能保证客观正确性):

    小狼这次是用肉身做实验了,申请了域名(wolflab.net感觉这个域名不错^_^)并亲自搭建了DNS仅权威服务器。
    部署完成后的图形化检测结果(检测地址http://dnsviz.net/):
    同时使用KSK和ZSK签署
    http://wolfmoe.qiniudn.com/wolflab.net-2014-10-31-03-30-11-UTC.png
    仅使用KSK签署
    http://wolfmoe.qiniudn.com/wolflab.net-2014-10-31-09-56-49-UTC.png

    关于域名的申请:
    在看到ICANN提供的那份表单之前,小狼的域名是在Name.com注册的,他家也为域名提供了DNSSEC的管理界面(在国内加载特别慢...),但是增加DS的时候总是提示参数错误,后来给客服发了个Ticket客服回复说让我联系DNS的管理员(我才不会说DNS的管理员就是自己呢o(□)o)。然后就是各种谷歌,然后,搜到了ICANN的那个页面(https://www.icann.org/resources/pages/deployment-2012-02-25-en),然后,就没有然后了QAQ
    /* 此处省略一大段废话 */
    最后,小狼选择了TransIP B.V.这家注册商<del>前阵子搞活动.net一年4.75欧,官网也挺高端的-_+</del>

    以下分享一下在CentOS 7和BIND9(yum安装)环境下配置DNSSEC的过程:

    相关教程的链接(强烈推荐阅读):
    DNS搭建相关:
    业界良心DigitalOcean的系列文章 An Introduction to Managing DNS: https://www.digitalocean.com/community/tutorial_series/an-introduction-to-managing-dns(包含DNS的相关介绍和Debian系的安装教程)
    https://www.digitalocean.com/community/tutorials/how-to-install-the-bind-dns-server-on-centos-6(RedHat系的安装教程 CentOS6 CentOS 7通用)
    当然RedHat的官方指南中对BIND也有详细的教程,大家可以参考
    DNSSEC部署相关:
    https://www.digitalocean.com/community/tutorials/how-to-setup-dnssec-on-an-authoritative-bind-dns-server--2 (RH系)
    Debian系的强烈建议参考台湾交大资通安全研究与教学中心的DNSSEC部署SOP
    http://dnssec.tanet.edu.tw/index.php/sop

    以下是小狼自己的部署过程分享(欢迎各位批评与指正,鞠躬~):

    环境:CentOS 7 + BIND 9.9.4

    为了增强高可用性(其实是偷懒=_=),此处小狼只使用4096bits的KSK密钥签署整个网域并且不设定密钥的期限。这样做的优点是管理十分方便,每次修改DNS记录后只需要重新签署网域即可,不需要进行复杂的密钥管理。 [而在安全的强度方面,根据"European Network of Excellence in Cryptology II“于2010年3月的报告指出,破解 RSA 2048bits 约需要三亿美金的预算,使用 ASIC 花费 10 年来运算。也就是说,本文所建议的方式,仍然是需要非常高的代价才可被破解,而破解后的收获仅是获得 DNSSEC 的金钥,可用来仿冒 Resource Record。我们认为,除非管理者所管理的相关系统,价值超过数亿美金,否则本文所建议的方式已经提供足够的安全性。摘自http://dnssec.tanet.edu.tw/images/DNSSEC/DNSSEC_Authoritative_ServerSOPLite_v2.12.pdf]

    安装BIND9过程及初始化设置过程略...

    [root@sg tw]# nano /etc/named.conf
    # 检查以下设置的状态
    recursion no;
    dnssec-enable yes;
    dnssec-validation yes;
    dnssec-lookaside auto;

    zone "wolflab.net" IN {
    type master;
    # 修改文件名
    file "wolflab.net.zone.signed";
    allow-transfer { 1.1.1.1; 2.2.2.2; };
    };

    进入 /var/named/ [root@sg named]# ls -al
    total 47
    drwxr-x--- 6 root named 4096 Oct 31 09:35 .
    drwxr-xr-x. 22 root root 4096 Oct 30 18:32 ..
    drwxr-x--- 7 root named 4096 Oct 27 23:10 chroot
    drwxrwx--- 2 named named 4096 Oct 29 13:12 data
    drwxrwx--- 2 named named 4096 Oct 31 09:33 dynamic
    -rw-r----- 1 root named 2166 Oct 28 22:19 named.ca
    -rw-r----- 1 root named 152 Dec 15 2009 named.empty
    -rw-r----- 1 root named 152 Jun 21 2007 named.localhost
    -rw-r----- 1 root named 168 Dec 15 2009 named.loopback
    drwxrwx--- 2 named named 4096 Jun 10 16:13 slaves
    -rw-r--r-- 1 root named 533 Oct 30 14:15 wolflab.net.zone

    首先确保zone文件格式正确,BIND9能够正常运行。
    修改一下Serial,方便同步从服务器
    然后安装haveged (目的是加快密钥生成速度)
    [root@sg named]# yum -y install haveged
    [root@sg named]# chkconfig haveged on
    [root@sg named]# service haveged start

    生成KSK密钥
    [root@sg named]# dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -r /dev/urandom -K /var/named wolflab.net
    Generating key pair...........++ ...............................................................................................................................++
    Kwolflab.net.+007+38406
    以下是相关参数的说明:
    -f 密钥的flag
    -a 密钥的算法
    -b 密钥的长度
    -r 乱数来源
    -K 密钥文件产生后存放的目录(默认为当前目录)
    Zone name

    将密钥添加到zone文件中
    [root@sg named]# for key in `ls Kwolflab.net*.key`
    > do
    > echo "\$INCLUDE $key">> wolflab.net.zone
    > done
    wolflab.net.zone 中的最后一行会包含以下字样:
    $INCLUDE Kwolflab.net.+007+38406.key

    签署网域
    [root@sg named]# dnssec-signzone -3 7aa7c4b1300f4915 -H 100 -K /var/named -o wolflab.net -S -u -z wolflab.net.zone
    Verifying the zone using the following algorithms: NSEC3RSASHA1.
    Zone fully signed:
    Algorithm: NSEC3RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked
    ZSKs: 0 active, 0 stand-by, 0 revoked
    wolflab.net.zone.signed
    以下是相关参数的说明:
    -3 NSEC3使用的salt值,可在Debian系统中使用
    head -c 1000 /dev/random | sha1sum | cut -b 1-16
    命令随机生成,也可以使用SOP教程中的值61
    -H NSEC3 使用的 Iteration 值,默认为10
    -K 密钥文件产生后存放的目录(默认为当前目录)
    -o 网域名称
    -S 智能签署
    -u 更新NSEC/NSEC3
    -z 使用KSK签署整个zone file
    Zone name

    权限设置(其实这步可以省略 644权限是不是named组都无所谓啦)
    [root@sg named]# chown root:named K*
    [root@sg named]# chown root:named *.signed
    [root@sg named]# ls -al
    drwxr-x--- 6 root named 4096 Oct 31 17:01 .
    drwxr-xr-x. 22 root root 4096 Oct 30 18:32 ..
    drwxr-x--- 7 root named 4096 Oct 27 23:10 chroot
    drwxrwx--- 2 named named 4096 Oct 29 13:12 data
    -rw-r--r-- 1 root root 167 Oct 31 17:01 dsset-wolflab.net.
    drwxrwx--- 2 named named 4096 Oct 31 17:14 dynamic
    -rw-r--r-- 1 root named 951 Oct 31 16:40 Kwolflab.net.+007+38406.key
    -rw------- 1 root named 3319 Oct 31 16:40 Kwolflab.net.+007+38406.private
    -rw-r----- 1 root named 2166 Oct 28 22:19 named.ca
    -rw-r----- 1 root named 152 Dec 15 2009 named.empty
    -rw-r----- 1 root named 152 Jun 21 2007 named.localhost
    -rw-r----- 1 root named 168 Dec 15 2009 named.loopback
    drwxrwx--- 2 named named 4096 Jun 10 16:13 slaves
    -rw-r--r-- 1 root named 587 Oct 31 16:52 wolflab.net.zone
    -rw-r--r-- 1 root named 22437 Oct 31 17:01 wolflab.net.zone.signed

    重启BIND9
    [root@sg named]# systemctl restart named-chroot

    结果验证
    [root@0w0 ~]# dig DNSKEY wolflab.net. @0w0 .moe(DNS地址) +multiline
    root@debian:~# dig A wolflab.net. @0w0 .moe(DNS地址) +noadditional +dnssec +multiline
    如果出现一大堆排列很整齐的乱码=_=,恭喜,设置成功~
    dsset-wolflab.net.中记录着签署时生成的DS记录
    [root@sg named]# cat dsset-wolflab.net.
    wolflab.net. IN DS 42945 7 1 EBE05D35D18466A4013B953E51AA1049CB7CB63F
    wolflab.net. IN DS 42945 7 2 5F953F58484289F3D886AD8E8F604A7365A4DE9E7FE8B5ACC598023A C0998F62
    此记录用来提交给域名注册商
    有些域名注册商并不使用DS记录,而是直接提交DNSSEC KEY(比如TransIP),使用dig DNSKEY wolflab.net. @DNS 的IP 即可直接查看

    最后再次声明,本文可以随意转载,但是一定要署名,首发于V2EX。
    第 1 条附言    2014-11-05 22:36:02 +08:00
    20141105补充:
    自己搭建的BIND已经运行五天,目前三个节点的情况都良好,国内外解析都比较正常。
    但是今天在另一台虚拟机中使用dig +trace wolflab.net命令时发现会出现卡在最后一步的情况。
    症状表现为最后一段记录无法显示,提示没有服务器响应或者超时。

    小狼反复对比了相关的教程和自己的操作步骤,发现有一步存在问题,解决方案如下:
    在编辑.zone文件(解析记录)时一定要在NS记录下添加这么一段记录:
    @ IN NSEC3PARAM 1 0 100 61

    其中100和61分别为iteration和salt值,具体解释摘录http://dnssec.tanet.edu.tw/中的原话:

    '@ IN NSEC3PARAM 1 0 100 61' 用定NSEC3功能,
    NSEC3DNSSEC用回"不存在"(例如某host/domain不存在),
    且回答可受信任的方法,
    一定要加入定.

    管理者需知道的定iteration和salt,
    iteration行hash的次, 上述例子100次, 此我的建值, 不建更改,
    salt功能在RR名追加自己定的16位字串(0-F,且度2的倍), 使字典攻法的威降低,
    上述例子61, 可以自行改成例如FF / 8888 / 1234567890等等.

    充一下,
    NSEC3的iteration和salt定除了在上述的NSEC3PARAM用到之外,
    做zone署(dnssec-signzone)也用到,
    地方的iteration和salt值一定要相同.

    假在NSEC3PARAM定 iteration=100 salt=61
    在zone署一定要定 iteration=100 salt=61

    按照此步骤修改.zone后重新签署域名,问题很快解决。
    10 条回复    2016-08-03 23:20:35 +08:00
    TrustyWolf
        1
    TrustyWolf  
    OP
       2014-10-31 18:11:23 +08:00
    再补充一些DNSSEC测试的网站:
    http://dnsviz.net/
    http://dnssec-debugger.verisignlabs.com/
    以及浏览器插件:
    ttps://www.dnssec-validator.cz/

    之前的排版废了QAQ...
    wwqgtxx
        2
    wwqgtxx  
       2014-10-31 19:20:27 +08:00 via Android
    可以用markdown排班一下可能看着更舒服
    panzhc
        3
    panzhc  
       2014-10-31 22:10:26 +08:00
    这个赞
    TrustyWolf
        4
    TrustyWolf  
    OP
       2014-10-31 23:20:40 +08:00
    @wwqgtxx 原来V2支持Markdown...谢谢下次一定会注意!
    @panzhc 感谢鼓励!
    国内关于这方面中文的资料太少,大部分都已经过时了,最近正好在折腾这些所以赶紧记录下来分享~
    wwqgtxx
        5
    wwqgtxx  
       2014-11-01 07:14:05 +08:00 via Android   1
    @TrustyWolf 建议使用v2ex notes的发布功能在发这种技术文章,就像L大大的官方文档一样
    p/7v9TEc53
    因为notes发布的内容可以修改^ω^
    0w0
        6
    0w0  
       2015-02-04 00:07:59 +08:00
    有人 @ 我 冒泡
    0w0
        7
    0w0  
       2015-02-04 00:09:43 +08:00
    我靠 这…… 94天前的帖子 我怎么才收到 @ 的提示 ……

    管理管给沉了吧…… 我不是故意挖坟的orz
    roxhaiy
        8
    roxhaiy  
       2015-07-28 13:24:03 +08:00
    虽然略显混乱,但是参考了文中提到的台湾交大DNSSEC部署SOP的pdf,应该说基本搞懂了,谢谢!
    TrustyWolf
        9
    TrustyWolf  
    OP
       2016-03-28 15:59:31 +08:00
    新发布了 2016 版,请大家移步:/t/266750
    bclerdx
        10
    bclerdx  
       2016-08-03 23:20:35 +08:00
    顶起来~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2662 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 07:21 PVG 15:21 LAX 23:21 JFK 02:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86