bind软件
目前dns的行业标准是bind软件,现今所有操作系统都是使用bind提供dns服务。在CentOS中它的名称就是bind,而Ubuntu中则是bind9。
安装bind
通过下面的命令安装bind软件包
1 |
yum install -y bind |
bind的daemon进程为named,可以使用下面的命令检查bind是否安装成功
1 2 3 4 |
[root@vmcentos7 ~]# systemctl status named ● named.service - Berkeley Internet Name Domain (DNS) Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled) Active: inactive (dead) |
命令输出显示named进程已经存在,但服务还没有启动;可以使用下面的命令启动并允许named开机自动运行:
1 2 |
[root@vmcentos7 ~]# systemctl enable named; systemctl start named Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service. |
现在named已经启动。
主配置文件
bind的主配置文件是/etc/named.conf,它的主要内容大致有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
options { listen-on port 53 { 127.0.0.1; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; recursion yes; }; zone "." IN { type hint; file "named.ca"; }; |
listen-on port 53: 监听udp 53 端口
listen-on-v6 port 53: ipv6的监听端口
directory:工作目录,一些配置文件和zone file的所在目录
allow-query:any值表示允许任何人向服务器发起查询请求
recursion:yes表示使用递归查询
只作为缓存的DNS服务器
这是最简单的DNS服务器,它只作为一个中介存在,不负责管理任何域名,来自客户端的任何查询都是通过上游DNS服务器返回结果。
关于recursion选项
recursion选项决定服务器是否可以进行递归查询,如果只作为dns缓存服务器,这个选项必须是yes。
具体请参考:递归和迭代
通过root DNS服务器查询
bind软件包安装好后,它的默认配置就是一台缓存服务器;任何来自客户端的查询它都是通过root zone查询,把结果保存到缓存中,然后返回给客户端:
1 2 3 4 |
zone "." IN { type hint; file "named.ca"; }; |
上面的配置默认已经在/etc/named.conf配置文件中,named.ca则是/var/named/目录下的一个文件,它保存了全球的根dns服务器的13个ip地址。
指定DNS解析服务器
通过/etc/named.conf配置文件中的forward和forwarders(转发器),可以指定由谁解析域名。当文件中配置好转发器,那么我们甚至连根域都不需要(. zone)
下面是关于转发器的配置:
1 2 3 4 5 6 7 8 |
options{ //省略部分设置 forward only; forwarders{ 114.114.114.114; 8.8.8.8; }; } |
当客户端查询的时候,所有的任务都会转发给114,当114失效,那么把查询转发给谷歌的DNS服务器。
搭建权威DNS服务器
环境需求:
一台提供web服务的服务器,ip地址为192.168.88.133;
一台DNS服务器, ip地址为192.168.122.91
要创建权威DNS服务器,首先需要把recursion选项设置为no。
添加域名区域(zone)
以sharpcode.cn为例子, 在配置文件中添加该域名的zone:
1 2 3 4 |
zone "sharpcode.cn" { type master; file "named.sharpcode.cn"; }; |
上面是最简单的zone配置,添加完zone之后就要配置zone file
编写zone file
由于前面的/etc/named.conf文件中的工作目录是/var/named/,因此我们要把zone file放到/var/named目录下面。
zone file中包含的是资源记录(resource records),必须要的资源记录如下:
- SOA记录: 主服务器和从服务器的同步规则
- NS记录:指向域名解析服务器
- A记录:NS记录对应的IP地址/其他要管理的主机地址
下面是基本的zone file实例(正向解析):
1 2 3 4 5 6 7 8 9 |
$TTL 1d @ IN SOA master.sharpcode.cn. root.sharpcode.cn. ( 1 12h 6h 1w 1h ) @ IN NS master.sharpcode.cn. #指定sharpcode.cn由master.sharpcode.cn解析 master.sharpcode.cn. IN A 192.168.122.91 #NS服务器的ip地址 www.sharpcode.cn. IN A 192.168.88.133 #其他主机的ip地址 rsyslog.sharpcode.cn. IN CNAME www.sharpcode.cn. |
$TTL指令:用于设置该区域的DNS缓存时间
@符号:指代zone的名称,这里的zone名称为sharpcode.cn,那么@就是sharpcode.cn
需要注意的是,在资源记录里面使用域名的时候,域名后面有一个点(.),这个点表示域名是一个完全限定名称,如果遗漏了这个点,就会造成不必要的问题。
测试服务器
编写好zone file,记得重启named服务。之后就可以测试我们的DNS服务器是否工作正常。
使用dig命令可以完成测试过程,如果系统中没有dig工具,使用下面的命令安装:
1 |
yum install -y bind-utils |
安装好后就可以进行测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[root@vmcentos7 named]# dig www.sharpcode.cn @127.0.0.1 ; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> www.sharpcode.cn @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39123 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.sharpcode.cn. IN A ;; ANSWER SECTION: www.sharpcode.cn. 86400 IN A 192.168.88.133 ;; AUTHORITY SECTION: sharpcode.cn. 86400 IN NS master.sharpcode.cn. ;; ADDITIONAL SECTION: master.sharpcode.cn. 86400 IN A 192.168.122.91 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed Apr 11 15:31:02 CST 2018 ;; MSG SIZE rcvd: 98 |
返回的结果和我们的zone file中的一致,说明DNS服务器工作正常。
请注意:我们的主配置文件中监听的ip地址是127.0.0.1,即它不能向外提供服务,如果要对局域网的其他电脑提供DNS服务,需要对/etc/named.conf作如下修改:
1 |
listen-on port 53 { 127.0.0.1; 192.168.122.91; }; |
添加对外的网卡地址即可。
zone file简写
我们在定义zone的时候是这样做的:
1 2 3 4 |
zone "sharpcode.cn" { type master; file "named.sharpcode.cn"; }; |
zone后面已经给出了名称,那么在named.sharpcode.cn就可以使用简写,例如:
1 2 3 4 5 6 7 8 |
$TTL 1d @ IN SOA master root ( 1 12h 6h 1w 1h ) @ IN NS master master IN A 192.168.122.91 www IN A 192.168.88.133 rsyslog IN CNAME www |
更改zone file后,重启named服务,测试发现服务器工作正常。可见,任何使用完全限定名称的地方都可以更改为简写。
在使用简写的时候域名后面一定不能有点(.),这样简写的域名会自动和zone定义的名称合并为完全限定名称;前面我们说过完全限定名称一定不能忘记这个点,否则就会当简写处理,这样域名就会合并为:www.sharpcode.cn.sharpcode.cn。
反向解析
反向解析zone的名称定义有点不一样,反解zone的名称格式为:ip地址的反向书写加上后缀.in-addr.arpa
。
例如:
1 2 3 4 |
zone "168.192.in-addr.arpa" { type master; file "named.168.192"; }; |
编写zone file
除了把A记录替换为PTR记录外,其他的基本差不多;由于反向解析是倒过来查询,从ip地址寻找域名,因此zone file里面的资源记录也要倒过来写:ip地址在前,域名在后。
1 2 3 4 5 6 7 |
$TTL 1d @ IN SOA master.sharpcode.cn. root.sharpcode.cn. ( 1 12h 6h 1w 1h ) @ IN NS master.sharpcode.cn. 91.122 IN PTR master.sharpcode.cn. 88.133 IN PTR www.sharpcode.cn. |
重启named服务,然后测试效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[root@vmcentos7 named]# dig -x 192.168.133.88 @127.0.0.1 ; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> -x 192.168.133.88 @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14647 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;88.133.168.192.in-addr.arpa. IN PTR ;; ANSWER SECTION: 88.133.168.192.in-addr.arpa. 86400 IN PTR www.sharpcode.cn. ;; AUTHORITY SECTION: 168.192.in-addr.arpa. 86400 IN NS master.sharpcode.cn. ;; ADDITIONAL SECTION: master.sharpcode.cn. 86400 IN A 192.168.122.91 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed Apr 11 16:22:57 CST 2018 ;; MSG SIZE rcvd: 123 |
成功查询到域名,说明反向解析正确配置。
主从DNS服务器配置
为了提供稳定的DNS服务,一般都提供两台电脑,一台主,另一台则在主服务器无法提供服务的情况下接替主服务器的工作,称为从服务器。
从服务负责向主服务器发送同步请求,如果主服务器的SOA记录中的serial id比从服务器大,则说明从服务器需要从主服务器拉取更新资料。
练习环境:
192.168.164.128为主服务器
192.168.122.114为从服务器
配置主服务器
主服务器的配置基本上可以不动,默认我们在zone定义的时候就已经设定它是主服务器,这是通过master关键字限定的。
1 2 3 4 |
zone "sharpcode.cn" { type master; file "named.sharpcode.cn"; }; |
但是,这样有一个安全问题,就是任何知道这个服务器地址的人都可以传输它的资料。如果只希望受信任的主机可以同步数据,可以使用allow-transfer
设置:
1 2 3 4 5 |
zone "sharpcode.cn" { type master; file "named.sharpcode.cn"; allow-transfer {192.168.122.114; }; }; |
列表中可以是单个ip地址,也可以是多个地址,或者是一个ip网段。
注意:/etc/named.conf中的listen-on默认只监听127.0.0.1
ip地址,根据自己的需要添加更多的监听ip地址。到此,主服务器配置完毕,最后一步是重启named服务。
配置从服务器
从服务器的配置也是非常简单的,只需要把从服务器的type设置为slave,并把主服务器的地址添加到zone定义中。
1 2 3 4 5 |
zone "sharpcode.cn" { type slave; #从服务器类型为slave file "slaves/backup.sharpcode.cn"; masters {192.168.164.128; }; #主服务器的地址 }; |
file字段指定同步的数据将保存到/var/named/slaves/backup.sharpcode.cn文件中,这个文件可以不存在,它是在同步的时候自动创建的。
从bind9.9版本开始,传输的数据类型为raw,我们是无法像普通文本一样查看它的内容,如果希望数据以text方式传输,可以通过masterfile-format
设置:
1 2 3 4 5 6 |
zone "sharpcode.cn" { type slave; file "slaves/backup.sharpcode.cn"; masters {192.168.164.128; }; masterfile-format text; #以普通文本类型传输 }; |
到这一步,从服务器也配置完毕,重启named服务,没有错误的话,就可以看到/var/named/slaves目录下看到这些传输过来的文件:
1 2 |
[centos7-server ~]# ls /var/named/slaves/ backup.168.192 backup.sharpcode.cn |
添加slave服务器的Resource record
虽然数据可以在主从服务器之间传输,但是这个时候从服务器还是不能为我们解析域名的,原因是master的zone file里面还没有对从服务器的资源记录进行设置。因此,从服务器要正常工作,还必须添加相应的资源记录:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$TTL 1d @ IN SOA master.sharpcode.cn. root.sharpcode.cn. ( 2 12h 6h 2d 1d ) @ IN NS master.sharpcode.cn. @ IN NS slave.sharpcode.cn. #这是新添加的内容 master.sharpcode.cn. IN A 192.168.164.128 slave.sharpcode.cn. IN A 192.168.122.114 #这是新添加的内容 www.sharpcode.cn. IN A 192.168.164.128 |
添加之后,从服务器在下一次同步的时候就可以正常提供域名解析服务了。
反向解析的设置和正向解析的设置基本一样,不再详细说明。
动态域名服务(DDNS)
动态域名服务可以把一个动态ip和域名绑定起来,不管主机ip如何改变,我们都可以通过这个域名访问主机。常见的DDNS服务提供商有花生壳(oray)。
搭建DDNS域名的前提是你必须拥有该域名的权威DNS服务器的完全管理权限,即类似ISP的最高权限。对于域名sharpcode.cn而言,它的权威服务器是百度云加速的域名服务器,我们没有管理权限,因此不能使用它来搭建DDNS服务。我们可以向域名提供商申请注册域名的DNS,注册后就拥有该域名的权威服务器管理权。
DDNS原理
先看一下图片
只有两个步骤,似乎很简单,其实也的却是简单,接下来是具体搭建步骤。
服务器端设置
通过上面的图片服务器端提供了两个功能,第一个是开放权限,这一步通过/etc/named.conf的update-policy选项设置,第二个是提供密匙,使用dnssec-keygen生成密匙。
1. 开放权限:
假设我们需要绑定的域名是www.sharpcode.cn,那么主机名称就是www,在named.conf中应该作如下修改:
1 2 3 4 5 6 7 |
zone "sharpcode.cn" IN { type master; file "named.sharpcode.cn"; update-policy { grant www name www.sharpcode.cn. A; }; }; |
在zone里面添加了update-policy选项及相关设置:意思是允许用户更新www主机的A记录。
2. 提供密匙:
密匙通过dnssec-keygen生成,生成的时候需要提供加密方式和长度,并设置允许客户端更新的类型
1 2 |
[centos7-server named]# dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST www Kwww.+165+29526 |
生面生成的密匙可用于访问nametype类型为HOST(主机),名称为www的主机。
查看生成的密匙:
1 2 3 4 5 6 |
[centos7-server named]# pwd /etc/named [centos7-server named]# ls Kwww.+165+29526.key Kwww.+165+29526.private [centos7-server named]# cat Kwww.+165+29526.key www. IN KEY 512 3 165 25LIYL8dXlJm19OUPJpS9sGdx8Dhyp6L7SixVLhaSTktuBHjaKlo5aaf hzXeOcvm0DPo7KwQ4xYbr/7/0z4ZNA== |
Kwww.+165+29526.key是公钥,里面的加密字符串在/etc/named.conf中需要用到。
在生成密匙的时候有可能会出现错误,例如:
1 2 |
[centos7-server named]# dnssec-keygen -a RSASHA1 -b 1024 -n HOST www dnssec-keygen: fatal: invalid DNSKEY nametype HOST |
原因是不是所有的加密方法都适用于某个nametype。
nametype的种类有:ZONE、HOST、ENTITY、USER、OTHER,而密匙类型有两种,它们是KEY和DNSKEY,nametype对应可用的密匙种类如下:
- ZONE:KEY和DNSKEY两者都可用
- HOST/ENTITY/USER:只能使用KEY
- OTHER:只能使用DNSKEY
不同的加密方法对应不同的密匙类型:
属于DNSKEY的有:RSAMD5、RSASHA1、DSA、NSEC3RSASHA1、NSEC3DSA、RSASHA256、RSASHA512、ECCGOST、ECDSAP256SHA256、ECDSAP384SHA384
属于KEY的有:DH(Diffie Hellman)、HMAC-MD5、HMAC-SHA1、HMAC-SHA224、HMAC-SHA256、HMAC-SHA384、HMAC-SHA512
对于上面的错误,我们选择的加密方法是RSASHA1,它对应的密匙类型是DNSKEY,而我们设置的nametype类型为HOST,它只能使用KEY密匙,因此密匙创建失败。如果希望使用RSASHA1来为HOST创建密匙,那么就要使用-T参数强制生成的密匙类型为KEY,(-T在旧版本的bind中对应的参数为-k)。
1 |
[centos7-server named]# dnssec-keygen -a RSASHA1 -b 1024 -n HOST -T KEY www |
虽然是可以生成key了,但千万不要这样做,原因是/etc/named.conf中key定义代码块中只支持属于KEY的加密算法,如果使用DNSKEY中的加密算法,会导致named服务无法启动,使用journalctl -xe命令查看,错误是unknown algorithm ‘RSASHA1’。
3. 使用密匙
有两个地方需要使用密匙,一个是客户端,因此要将服务器生成的密匙保存一份到客户端;另一个地方是/etc/named.conf。
配置named.conf:
在/etc/named.conf添加下面的内容
1 2 3 4 |
key { algorithm HMAC-SHA512; #不支持DNSKEY的算法,所以千万不能填写属于DNSKEY的加密算法 secret "25LIYL8dXlJm19OUPJpS9sGdx8Dhyp6L7SixVLhaSTktuBHjaKlo5aaf hzXeOcvm0DPo7KwQ4xYbr/7/0z4ZNA=="; }; |
secret后面的字符串是上面使用dnssec-keygen生成的公钥内容。
把密匙保存到客户端:
可以使用scp把密匙复制到客户端,也可以通过sftp,能用即可。
1 2 3 4 |
[centos7-server named]# scp * root@192.168.122.91:/usr/local/ddns root@192.168.122.91's password: Kwww.+165+29526.key 100% 112 88.1KB/s 00:00 Kwww.+165+29526.private 100% 232 302.4KB/s 00:00 |
客户端设置
只需要有服务器端生成的密匙,客户端就可以通过nsupdate命令通知服务器更新资料。
1 2 3 4 5 6 7 8 9 10 |
[root@vmcentos7 ddns]# pwd /usr/local/ddns [root@vmcentos7 ddns]# ls Kwww.+165+29526.key Kwww.+165+29526.private [root@vmcentos7 ddns]# nsupdate -k Kwww.+165+29526.key > server 192.168.88.133 > update delete www.sharpcode.cn A > update add www.sharpcode.cn 300 A 192.168.122.20 > send > |
如果没有提示任何错误,就可以使用Ctrl+D组合键退出。当服务器接收到动态更新时,会在/var/named/目录下生成一个日志文件,文件以jnl结尾。这个时候观察zone file,发现它并没有被更新,不过不要担心,因为更新会立即在内存中的zone file副本中生效,服务器会等待指定的时间(通常以小时计算)之后,才将内存中的整个zone file写进磁盘。
在旧的bind版本中,jnl日志的文件以普通的文本形式呈现,但是bind9中并不是,因此jnl文件在bind9中并没有可读性。
DDNS和SOA记录
当名称服务器处理动态更新时,服务器会自动更新zone file中SOA记录的序号,以便通知slave服务器进行更新。在bind9中,服务器每处理一条动态更新就会增加一次序号,在bind9之前的版本中则会有时间延迟。
转载请注明:Pure nonsense » 使用CentOS7搭建DNS服务器