« 上一篇下一篇 »

用BIND软件在Linux系统下构建DNS域名服务器

BIND概念

   Bind是一款开放源码的DNS服务器软件,Bind由美国加州大学Berkeley分校开发和维护的,全名为Berkeley Internet Name Domain它是目前世界上使用最为广泛的DNS服务器软件,支持各种unix平台和windows平台。根据所管理的区域,DNS系统可以分为不同的类型。在同一台DNS服务器中,相对不同的区域,也拥有不同的身份,有以下几种常见分类:

缓存域名服务器:只提供域名解析结果的缓存功能,目的在于提高查询速度和效率,但没有自己控制区域的地址和数据,必须指定根域或其他DNS服务器作为解析来源。

主域名服务器:维护某个特定的DNS区域的地址数据库,对其中的解析记录具有自主控制权,是指定区域中唯一的权威服务器、官方服务器,需要自行建立所负责区域的地址数据文件。

从域名服务器:与主域名服务器提供完全相同的DNS解析服务,通常用于DNS服务器的热备份。

 

一.安装BIND软件

   BIND可以运行在大多数Linux/Unix主机中,是应用最广泛的DNS服务程序,在RHEL6.5中,系统光盘自带了BIND服务的安装文件

各软件包的主要作用:

bind:提供了域名服务的主要程序及相关文件

bind-utils:提供了对DNS服务器的测试工具,如nslookup等

bind-libs:提供了bind、bind-utils需要使用的函数库

bind-chroot:提供了一个伪装的根目录(将/var/named/chroot/文件夹作为BIND的根目录),提高安全性

  默认已安装bind-utils和bind-libs

插入系统光盘,挂载,安装完毕后,会自动增加一个名为named的系统服务:

   # mount  /dev/cdrom  /media/                          

   # rpm -ivh /media/Packages/bind-9.8.2* * * .rpm       

   # rpm -ivh /media/Packages/bind-chroot-9.8.2* * * .rpm

   # service  named  start                               

域名解析服务Bind的程序名称叫做named,服务程序的配置文件如下:

主程序/usr/sbin/named
主配置文件/etc/named.conf
区域配置文件/etc/named.rfc1912.zones
二、编辑主配置文件:

  [root@Centos ~]# vim /etc/named.conf

11#listen-on port 53 { 127.0.0.1; };//127.0.0.1修改为any,代表允许监听任何IP地址。

12 listen-on port 53 { any; };
18 #allow-query { localhost; };localhost修改为any,代表允许任何主机查询。
19 allow-query { any; };
正向解析:

在DNS域名解析服务中,正向解析是指根据域名(主机名)查找到对应的IP地址。也就是说,当用户输入了一个域名后,bind服务程序会自动进行查找,并将匹配到的IP地址返给用户。这也是最常用的DNS工作模式。

第1步:编辑区域配置文件。该文件中默认已经有了一些无关紧要的解析参数,旨在让用户有一个参考。我们可以将下面的参数添加到区域配置文件的最下面,当然,也可以将该文件中的原有信息全部清空,而只保留自己的域名解析信息:

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type master;
file "linuxprobe.com.zone";
allow-update {none;};
};

第2步:编辑数据配置文件。我们可以从/var/named目录中复制一份正向解析的模板文件(named.localhost),然后把域名和IP地址的对应数据填写数据配置文件中并保存。在复制时记得加上-a参数,这可以保留原始文件的所有者、所属组、权限属性等信息,以便让bind服务程序顺利读取文件内容:

[root@linuxprobe ~]# cd /var/named/
[root@linuxprobe named]# ls -al named.localhost
-rw-r-----. 1 root named 152 Jun 21 2007 named.localhost
[root@linuxprobe named]# cp -a named.localhost linuxprobe.com.zone

编辑数据配置文件。在保存并退出后文件后记得重启named服务程序,让新的解析数据生效。考虑到正向解析文件中的参数较多,而且相对都比较重要,刘遄老师在每个参数后面都作了简要的说明。

[root@linuxprobe named]# vim linuxprobe.com.zone
[root@linuxprobe named]# systemctl restart named

 

第3步:检验解析结果。为了检验解析结果,一定要先把Linux系统网卡中的DNS地址参数修改成本机IP地址,这样就可以使用由本机提供的DNS查询服务了。nslookup命令用于检测能否从DNS服务器中查询到域名与IP地址的解析记录,进而更准确地检验DNS服务器是否已经能够为用户提供服务。

[root@linuxprobe ~]# systemctl restart network
[root@linuxprobe ~]# nslookup
> www.linuxprobe.comServer: 127.0.0.1
Address: 127.0.0.1#53
Name: www.linuxprobe.com
Address: 192.168.10.10
> bbs.linuxprobe.comServer: 127.0.0.1
Address: 127.0.0.1#53
Name: bbs.linuxprobe.com
Address: 192.168.10.20
13.2.2 反向解析实验

在DNS域名解析服务中,反向解析的作用是将用户提交的IP地址解析为对应的域名信息,它一般用于对某个IP地址上绑定的所有域名进行整体屏蔽,屏蔽由某些域名发送的垃圾邮件。它也可以针对某个IP地址进行反向解析,大致判断出有多少个网站运行在上面。当购买虚拟主机时,可以使用这一功能验证虚拟主机提供商是否有严重的超售问题。

第1步:编辑区域配置文件。在编辑该文件时,除了不要写错格式之外,还需要记住此处定义的数据配置文件名称,因为一会儿还需要在/var/named目录中建立与其对应的同名文件。反向解析是把IP地址解析成域名格式,因此在定义zone(区域)时应该要把IP地址反写,比如原来是192.168.10.0,反写后应该就是10.168.192,而且只需写出IP地址的网络位即可。把下列参数添加至正向解析参数的后面。

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type master;
file "linuxprobe.com.zone";
allow-update {none;};
};
zone "10.168.192.in-addr.arpa" IN {
type master;
file "192.168.10.arpa";
};

第2步:编辑数据配置文件。首先从/var/named目录中复制一份反向解析的模板文件(named.loopback),然后把下面的参数填写到文件中。其中,IP地址仅需要写主机位,如图13-5所示。

[root@linuxprobe named]# cp -a named.loopback 192.168.10.arpa
[root@linuxprobe named]# vim 192.168.10.arpa
[root@linuxprobe named]# systemctl restart named

 

第3步:检验解析结果。在前面的正向解析实验中,已经把系统网卡中的DNS地址参数修改成了本机IP地址,因此可以直接使用nslookup命令来检验解析结果,仅需输入IP地址即可查询到对应的域名信息。

[root@linuxprobe ~]# nslookup
> 192.168.10.10Server: 127.0.0.1
Address: 127.0.0.1#53
10.10.168.192.in-addr.arpa name = ns.linuxprobe.com.
10.10.168.192.in-addr.arpa name = www.linuxprobe.com.
10.10.168.192.in-addr.arpa name = mail.linuxprobe.com.
> 192.168.10.20Server: 127.0.0.1
Address: 127.0.0.1#53
20.10.168.192.in-addr.arpa name = bbs.linuxprobe.com.
13.3 部署从服务器

作为重要的互联网基础设施服务,保证DNS域名解析服务的正常运转至关重要,只有这样才能提供稳定、快速且不间断的域名查询服务。在DNS域名解析服务中,从服务器可以从主服务器上获取指定的区域数据文件,从而起到备份解析记录与负载均衡的作用,因此通过部署从服务器可以减轻主服务器的负载压力,还可以提升用户的查询效率。

在本实验中,主服务器与从服务器分别使用的操作系统和IP地址如表13-2所示。

表13-2                     主服务器与从服务器分别使用的操作系统与IP地址信息

 

第1步:在主服务器的区域配置文件中允许该从服务器的更新请求,即修改allow-update {允许更新区域信息的主机地址;};参数,然后重启主服务器的DNS服务程序。

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type master;
file "linuxprobe.com.zone";
allow-update { 192.168.10.20; };
};
zone "10.168.192.in-addr.arpa" IN {
type master;
file "192.168.10.arpa";
allow-update { 192.168.10.20; };
};
[root@linuxprobe ~]# systemctl restart named

第2步:在从服务器中填写主服务器的IP地址与要抓取的区域信息,然后重启服务。注意此时的服务类型应该是slave(从),而不再是master(主)。masters参数后面应该为主服务器的IP地址,而且file参数后面定义的是同步数据配置文件后要保存到的位置,稍后可以在该目录内看到同步的文件。

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type slave;
masters { 192.168.10.10; };
file "slaves/linuxprobe.com.zone";
};
zone "10.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.10.10; };
file "slaves/192.168.10.arpa";
};
[root@linuxprobe ~]# systemctl restart named

第3步:检验解析结果。当从服务器的DNS服务程序在重启后,一般就已经自动从主服务器上同步了数据配置文件,而且该文件默认会放置在区域配置文件中所定义的目录位置中。随后修改从服务器的网络参数,把DNS地址参数修改成192.168.10.20,这样即可使用从服务器自身提供的DNS域名解析服务。最后就可以使用nslookup命令顺利看到解析结果了。

[root@linuxprobe ~]# cd /var/named/slaves
[root@linuxprobe slaves]# ls 
192.168.10.arpa linuxprobe.com.zone
[root@linuxprobe slaves]# nslookup
> www.linuxprobe.comServer: 192.168.10.20
Address: 192.168.10.20#53
Name: www.linuxprobe.com
Address: 192.168.10.10
> 192.168.10.10Server: 192.168.10.20
Address: 192.168.10.20#53
10.10.168.192.in-addr.arpa name = www.linuxprobe.com.
10.10.168.192.in-addr.arpa name = ns.linuxprobe.com.
10.10.168.192.in-addr.arpa name = mail.linuxprobe.com.
13.4 安全的加密传输

前文反复提及,域名解析服务是互联网基础设施中重要的一环,几乎所有的网络应用都依赖于DNS才能正常运行。如果DNS服务发生故障,那么即便Web网站或电子邮件系统服务等都正常运行,用户也无法找到并使用它们了。

互联网中的绝大多数DNS服务器(超过95%)都是基于BIND域名解析服务搭建的,而bind服务程序为了提供安全的解析服务,已经对TSIG(RFC 2845)加密机制提供了支持。TSIG主要是利用了密码编码的方式来保护区域信息的传输(Zone Transfer),即TSIG加密机制保证了DNS服务器之间传输域名区域信息的安全性。

接下来的实验依然使用了表13-2中的两台服务器。

书接上回。前面在从服务器上配妥bind服务程序并重启后,即可看到从主服务器中获取到的数据配置文件。

 

[root@linuxprobe ~]# ls -al /var/named/slaves/
total 12
drwxrwx---. 2 named named 54 Jun 7 16:02 .
drwxr-x---. 6 root named 4096 Jun 7 15:58 ..
-rw-r--r--. 1 named named 432 Jun 7 16:02 192.168.10.arpa
-rw-r--r--. 1 named named 439 Jun 7 16:02 linuxprobe.com.zone
[root@linuxprobe ~]# rm -rf /var/named/slaves/*

第1步:在主服务器中生成密钥。dnssec-keygen命令用于生成安全的DNS服务密钥,其格式为“dnssec-keygen [参数]”,常用的参数以及作用如表13-3所示。

表13-3                                        dnssec-keygen命令的常用参数

 

使用下述命令生成一个主机名称为master-slave的128位HMAC-MD5算法的密钥文件。在执行该命令后默认会在当前目录中生成公钥和私钥文件,我们需要把私钥文件中Key参数后面的值记录下来,一会儿要将其写入传输配置文件中。

[root@linuxprobe ~]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave
Kmaster-slave.+157+46845
[root@linuxprobe ~]# ls -al Kmaster-slave.+157+46845.*
-rw-------. 1 root root 56 Jun 7 16:06 Kmaster-slave.+157+46845.key
-rw-------. 1 root root 165 Jun 7 16:06 Kmaster-slave.+157+46845.private
[root@linuxprobe ~]# cat Kmaster-slave.+157+46845.private
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)Key: 1XEEL3tG5DNLOw+1WHfE3Q==Bits: AAA=
Created: 20170607080621
Publish: 20170607080621
Activate: 20170607080621

第2步:在主服务器中创建密钥验证文件。进入bind服务程序用于保存配置文件的目录,把刚刚生成的密钥名称、加密算法和私钥加密字符串按照下面格式写入到tansfer.key传输配置文件中。为了安全起见,我们需要将文件的所属组修改成named,并将文件权限设置得要小一点,然后把该文件做一个硬链接到/etc目录中。

[root@linuxprobe ~]# cd /var/named/chroot/etc/
[root@linuxprobe etc]# vim transfer.key
key "master-slave" {
algorithm hmac-md5;
secret "1XEEL3tG5DNLOw+1WHfE3Q==";
};
[root@linuxprobe etc]# chown root:named transfer.key
[root@linuxprobe etc]# chmod 640 transfer.key
[root@linuxprobe etc]# ln transfer.key /etc/transfer.key

第3步:开启并加载Bind服务的密钥验证功能。首先需要在主服务器的主配置文件中加载密钥验证文件,然后进行设置,使得只允许带有master-slave密钥认证的DNS服务器同步数据配置文件:

[root@linuxprobe ~]# vim /etc/named.conf
 1 //
 2 // named.conf
 3 //
 4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
 5 // server as a caching only nameserver (as a localhost DNS resolver only).
 6 //
 7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
 8 //
 9 include "/etc/transfer.key";
 10 options {
 11 listen-on port 53 { any; };
 12 listen-on-v6 port 53 { ::1; };
 13 directory "/var/named";
 14 dump-file "/var/named/data/cache_dump.db";
 15 statistics-file "/var/named/data/named_stats.txt";
 16 memstatistics-file "/var/named/data/named_mem_stats.txt";
 17 allow-query { any; };
 18 allow-transfer { key master-slave; };………………省略部分输出信息………………
[root@linuxprobe ~]# systemctl restart named

至此,DNS主服务器的TSIG密钥加密传输功能就已经配置完成。此时清空DNS从服务器同步目录中所有的数据配置文件,然后再次重启bind服务程序,这时就已经不能像刚才那样自动获取到数据配置文件了。

[root@linuxprobe ~]# rm -rf /var/named/slaves/*
[root@linuxprobe ~]# systemctl restart named
[root@linuxprobe ~]# ls  /var/named/slaves/

第4步:配置从服务器,使其支持密钥验证。配置DNS从服务器和主服务器的方法大致相同,都需要在bind服务程序的配置文件目录中创建密钥认证文件,并设置相应的权限,然后把该文件做一个硬链接到/etc目录中。

[root@linuxprobe ~]# cd /var/named/chroot/etc
[root@linuxprobe etc]# vim transfer.key
key "master-slave" {
algorithm hmac-md5;
secret "1XEEL3tG5DNLOw+1WHfE3Q==";
};
[root@linuxprobe etc]# chown root:named transfer.key
[root@linuxprobe etc]# chmod 640 transfer.key
[root@linuxprobe etc]# ln transfer.key /etc/transfer.key

第5步:开启并加载从服务器的密钥验证功能。这一步的操作步骤也同样是在主配置文件中加载密钥认证文件,然后按照指定格式写上主服务器的IP地址和密钥名称。注意,密钥名称等参数位置不要太靠前,大约在第43行比较合适,否则bind服务程序会因为没有加载完预设参数而报错:

[root@linuxprobe etc]# vim /etc/named.conf
 1 //
 2 // named.conf
 3 //
 4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
 5 // server as a caching only nameserver (as a localhost DNS resolver only).
 6 //
 7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
 8 //
 9 include "/etc/transfer.key";
 10 options {
 11 listen-on port 53 { 127.0.0.1; };
 12 listen-on-v6 port 53 { ::1; };
 13 directory "/var/named";
 14 dump-file "/var/named/data/cache_dump.db";
 15 statistics-file "/var/named/data/named_stats.txt";
 16 memstatistics-file "/var/named/data/named_mem_stats.txt";
 17 allow-query { localhost; };
 18 
 19 /* 
 20 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
 21 - If you are building a RECURSIVE (caching) DNS server, you need to enable 
 22 recursion. 
 23 - If your recursive DNS server has a public IP address, you MUST enable access 
 24 control to limit queries to your legitimate users. Failing to do so will
 25 cause your server to become part of large scale DNS amplification 
 26 attacks. Implementing BCP38 within your network would greatly
 27 reduce such attack surface 
 28 */
 29 recursion yes;
 30 
 31 dnssec-enable yes;
 32 dnssec-validation yes;
 33 dnssec-lookaside auto;
 34 
 35 /* Path to ISC DLV key */
 36 bindkeys-file "/etc/named.iscdlv.key";
 37 
 38 managed-keys-directory "/var/named/dynamic";
 39 
 40 pid-file "/run/named/named.pid";
 41 session-keyfile "/run/named/session.key";
 42 };
 43 server 192.168.10.10
 44 {
 45 keys { master-slave; };
 46 }; 
 47 logging {
 48 channel default_debug {
 49 file "data/named.run";
 50 severity dynamic;
 51 };
 52 };
 53 
 54 zone "." IN {
 55 type hint;
 56 file "named.ca";
 57 };
 58 
 59 include "/etc/named.rfc1912.zones";
 60 include "/etc/named.root.key";
 61

第6步:DNS从服务器同步域名区域数据。现在,两台服务器的bind服务程序都已经配置妥当,并匹配到了相同的密钥认证文件。接下来在从服务器上重启bind服务程序,可以发现又能顺利地同步到数据配置文件了。

[root@linuxprobe ~]# systemctl restart named
[root@linuxprobe ~]# ls /var/named/slaves/
 192.168.10.arpa  linuxprobe.com.zone

出现问题?大胆提问!

因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

Linux技术交流请加A群:560843(满),B群:340829(推荐),C群:463590(推荐),点此查看全国群。

*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。

小结:

对于一个互联网企业来说,搭建一个公司内部的DNS服务器是很有必要的,一来可以通过公司内网的DNS缓存提高公司内部的DNS解析效率,二来域名服务商提供的解析服务并不可靠,为了安全起见,自己搭建(当然也有不错的第三方DNS解析服务,如DNSpod,但需要收费),三来公司内部有一些服务在内网需要解析成内网IP,对于公网的用户访问就需要访问公网的IP,这样可以通过DNS配置轻松实现,当然还有其他很多实现方式。