使用CentOS7搭建DNS服务器

Linux ginotang 3242℃ 0评论

bind软件

目前dns的行业标准是bind软件,现今所有操作系统都是使用bind提供dns服务。在CentOS中它的名称就是bind,而Ubuntu中则是bind9。

安装bind

通过下面的命令安装bind软件包

bind的daemon进程为named,可以使用下面的命令检查bind是否安装成功

命令输出显示named进程已经存在,但服务还没有启动;可以使用下面的命令启动并允许named开机自动运行:

现在named已经启动。

主配置文件

bind的主配置文件是/etc/named.conf,它的主要内容大致有:

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查询,把结果保存到缓存中,然后返回给客户端:

上面的配置默认已经在/etc/named.conf配置文件中,named.ca则是/var/named/目录下的一个文件,它保存了全球的根dns服务器的13个ip地址。

指定DNS解析服务器

通过/etc/named.conf配置文件中的forward和forwarders(转发器),可以指定由谁解析域名。当文件中配置好转发器,那么我们甚至连根域都不需要(. zone)

下面是关于转发器的配置:

当客户端查询的时候,所有的任务都会转发给114,当114失效,那么把查询转发给谷歌的DNS服务器。

搭建权威DNS服务器

环境需求:

一台提供web服务的服务器,ip地址为192.168.88.133;

一台DNS服务器, ip地址为192.168.122.91

要创建权威DNS服务器,首先需要把recursion选项设置为no。

添加域名区域(zone)

以sharpcode.cn为例子, 在配置文件中添加该域名的zone:

上面是最简单的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实例(正向解析):

$TTL指令:用于设置该区域的DNS缓存时间

@符号:指代zone的名称,这里的zone名称为sharpcode.cn,那么@就是sharpcode.cn

需要注意的是,在资源记录里面使用域名的时候,域名后面有一个点(.),这个点表示域名是一个完全限定名称,如果遗漏了这个点,就会造成不必要的问题。

测试服务器

编写好zone file,记得重启named服务。之后就可以测试我们的DNS服务器是否工作正常。

使用dig命令可以完成测试过程,如果系统中没有dig工具,使用下面的命令安装:

安装好后就可以进行测试:

返回的结果和我们的zone file中的一致,说明DNS服务器工作正常。

请注意:我们的主配置文件中监听的ip地址是127.0.0.1,即它不能向外提供服务,如果要对局域网的其他电脑提供DNS服务,需要对/etc/named.conf作如下修改:

添加对外的网卡地址即可。

zone file简写

我们在定义zone的时候是这样做的:

zone后面已经给出了名称,那么在named.sharpcode.cn就可以使用简写,例如:

更改zone file后,重启named服务,测试发现服务器工作正常。可见,任何使用完全限定名称的地方都可以更改为简写。

在使用简写的时候域名后面一定不能有点(.),这样简写的域名会自动和zone定义的名称合并为完全限定名称;前面我们说过完全限定名称一定不能忘记这个点,否则就会当简写处理,这样域名就会合并为:www.sharpcode.cn.sharpcode.cn。

反向解析

反向解析zone的名称定义有点不一样,反解zone的名称格式为:ip地址的反向书写加上后缀.in-addr.arpa

例如:

编写zone file

除了把A记录替换为PTR记录外,其他的基本差不多;由于反向解析是倒过来查询,从ip地址寻找域名,因此zone file里面的资源记录也要倒过来写:ip地址在前,域名在后。

重启named服务,然后测试效果:

成功查询到域名,说明反向解析正确配置。

主从DNS服务器配置

为了提供稳定的DNS服务,一般都提供两台电脑,一台主,另一台则在主服务器无法提供服务的情况下接替主服务器的工作,称为从服务器。

从服务负责向主服务器发送同步请求,如果主服务器的SOA记录中的serial id比从服务器大,则说明从服务器需要从主服务器拉取更新资料。

练习环境:

192.168.164.128为主服务器

192.168.122.114为从服务器

配置主服务器

主服务器的配置基本上可以不动,默认我们在zone定义的时候就已经设定它是主服务器,这是通过master关键字限定的。

但是,这样有一个安全问题,就是任何知道这个服务器地址的人都可以传输它的资料。如果只希望受信任的主机可以同步数据,可以使用allow-transfer设置:

列表中可以是单个ip地址,也可以是多个地址,或者是一个ip网段。

注意:/etc/named.conf中的listen-on默认只监听127.0.0.1 ip地址,根据自己的需要添加更多的监听ip地址。到此,主服务器配置完毕,最后一步是重启named服务。

配置从服务器

从服务器的配置也是非常简单的,只需要把从服务器的type设置为slave,并把主服务器的地址添加到zone定义中。

file字段指定同步的数据将保存到/var/named/slaves/backup.sharpcode.cn文件中,这个文件可以不存在,它是在同步的时候自动创建的。

从bind9.9版本开始,传输的数据类型为raw,我们是无法像普通文本一样查看它的内容,如果希望数据以text方式传输,可以通过masterfile-format设置:

到这一步,从服务器也配置完毕,重启named服务,没有错误的话,就可以看到/var/named/slaves目录下看到这些传输过来的文件:

添加slave服务器的Resource record

虽然数据可以在主从服务器之间传输,但是这个时候从服务器还是不能为我们解析域名的,原因是master的zone file里面还没有对从服务器的资源记录进行设置。因此,从服务器要正常工作,还必须添加相应的资源记录:

添加之后,从服务器在下一次同步的时候就可以正常提供域名解析服务了。

反向解析的设置和正向解析的设置基本一样,不再详细说明。

动态域名服务(DDNS)

动态域名服务可以把一个动态ip和域名绑定起来,不管主机ip如何改变,我们都可以通过这个域名访问主机。常见的DDNS服务提供商有花生壳(oray)。

搭建DDNS域名的前提是你必须拥有该域名的权威DNS服务器的完全管理权限,即类似ISP的最高权限。对于域名sharpcode.cn而言,它的权威服务器是百度云加速的域名服务器,我们没有管理权限,因此不能使用它来搭建DDNS服务。我们可以向域名提供商申请注册域名的DNS,注册后就拥有该域名的权威服务器管理权。

DDNS原理

先看一下图片

动态dns

只有两个步骤,似乎很简单,其实也的却是简单,接下来是具体搭建步骤。

服务器端设置

通过上面的图片服务器端提供了两个功能,第一个是开放权限,这一步通过/etc/named.conf的update-policy选项设置,第二个是提供密匙,使用dnssec-keygen生成密匙。

1. 开放权限:

假设我们需要绑定的域名是www.sharpcode.cn,那么主机名称就是www,在named.conf中应该作如下修改:

在zone里面添加了update-policy选项及相关设置:意思是允许用户更新www主机的A记录。

2. 提供密匙:

密匙通过dnssec-keygen生成,生成的时候需要提供加密方式和长度,并设置允许客户端更新的类型

生面生成的密匙可用于访问nametype类型为HOST(主机),名称为www的主机。

查看生成的密匙:

Kwww.+165+29526.key是公钥,里面的加密字符串在/etc/named.conf中需要用到。

在生成密匙的时候有可能会出现错误,例如:

原因是不是所有的加密方法都适用于某个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)。

虽然是可以生成key了,但千万不要这样做,原因是/etc/named.conf中key定义代码块中只支持属于KEY的加密算法,如果使用DNSKEY中的加密算法,会导致named服务无法启动,使用journalctl -xe命令查看,错误是unknown algorithm ‘RSASHA1’。

3. 使用密匙

有两个地方需要使用密匙,一个是客户端,因此要将服务器生成的密匙保存一份到客户端;另一个地方是/etc/named.conf。

配置named.conf:

在/etc/named.conf添加下面的内容

secret后面的字符串是上面使用dnssec-keygen生成的公钥内容。

把密匙保存到客户端:

可以使用scp把密匙复制到客户端,也可以通过sftp,能用即可。

客户端设置

只需要有服务器端生成的密匙,客户端就可以通过nsupdate命令通知服务器更新资料。

如果没有提示任何错误,就可以使用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服务器

喜欢 (1)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x