Linux运维实战之DNS(bind)服务器的安装与配置
【本次博文的主要内容】
- bind服务器简介(包括客户端工具dig的介绍)
- 配置正向解析DNS服务器
- 配置反向解析DNS服务器
- 配置辅助DNS服务器并在主辅之间实现区域传送
一、BIND服务器简介:
Bind是Berkeley Internet Name Domain Service的简写,它是一款实现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(file deiscriptor)数据库以确认是否有相关的应用程序进程注册了该套接字。如果有,则将请求报文发送给该进程。
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 -qc bind /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 -ql bind-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
dig命令:
语法:dig -t 资源记录类型 名称 @server-ip
工作机制:
不加"@server-ip":根据/etc/resolv.conf配置的解析文件来查询
例如:
说明:
(1)加"@server-ip":根据指定的DNS服务器来解析,绕过了本地解析库中设置的DNS服务器。
(2)注意标志位:
注:dig命令不会查缓存,而是直接查服务器
例如:
常用选项:
dig -x IP @server-ip:查询反向解析
dig - t 资源记录类型 名称 +trace:追踪解析过程
[root@CentOS01 ~]# dig -t A www.baidu.com +trace ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1 <<>> -t A www.baidu.com +trace ;; global options: +cmd #首先找根 . 480984 IN NS g.root-servers.net. . 480984 IN NS j.root-servers.net. . 480984 IN NS d.root-servers.net. . 480984 IN NS k.root-servers.net. . 480984 IN NS c.root-servers.net. . 480984 IN NS h.root-servers.net. . 480984 IN NS b.root-servers.net. . 480984 IN NS l.root-servers.net. . 480984 IN NS e.root-servers.net. . 480984 IN NS m.root-servers.net. . 480984 IN NS a.root-servers.net. . 480984 IN NS i.root-servers.net. . 480984 IN NS f.root-servers.net. ;; Received 496 bytes from 218.2.135.1#53(218.2.135.1) in 1654 ms #然后找.com com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. ;; Received 491 bytes from 128.63.2.53#53(128.63.2.53) in 921 ms #然后找baidu.com. baidu.com. 172800 IN NS dns.baidu.com. baidu.com. 172800 IN NS ns2.baidu.com. baidu.com. 172800 IN NS ns3.baidu.com. baidu.com. 172800 IN NS ns4.baidu.com. baidu.com. 172800 IN NS ns7.baidu.com. ;; Received 201 bytes from 192.55.83.30#53(192.55.83.30) in 402 ms #最后找到最终结果 www.baidu.com. 1200 IN CNAME www.a.shifen.com. a.shifen.com. 1200 IN NS ns1.a.shifen.com. a.shifen.com. 1200 IN NS ns2.a.shifen.com. a.shifen.com. 1200 IN NS ns3.a.shifen.com. a.shifen.com. 1200 IN NS ns5.a.shifen.com. a.shifen.com. 1200 IN NS ns4.a.shifen.com. ;; Received 228 bytes from 61.135.165.235#53(61.135.165.235) in 81 ms
dig -t axfr zone :验证完全区域传送
host命令:
语法:host -t 资源记录类型 名称
例如:
二、DNS(bind)服务器的配置:
经过上面关于bind服务的介绍后,下面我们就来具体配置bind服务哈。我们的配置分四个:
- 配置正向解析的bind
- 配置反向解析的bind
- 配置辅助bind
- 实现主辅DNS之间的区域传送
【实验环境规划】
VMware station 10
BIND服务器:两台CentOS 6.4虚拟机做主辅DNS
一台windows server2008 R2 做辅助DNS
一台windows 7做客户端
Domain Name: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 (在windows 2008 R2上实现 )
web主机:www.test.com. 192.168.1.58 192.168.1.59 192.168.80.3
ftp主机:ftp.test.com. CNAME www.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 ~]# yum install -y bind Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package bind.x86_64 32:9.8.2-0.17.rc1.el6 will be installed --> Processing Dependency: portreserve for package: 32:bind-9.8.2-0.17.rc1.el6.x86_64 --> Running transaction check ---> Package portreserve.x86_64 0:0.0.4-9.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ========================================================================================== Package Arch Version Repository Size ========================================================================================== Installing: bind x86_64 32:9.8.2-0.17.rc1.el6 cdrom 4.0 M Installing for dependencies: portreserve x86_64 0.0.4-9.el6 cdrom 23 k Transaction Summary ========================================================================================= Install 2 Package(s)
Total download size: 4.0 M Installed size: 7.3 M Downloading Packages: ------------------------------------------------------------------------------------------ Total 34 MB/s | 4.0 MB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : portreserve-0.0.4-9.el6.x86_64 1/2 Installing : 32:bind-9.8.2-0.17.rc1.el6.x86_64 2/2 Verifying : 32:bind-9.8.2-0.17.rc1.el6.x86_64 1/2 Verifying : portreserve-0.0.4-9.el6.x86_64 2/2 Installed: bind.x86_64 32:9.8.2-0.17.rc1.el6 Dependency Installed: portreserve.x86_64 0:0.0.4-9.el6 Complete!
第二步:自己创建或修改主配置文件(/etc/named.conf)
首先我们来看看主配置文件的内容哈:
[root@CentOS02 ~]# cat /etc/named.conf // C/C++风格的语法,注释用//或/* */ // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // 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 { localhost; }; //允许哪些主机查询 recursion yes; //是否允许递归查询 dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; logging { //定义日志 channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { //定义根区域文件名称 type hint; file "named.ca"; //使用的是相对路径,默认存放在/var/named/named.ca }; //把另外两个文件也包含进来,作为主配置文件的一部分 include "/etc/named.rfc1912.zones"; //定义区域配置文件 include "/etc/named.root.key"; //根区域的key文件,与事务签名相关
注释如下三行:
//listen-on port 53 { 127.0.0.1; };
//listen-on-v6 port 53 { ::1; };
//allow-query { localhost; };
启动named服务:
验证named服务是否已经启动:
配置开机启动:
至此,一台缓存DNS服务器就配置好了!
【编辑区域配置文件/etc/named.rfc1912.zones】
在里面新建一个区域,格式如下:
zone "区域名称" IN { type master|slave|forward; //注意每个语句要以分号结尾 file "ZONE_NAME.zone"; }; //注意要以分号结尾
我们这里新建的区域如下:
第三步:创建区域数据文件(/var/named/***.zone)
在/var/named下建立“ZONE_NAME.zone”文件,通常只包含宏定义和资源记录,且第一个记录必须是SOA记录(格式如下);
$TTL 600; name [TTL] IN RR_Type value
(1)一个FQDN可对应同多个IP;(负载均衡)
(2)多个FQDN可对应一个IP:(一台主机有多个名称,且可以用CNAME定义)
注:以上各资源记录的写法及含义在上次博文中已经详细讨论过(http://sweetpotato.blog.51cto.com/533893/1596973),这里不再赘述了哈!
第四步:使用相关命令(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:
Remote Name Domain Controller,远程名称域控制器
rndc 通过一个 TCP 连接与名字服务器通信,发送经过数字签名认证的命令。在当前版本的rndc 和 named 中,唯一支持的认证算法是 HMAC-MD5,在连接的两端使用共享密钥。它为命令请求和名字服务器的响应提供 TSIG类型的认证。所有经由通道发送的命令都必须被一个服务器所知道的 key_id 签名。
监听端口:953/tcp
语法:
rndc [-b address] [-c config] [-s server] [-p port] [-k key-file ] [-y key] [-V] command command is one of the following: reload Reload configuration file and zones. #重新加载配置文件和区域文件 reconfig Reload configuration file and new zones only. #重新加载配置文件和新的区域文件 freeze Suspend updates to all dynamic zones. stats Write server statistics to the statistics file. #将服务器统计信息写入统计文件中 stop Save pending updates to master files and stop the server. halt Stop the server without saving pending updates. flush Flushes all of the server's caches. #清空DNS缓存 status Display status of the server. #显示bind服务器的工作状态
2、rndc的调试和日志:
调试:显示程序运行中的详细信息(会产生I/O,正常情况下建议关闭)
调试级别:0,1,2,3...
提升调试级别:
rndc trace
rndc trace LEVEL
rndc notrace
打开查询日志:记录查询动作(会增加磁盘I/O)
rndc querylog
例如:
四、辅助DNS服务器的配置
注意:辅助DNS是针对区域来说的;如果有多台DNS服务器,必须为每个DNS服务器建立NS记录,否则主DNS将不向其发送通知;
主辅DNS之间的区域传送原理在上次博文中已经详细讨论过,这里就不在赘述。想要了解的可以看上一篇博文http://sweetpotato.blog.51cto.com/533893/1596973。
1、区域的定义:
zone “区域名称” IN { type slave; #区域类型为辅助 file "slaves/ZONE_NAME.zone"; #区域文件必须保存在slaves目录下,放在其他目录没有权限 masters { #指出主服务器是谁,注意:花括号前后要有一个空格 MASTER_DNS_IP; MASTER_DNS2_IP; }; };
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命令做下检测,看看新增加的记录是否出现:
【在windows server 2008 R2上配置辅助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的时候,其配置文件类型必须是type slve; 必须指定主服务器的 IP地址 ;
3、可以使用dig -t axfr test.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记录