您的位置:首页 > 运维架构 > Linux

Linux运维实战之DNS(bind)服务器的安装与配置

2016-04-10 21:15 746 查看
转自/article/4515252.html

上次博文我们讨论了DNS的基础,本次博文我们重点来看看如何配置一台DNS服务器。

【本次博文的主要内容】

bind服务器简介(包括客户端工具dig的介绍)
配置正向解析DNS服务器
配置反向解析DNS服务器
配置辅助DNS服务器并在主辅之间实现区域传送

一、BIND服务器简介:
Bind是BerkeleyInternetNameDomainService的简写,它是一款实现DNS服务器的开放源码软件。Bind原本是美国DARPA资助伯克利大学(Berkeley)开设的一个研究生课题,后来经过多年的变化发展,已经成为世界上使用最为广泛的DNS服务器软件,目前Internet上半数以上的DNS服务器有都是用Bind来架设的。

【什么是“服务”及服务的特性】

1、什么是套接字:

套接字socket,简单来说就是IP:port(IP地址端口对)。以电话系统为例,电话的通话双方相当于相互通信的两个进程,区号是它的IP地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要使用一部电话,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方的区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接收连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话相当于关闭socket,撤销连接。

端口:

TCP:0~65535

UDP:0~65535

小于1024的端口为知名端口;Linux系统中0~1023的端口只有root用户有开放关闭的权利(服务都是以root用户身份启动,之后以一个系统用户的身份运行。)

例如:DNS服务监听在tcp的53号端口(DNS区域传送)和udp的53号端口,Web服务监听在TCP的80端口。

2、服务的特性:

运行于后台,处于监听(listen)状态

监听的原理:





如上图所示,

(1)当DNS服务端程序安装并启动之后,它首先通过socket()系统调用向内核注册使用一个套接字,并调用bind()系统调用将本地socket地址(包括本地主机地址和本地端口)与所创建的socket号联系起来。一旦注册成功,守护进程named就处于监听状态(即named进程处于阻塞状态,等待客户端的连接)。注意,服务器必须首先启动,直到它执行完socket()调用进入等待状态后,方能接受客户请求,假如客户机先启动,则connect()将返回出错代码,连接不成功。

(2)之后,DNS的请求报文发送到DNS的服务器的网卡上,而网卡是硬件,能够与硬件打交道的只有内核。内核内部的TCP/IP协议栈将请求报文解包查看其IP首部和TCP首部(即检查请求报文中的套接字是什么)。

(3)内核查看文件句柄fd(filedeiscriptor)数据库以确认是否有相关的应用程序进程注册了该套接字。如果有,则将请求报文发送给该进程。

Tips:以上是我对监听过程的简单理解,难免有错误之处,如发现错误还望指正哈!

3、DNS服务器类型:

缓存服务器:不负责解析,仅为加速,不需要注册
主DNS服务器:负责解析本地客户端请求
辅助DNS服务器:辅助服务器的区域数据都是从主服务器复制而来,其数据都是只读的

4、bind详解:

包名:bind

进程:named

协议:dns

使用端口:53(tcp,udp)

相关包:

bind-chroot:将named进程的活动范围限定在chroot目录,保证安全性。

bind-devel:与开发相关的头文件和库文件(编译安装bind时所需)

bind-libs:bind服务器端和客户端都使用到的公共库文件

bind-utils:bind客户端工具

程序文件:/usr/sbin/named

bind权限相关:

安装完named会自动创建用户named系统用户





Tips:早期Linux服务都是以root权限启动和运行的,随着技术的发展,各种服务变得越来越复杂,导致BUG和漏洞越来越多。黑客利用服务的漏洞入侵系统,能获得root级别的权限,从而控制整个系统。为了减缓这种攻击所带来的负面影响,现在服务器软件通常设计为以root权限启动,然后服务器进程自行放弃root,再以某个低权限的系统账号(named)来运行进程。这种方式的好处在于该服务被攻击者利用漏洞入侵时,由于进程权限很低,攻击者得到的访问权限又是基于这个较低权限。

【配置文件】


[root@CentOS01~]#rpm-qcbind
/etc/logrotate.d/named/etc/named.conf#主配置文件
/etc/named.rfc1912.zones#区域配置文件(用include指令包含在主配置文件)
/etc/named.root.key#根区域的key文件以实现事务签名;
/etc/rndc.conf#rndc(远程名称服务器控制器)配置文件
/etc/rndc.key#rndc加密密钥
/etc/sysconfig/named
/var/named/named.ca#13个根服务器存放文件/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback

重点只需要关心主配置文件:

主配置文件:named.conf,每个语句都要使用分号结尾;其功能如下:

定义区域
定义各区域的全局配置
定义视图
定义日志

【bind客户端工具】

[root@Centos~]#rpm-qlbind-utils

/usr/bin/dig#最常用的DNS服务器测试工具

/usr/bin/host#一款轻量级DNS测试工具

/usr/bin/nslookup#DNS查询工具,在众多平台上都有实现(windows上也有)

/usr/bin/nsupdate#更新工具

/usr/share/man/man1/dig.1.gz

/usr/share/man/man1/host.1.gz

/usr/share/man/man1/nslookup.1.gz

/usr/share/man/man1/nsupdate.1.gz

[/code]
dig命令:

语法:dig-t资源记录类型名称@server-ip

工作机制:

不加"@server-ip":根据/etc/resolv.conf配置的解析文件来查询

例如:









说明:

(1)加"@server-ip":根据指定的DNS服务器来解析,绕过了本地解析库中设置的DNS服务器。

(2)注意标志位:





注:dig命令不会查缓存,而是直接查服务器


例如:





常用选项:

dig-xIP@server-ip:查询反向解析





dig-t资源记录类型名称+trace:追踪解析过程

[root@CentOS01~]#dig-tAwww.baidu.com+trace ;<<>>DiG9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1<<>>-tAwww.baidu.com+trace ;;globaloptions:+cmd #首先找根 .480984INNSg.root-servers.net. .480984INNSj.root-servers.net. .480984INNSd.root-servers.net. .480984INNSk.root-servers.net. .480984INNSc.root-servers.net. .480984INNSh.root-servers.net. .480984INNSb.root-servers.net. .480984INNSl.root-servers.net. .480984INNSe.root-servers.net. .480984INNSm.root-servers.net. .480984INNSa.root-servers.net. .480984INNSi.root-servers.net. .480984INNSf.root-servers.net. ;;Received496bytesfrom218.2.135.1#53(218.2.135.1)in1654ms #然后找.com com.172800INNSa.gtld-servers.net. com.172800INNSb.gtld-servers.net. com.172800INNSc.gtld-servers.net. com.172800INNSd.gtld-servers.net. com.172800INNSe.gtld-servers.net. com.172800INNSf.gtld-servers.net. com.172800INNSg.gtld-servers.net. com.172800INNSh.gtld-servers.net. com.172800INNSi.gtld-servers.net. com.172800INNSj.gtld-servers.net. com.172800INNSk.gtld-servers.net. com.172800INNSl.gtld-servers.net. com.172800INNSm.gtld-servers.net. ;;Received491bytesfrom128.63.2.53#53(128.63.2.53)in921ms #然后找baidu.com. baidu.com.172800INNSdns.baidu.com. baidu.com.172800INNSns2.baidu.com. baidu.com.172800INNSns3.baidu.com. baidu.com.172800INNSns4.baidu.com. baidu.com.172800INNSns7.baidu.com. ;;Received201bytesfrom192.55.83.30#53(192.55.83.30)in402ms #最后找到最终结果 www.baidu.com.1200INCNAMEwww.a.shifen.com. a.shifen.com.1200INNSns1.a.shifen.com. a.shifen.com.1200INNSns2.a.shifen.com. a.shifen.com.1200INNSns3.a.shifen.com. a.shifen.com.1200INNSns5.a.shifen.com. a.shifen.com.1200INNSns4.a.shifen.com. ;;Received228bytesfrom61.135.165.235#53(61.135.165.235)in81ms[/code]
dig-taxfrzone:验证完全区域传送

host命令:

语法:host-t资源记录类型名称

例如:





二、DNS(bind)服务器的配置:

经过上面关于bind服务的介绍后,下面我们就来具体配置bind服务哈。我们的配置分四个:

配置正向解析的bind
配置反向解析的bind
配置辅助bind
实现主辅DNS之间的区域传送

【实验环境规划】

VMwarestation10

BIND服务器:两台CentOS6.4虚拟机做主辅DNS

一台windowsserver2008R2做辅助DNS

一台windows7做客户端

DomainName:test.com.192.168.1.0/24

主DNS:LinuxMaster.test.com.192.168.1.58

辅助DNS:LinuxSlave.test.com.192.168.1.59

Win2008Slave.test.com.192.168.80.3(在windows2008R2上实现)

web主机:www.test.com.192.168.1.58192.168.1.59192.168.80.3

ftp主机:ftp.test.com.CNAMEwww.test.com.

mx邮件服务器:mx.test.com.192.168.1.58

1、配置正向解析

【将一台主机配置成可正向解析的DNS之步骤】

第一步:使用YUM安装DNS所使用的软件包(BIND)

第二步:创建或修改主配置文件(/etc/named.conf)

第三步:创建区域数据文件(/var/named/***.zone)

第四步:使用相关命令(named-checkconf、named-checkzone)测试配置文件及区域文件是否存在语法错误


第五步:确保主配置文件和各区域解析库文件的权限为640,属主为root,属组为named;

第六步:重启服务或重新加载配置文件

第七步:更改iptables和selinux的设置(如果不了解此两项可以暂时关闭它们)


第八步:分别使用(dig/nslookup)在Linux/Windows主机进行查询DNS相关资源记录


具体配置过程如下:

第一步:通过yum安装bind:

[root@Centos~]#yuminstall-ybind

Loadedplugins:fastestmirror,security

Loadingmirrorspeedsfromcachedhostfile

SettingupInstallProcess

ResolvingDependencies

-->Runningtransactioncheck

--->Packagebind.x86_6432:9.8.2-0.17.rc1.el6willbeinstalled

-->ProcessingDependency:portreserveforpackage:32:bind-9.8.2-0.17.rc1.el6.x86_64

-->Runningtransactioncheck

--->Packageportreserve.x86_640:0.0.4-9.el6willbeinstalled

-->FinishedDependencyResolution


DependenciesResolved


==========================================================================================

PackageArchVersionRepositorySize

==========================================================================================

Installing:

bindx86_6432:9.8.2-0.17.rc1.el6cdrom4.0M

Installingfordependencies:

portreservex86_640.0.4-9.el6cdrom23k


TransactionSummary

==========================================================================================

Install2Package(s)


Totaldownloadsize:4.0M

Installedsize:7.3M

DownloadingPackages:

------------------------------------------------------------------------------------------

Total34MB/s|4.0MB00:00

Runningrpm_check_debug

RunningTransactionTest

TransactionTestSucceeded

RunningTransaction

Installing:portreserve-0.0.4-9.el6.x86_641/2

Installing:32:bind-9.8.2-0.17.rc1.el6.x86_642/2

Verifying:32:bind-9.8.2-0.17.rc1.el6.x86_641/2

Verifying:portreserve-0.0.4-9.el6.x86_642/2


Installed:

bind.x86_6432:9.8.2-0.17.rc1.el6


DependencyInstalled:

portreserve.x86_640:0.0.4-9.el6


Complete!

[/code]
第二步:自己创建或修改主配置文件(/etc/named.conf)

首先我们来看看主配置文件的内容哈:

[root@CentOS02~]#cat/etc/named.conf

//C/C++风格的语法,注释用//或/**/

//named.conf

//

//ProvidedbyRedHatbindpackagetoconfiguretheISCBINDnamed(8)DNS

//serverasacachingonlynameserver(asalocalhostDNSresolveronly).

//

//See/usr/share/doc/bind*/sample/forexamplenamedconfigurationfiles.

//


options{

	listen-onport53{127.0.0.1;};

	listen-on-v6port53{::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{localhost;};//允许哪些主机查询

	recursionyes;//是否允许递归查询


	dnssec-enableyes;

	dnssec-validationyes;

	dnssec-lookasideauto;


	/*PathtoISCDLVkey*/

	bindkeys-file"/etc/named.iscdlv.key";


	managed-keys-directory"/var/named/dynamic";

};


logging{//定义日志

channeldefault_debug{

file"data/named.run";

severitydynamic;

};

};


zone"."IN{//定义根区域文件名称

	typehint;

	file"named.ca";//使用的是相对路径,默认存放在/var/named/named.ca

};

//把另外两个文件也包含进来,作为主配置文件的一部分

include"/etc/named.rfc1912.zones";//定义区域配置文件

include"/etc/named.root.key";//根区域的key文件,与事务签名相关

[/code]
注释如下三行:

//listen-onport53{127.0.0.1;};

//listen-on-v6port53{::1;};

//allow-query{localhost;};





启动named服务:





验证named服务是否已经启动:





配置开机启动:





至此,一台缓存DNS服务器就配置好了!

【编辑区域配置文件/etc/named.rfc1912.zones】

在里面新建一个区域,格式如下:

zone"区域名称"IN{
typemaster|slave|forward;//注意每个语句要以分号结尾
file"ZONE_NAME.zone";
};//注意要以分号结尾

我们这里新建的区域如下:





第三步:创建区域数据文件(/var/named/***.zone)

在/var/named下建立“ZONE_NAME.zone”文件,通常只包含宏定义和资源记录,且第一个记录必须是SOA记录(格式如下);


$TTL600;
name[TTL]INRR_Typevalue
(1)一个FQDN可对应同多个IP;(负载均衡)

(2)多个FQDN可对应一个IP:(一台主机有多个名称,且可以用CNAME定义)

[/code]




注:以上各资源记录的写法及含义在上次博文中已经详细讨论过(/article/4515251.html),这里不再赘述了哈!

第四步:使用相关命令(named-checkconf、named-checkzone)测试配置文件及区域文件是否存在语法错误





第五步:确保主配置文件和各区域解析库文件的权限为640,属主为root,属组为named;

(1)检查主配置文件的权限:





(2)检查区域解析库文件/var/named/test.com.zone的权限:





更改权限:





第六步:重新启动服务或重新加载配置文件:





第七步:更改iptables和selinux的设置(如果不了解此两项可以暂时关闭它们)





第八步:分别使用(dig/nslookup)在Linux/Windows主机进行查询DNS相关资源记录

(1)使用dig命令在Linux主机上进行DNS资源查询:





(2)使用nslookup命令在Windows系统平台下测试DNS相关资源记录:









至此,一台能够正向解析的bind服务器就配置好了哈!

2、配置反向解析bind服务器:

正向解析与反向解析各自采用不同的解析库,一台DNS服务器可以只有正向解析库或只有反向解析库,也可以同时提供正向/反向解析。

反向区域的区域名称格式:

ReverseIP.in-addr.arpa.

例如:假设网络地址为172.16.100.1那么规则命名为100.16.172.in-addr.arpa

这里我本地的内网IP为192.168.1.0,所以则写成1.168.192.in-addr.arpa

第一步:修改配置文件/etc/named.conf,添加反向解析区域配置文件





第二步:创建反向区域解析文件168.192.zone





第三步:检查语法错误





第四步:设置权限





第五步:重新加载配置文件





第六步:用windows客户端验证解析:





至此,我们就把主bind服务器配置好了哈(既可以正向解析又可以反向解析)

三、rndc的相关知识:

1、什么是rndc:

RemoteNameDomainController,远程名称域控制器

rndc通过一个TCP连接与名字服务器通信,发送经过数字签名认证的命令。在当前版本的rndc和named中,唯一支持的认证算法是HMAC-MD5,在连接的两端使用共享密钥。它为命令请求和名字服务器的响应提供TSIG类型的认证。所有经由通道发送的命令都必须被一个服务器所知道的key_id签名。

监听端口:953/tcp

语法:

rndc[-baddress][-cconfig][-sserver][-pport]

[-kkey-file][-ykey][-V]command

commandisoneofthefollowing:

reloadReloadconfigurationfileandzones.#重新加载配置文件和区域文件

reconfigReloadconfigurationfileandnewzonesonly.#重新加载配置文件和新的区域文件

freezeSuspendupdatestoalldynamiczones.

statsWriteserverstatisticstothestatisticsfile.#将服务器统计信息写入统计文件中

stopSavependingupdatestomasterfilesandstoptheserver.

haltStoptheserverwithoutsavingpendingupdates.

flushFlushesalloftheserver'scaches.#清空DNS缓存

statusDisplaystatusoftheserver.#显示bind服务器的工作状态

[/code]
2、rndc的调试和日志:

调试:显示程序运行中的详细信息(会产生I/O,正常情况下建议关闭)

调试级别:0,1,2,3...

提升调试级别:

rndctrace

rndctraceLEVEL

rndcnotrace

打开查询日志:记录查询动作(会增加磁盘I/O)

rndcquerylog

例如:





四、辅助DNS服务器的配置

注意辅助DNS是针对区域来说的;如果有多台DNS服务器,必须为每个DNS服务器建立NS记录,否则主DNS将不向其发送通知;

主辅DNS之间的区域传送原理在上次博文中已经详细讨论过,这里就不在赘述。想要了解的可以看上一篇博文/article/4515251.html。

1、区域的定义:

zone“区域名称”IN{

typeslave;#区域类型为辅助

file"slaves/ZONE_NAME.zone";#区域文件必须保存在slaves目录下,放在其他目录没有权限

masters{#指出主服务器是谁,注意:花括号前后要有一个空格

MASTER_DNS_IP;

MASTER_DNS2_IP;

};

};

[/code]
2、辅助DNS和区域传送的配置:

第一步:先创建一个辅助DNS(分别在LinuxSlave和win2008的虚拟主机中实现)

(1)在LinuxSlave主机上安装bind服务并做相应的配置:编辑/etc/named.rfc1912.zones,添加如下记录:





检查语法错误:





(2)在主DNS服务器所在的LinuxMaster主机上的区域文件/var/named/test.com.zone和/var/named/168.192.zone中添加相应的记录:









检查语法错误、重读配置文件:





在主DNS服务器上,用dig命令做下检测,看看新增加的记录是否出现:









【在windowsserver2008R2上配置辅助DNS】

准备工作:配置好网络,使得win2008虚拟机能够ping通主DNS服务器并安装好DNS相关组件。





打开DNS管理工具,创建辅助区域:

















完成后右键区域点击刷新即从主DNS同步了区域:





随便点击几个资源记录看一下,发现都是灰色的无法编辑哈(辅助DNS的数据来自于主DNS,一般是只读的)







在主DNS服务器上查看日志,检验主辅DNS之间的区域传送:





第二步:实现从主DNS服务器完全同步区域数据文件,查看日志文件验证辅助服务器是否完成同步:

说明:以下的实验没有windows辅助DNS参与了,因此相应的NS记录和A记录被我手动删除了哈!

在辅助DNS服务器上用dig命令检测下是否能从主DNS服务器同步数据(完全区域传送)





在辅助DNS服务器上查看对应的区域文件是否已经有了:





再来看看辅助DNS上这些区域文件的内容是什么:





查看日志:





第三步:在主DNS服务器上新增一条资源记录并查看日志文件,然后到辅助DNS服务上查看日志是否完成增量区域数据同步





查看日志/var/log/messages发现,由于我忘记把序列号加1了,所以报错说序列号没有更改,同步到辅助DNS失败





把序列号加1后再来看日志:





在辅助DNS服务器上查看日志情况:





查看辅助DNS服务器上的区域文件:





一切OK哈!

第四步:在windows客户端用nslookup命令来验证辅助DNS的配置:





一切OK哈!

DNS服务器的基本配置就这么多哈,下面来简单总结下:

1、每个DNS服务器必须要有一个对应的NS资源记录;

2、创建slave的时候,其配置文件类型必须是typeslve;必须指定主服务器的IP地址;

3、可以使用dig-taxfrtest.com@server_IP从主DNS服务器拉取所有解析库资源记录;

4、主辅同步完成后,将自动在slave服务器上的slaves/目录下生成zone文件,这些区域文件是从主DNS同步过来的,一般为只读,不建议更改slave的zone文件;

5、在主DNS上修改区域文件时,必须将SOA记录的serial加1因为slave是通过serial值来进行判断更新的(windows系统上是自动完成的);

6、DNS的日志默认全部保存在/var/log/messege文件中;

7、DNS的解析依赖于解析库,所以就算是所配置的内容是完全不存在的也可以解析(且正向解析和反向解析的解析库是各自独立的)。需要注意,正向解析里没有PTR记录,而反向解析库里不需要A记录、MX记录和CNAME记录

本次博文的内容就这么多,下次博文主要讨论DNS安全、子域授权、acl、view、转发域及日志子系统。欢迎各位大大拍砖~~
本文出自“技术日志”博客,请务必保留此出处/article/4515252.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: