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

Posted python运维自动化之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)来运行进程。这种方式的好处在于该服务被攻击者利用漏洞入侵时,由于进程权限很低,攻击者得到的访问权限又是基于这个较低权限。

【配置文件】

[[email protected] ~]# 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客户端工具】

[[email protected] ~]# 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追踪解析过程

[[email protected] ~]# 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:

[[email protected] ~]# 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)  

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

[[email protected] ~]# 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记录





以上是关于Linux运维实战之DNS(bind)服务器的安装与配置的主要内容,如果未能解决你的问题,请参考以下文章

linux服务之DNS

Linux搭建DNS实战一

Linux下DNS服务(Bind9)之Web管理利器-NamedManager部署说明

Linux服务配置之BIND域名服务器

Linux之bind服务(DNS)部署配置

K8S运维知识汇总第2天2:准备服务器+安装bind9DNS服务