[RHEL]-20-使用bind服务实现域名解析

引言

这篇文章将实例演示如何使用bind来配置DNS域名解析服务。

文章目录

0×1.DNS解析服务介绍

DNS(Domain Name System)是互联网上的一个基础服务,其功能上可以实现"正向解析"与"反向解析","正向解析"实现从主机域名到IP地址的解析查询,而"反向解析"实现从IP到主机域名的查询。

DNS协议采用了树型数据结构,由上往下形成了一个分布式的数据库系统,全球共有13台根服务器,往下再细分成每个国家,每个国家的不同地区,每个地区的不同互联网接入商等等。

在实际的DNS查询过程中,很少会触及根服务器,而是在网络供应商提供的DNS服务器的数据库中就能够查到DNS记录,客户机在发起一个DNS查询时,查询步骤如下,由上往下只要查找到就返回不再往下查找:

1.查询本地HOSTS文件;
2.查询本地缓存;
3.查询本地指定的互联网DNS服务器(大多数为接入商提供的DNS);
4.检查DNS服务器缓存;
5.向其他指定的DNS服务器发起迭代查询;
6.查询根域;
7.根据根域的返回信息,查询子域;

大多数的查询都会在第5步中被找到,而无需请求根服务器。

BIND全名叫做Berkeley Internet Name Daemon(伯克利互联网域名服务)最早出现在伯克利大学,而如今是互联网中使用最广泛的域名解析服务程序,如何在RHEL7中安装bind:

					[root@qingsword.com ~]# yum install -y bind-chroot

					#安装完成后,主要的三个文件地址如下
					# 主程序 /usr/sbin/named
					# 主配置文件 /etc/named.conf
					# 区域配置文件 	/etc/named.rfc1912.zones
					

0×2.DNS主服务器正反向解析配置实例

实验环境:

					RHEL7,安装了bind-chroot程序,IP 192.168.1.233/24;
客户端CentOS7,IP 192.168.1.23/24 DNS服务器设置成192.168.1.233;
两者处于同一局域网,且能够互相ping通;

1)首先设置服务端iptables

					#可以添加允许DNS规则,或直接清空保存,本例选择直接清空iptables
					[root@qingsword.com ~]# iptables -F
					[root@qingsword.com ~]# service iptables save
					

2)修改服务端bind主配置文件

					#使用vim编辑bind主配置文件
					[root@qingsword.com ~]# vim /etc/named.conf

					#其他的地方不需要修改,主要修改下面any两处
					options {
						#中括号中可以用逗号隔开,设置本机由哪几块网卡接收响应客户端的DNS查询,本例设置为any,即从所有网卡接收客户端的DNS查询
						listen-on port 53 { any; };
						#如果服务端配置有IPv6地址,则将下面中括号改成any或对应接收DNS查询的网卡IP
						listen-on-v6 port 53 { ::1; };
						#工作目录,这个目录下存放了域名解析记录文件
						directory       "/var/named";
						#DNS缓存转储位置
						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";
						#将localhost改成any或对应目标地址(网段或单个ip),表示接收任何源地址发起的DNS查询,如果仅指定某个IP(或网段),那么服务器只响应对应IP(或网段)的DNS查询,默认只允许本机查询
						allow-query  { any; };
						
						#允许递归查询
						recursion yes; 
					};

					...省略部分输出..

					zone "." IN {
						type hint;
						#全球13台根服务器的IP地址保存文件(保存在/var/named/named.ca,大家可以使用vim查看下这个文件)
						file "named.ca";
					};
					
					#named.rfc1912.zones文件中保存着正反向解析的区域信息列表,稍后会编辑到
					include "/etc/named.rfc1912.zones";

					include "/etc/named.root.key";
					

3)编辑区域信息文件named.rfc1912.zones

					[root@qingsword.com ~]# vim /etc/named.rfc1912.zones

					#在文件的末尾添加下面两条记录

					#正向解析
					# zone "顶级域名" IN {
					# 	type master; 代表这是主服务器
					# 	file "对应域名的解析文件,名称可自定义"
					# 	allow-update { none; }; 禁止来自客户端的更新与修改 
					# };
					zone "qingsword.com" IN {
						type master;
						file "qingsword.com.zone";
						allow-update { none; };
					};

					#对某个网段的反向解析
					# zone "网段ip前三段反写.in-addr.arpa" IN {
					# 	type master;
					# 	file "对应域名的解析文件,可自定义"
					# 	allow-update { none; };  
					# };
					zone "1.186.192.in-addr.arpa" IN {
						type master;
						file "192.168.1.arpa";
						allow-update { none; };
					};
					

4)创建区域信息文件中解析记录对应的解析文件

					#首先将已有的正向解析与反向解析文件复制创建新的解析文件(也可以手动创建,复制会有一个参考格式,比较方便而已,-a参数会连同权限一起复制)
					[root@qingsword.com ~]# cp -a /var/named/named.localhost /var/named/qingsword.com.zone
					[root@qingsword.com ~]# cp -a /var/named/named.loopback /var/named/192.168.1.arpa

					#然后逐个编辑这两个文件(注意,每个域名后面都要带".")
					[root@qingsword.com ~]# vim /var/named/qingsword.com.zone
					# $TTL 1D
					# @  IN SOA  主域名. 邮箱地址(用"."代替@符号). (
					# 		0 ; serial 更新序列号
					# 		1D ; refresh 刷新时间,默认每天
					# 		1H ; retry 重试延时,默认一小时
					# 		1W ; expire 失效时间,默认一周
					# 		3H;minimum 无效解析记录缓存时间,默认3小时
					#
					# 域名服务器记录
					# 		NS		ns.qingsword.com.  
					# ns	IN A	192.168.1.233
					# 因为主域是qingsword.com,所以下面这句的意思就是将www.qingsword.com解析到192.168.1.233,这是一条A记录(A记录,即域名到IP的解析记录)
					# www	IN A	192.168.1.233

					$TTL 1D
					@  IN SOA  qingsword.com. admin.qingsword.com. (
								0 ; serial
								1D ; refresh
								1H ; retry
								1W ; expire
								3H ) ; minimum

						NS		ns.qingsword.com.
					ns	IN A	192.168.1.233
					www	IN A	192.168.1.233
					#如果想让N.qingsword.com(N代表任何字母数字组合)都解析到192.168.1.233可以写一条泛解析如下
					*	IN A	192.168.1.233

					[root@qingsword.com ~]# vim /var/named/192.168.1.arpa

					#反向解析使用的是PTR记录
					$TTL 1D
					@  IN SOA  qingsword.com. admin.qingsword.com. (
								0 ; serial
								1D ; refresh
								1H ; retry
								1W ; expire
								3H ) ; minimum

							NS		ns.qingsword.com.
					ns		IN A	192.168.1.233
					xxx		PTR		192.168.1.233
					bbs		PTR		192.168.1.234
					blog	PTR		192.168.1.235
					

5)重启named服务

					[root@qingsword.com ~]# systemctl restart named 
					
					#若有必要,设置成开机启动
					[root@qingsword.com ~]# systemctl enable named 
					

6)客户端测试

					#客户端上将DNS解析指向192.168.1.233后,使用nslookup测试,配置正确的话,结果应该如下
					[root@qingsword.com ~]# nslookup 
					> 192.168.1.233
					Server:		192.168.1.233
					Address:	192.168.1.233#53
					233.1.168.192.in-addr.arpa	name = xxx.qingsword.com.

					> 192.168.1.234
					Server:		192.168.1.233
					Address:	192.168.1.233#53
					234.1.168.192.in-addr.arpa	name = bbs.qingsword.com.

					> 192.168.1.235
					Server:		192.168.1.233
					Address:	192.168.1.233#53
					235.1.168.192.in-addr.arpa	name = blog.qingsword.com.

					> www.qingsword.com
					Server:		192.168.1.233
					Address:	192.168.1.233#53
					Name:	www.qingsword.com
					Address: 192.168.1.233
					
					#因为添加了泛解析,所以
					> abcde.qingsword.com
					Server:		192.168.1.233
					Address:	192.168.1.233#53
					Name:	abcde.qingsword.com
					Address: 192.168.1.233
					

0×3.DNS从服务器配置实例

我们上面配置的服务器就像是一台地区根服务器,保存了所有主要的DNS信息,但一个地区少则几万人,多则几千万,不可能让所有人都直接在根服务器上查询信息,那样根服务器早就宕机了,科学的做法是,配制出一定数量的从服务器,让从服务器缓存根服务器的DNS数据,客户端可以直接在从服务器上得到对应的DNS信息,接着上面的实验,将CentOS7那台原本的客户机配成从服务器,并且再开启一台Ubuntu客户机,DNS指向从服务器的IP地址,测试客户机能否查询到正确的DNS信息。

1)从服务器上也需要安装bind-chroot

					[root@qingsword.com ~]# yum -y install bind-chroot
					

2)修改主配置文件(两处any,其他配置不变)

					[root@qingsword.com ~]# vim /etc/named.conf 
					options {
						listen-on port 53 { any; };
						..省略部分输出..
						allow-query     { any; };
					

3)修改从服务器named.rfc1912.zones文件,添加从属关系记录

					[root@qingsword.com ~]# vim /etc/named.rfc1912.zones
					
					#添加要从主服务器上获取哪些记录

					#要缓存的正向解析条目
					zone "qingsword.com" IN {
						#服务类型为从服务
						type slave;
						#named服务重新启动后,会自动去主服务器获取对应条目的解析文件下载到本地的/var/named/slaves目录中,file后面指定的文件名要和主服务器下载下来的文件一致
						file "slaves/qingsword.com.zone";
						#指定主服务器的IP地址,可以用逗号隔开多个主服务器IP地址
						masters { 192.168.1.233; };
					};
					
					#要缓存的反向解析条目
					zone "1.168.192.in-addr.arpa" IN {
						type slave;
						file "slaves/192.168.1.arpa";
						masters { 192.168.1.233; };
					};
					

4)重启从服务器的named服务

					[root@qingsword.com ~]# systemctl restart named

					#重启后,就能够在slaves文件夹下看到从主服务器获取到的解析记录了
					[root@qingsword.com ~]# ls /var/named/slaves/
					192.168.1.arpa  qingsword.com.zone
					

5)清空iptables列表

					[root@qingsword.com ~]# iptables -F
					

现在,使用ubuntu客户端网卡配置DNS指向从服务器的IP地址(192.168.1.23),配置无误的话,就能够顺利的在从服务器上查询到DNS信息了。

0×4.DNS主从服务器间实现加密通信

在实际应用中bind主从服务器之间一般都采用了一种叫做TSIG(TSIGRFC 2845)的加密机制,在主服务器上生成一个密码文件,然后将这个文件传送给信任的从服务器,通过修改bind服务的配置文件实现主从服务器间DNS信息的加密通信,接着上面的实验。

1)首先在主服务器上生成密钥文件

					#使用dnssec-keygen命令生成密钥
					# -b 密钥长度,HMAC-MD5长度在1-512位之间
					# -a 加密算法
					# -n 密钥类型,HOST主机相关类型
					# qingsword-key 密钥的名称
					# 记录下密钥名称与加密算法,稍后要用到
					[root@qingsword.com ~]# dnssec-keygen -b 128 -a HMAC-MD5 -n HOST qingsword-key
					Kqingsword-key.+157+08912

					#在当前目录中会生成两个文件,一个为公钥,一个为私钥
					[root@qingsword.com ~]# ls *qingsword-key*
					Kqingsword-key.+157+08912.key  Kqingsword-key.+157+08912.private

					#查看私钥信息,记录下Key后面的值,稍后要用到
					[root@qingsword.com ~]# more Kqingsword-key.+157+08912.private 
					Private-key-format: v1.3
					Algorithm: 157 (HMAC_MD5)
					Key: Dh5rTKdRAy5bjzuZw7Seaw==
					

2)在主服务器上创建密钥验证文件

					#在/var/named/chroot/etc/目录下创建一个新文件,名称可自定义
					[root@qingsword.com ~]# vim /var/named/chroot/etc/qingsword.key
					
					#在文件中输入下面的内容
					# 第一行为密钥名称
					# 第二行为加密类型
					# 第三行为密钥
					#这三行是在上面创建密钥文件时我们记录的那些值
					key "qingsword-key" {
					algorithm hmac-md5;
					secret "Dh5rTKdRAy5bjzuZw7Seaw==";
					};
					
					#修改密钥文件的权限与属组,让named服务能访问此文件
					[root@qingsword.com ~]# chown root:named /var/named/chroot/etc/qingsword.key
					[root@qingsword.com ~]# chmod 640 /var/named/chroot/etc/qingsword.key 

					#为了调用方便,做一个硬链接到/etc目录下
					[root@qingsword.com ~]# ln /var/named/chroot/etc/qingsword.key /etc/qingsword.key
					[root@qingsword.com ~]# ls -l /etc/qingsword.key 
					-rw-r-----. 2 root named 80 Dec  6 21:21 /etc/qingsword.key
					

3)在主配置文件中开启主服务器的密钥验证功能

					[root@qingsword.com ~]# vim /etc/named.conf
					#在主配置文件中添加一条include信息,指向第2步中创建的密钥验证文件,并且在options区块内部添加一条allow-transfer { key 密钥名称 };
					include "/etc/qingsword.key";
					options {
						isten-on port 53 { any; };
						...省略部分输出..
						allow-query     { any; };
						allow-transfer { key qingsword-key; };
					

4)主服务器重启named服务,并在从服务器上测试

					#主服务器重启named服务
					[root@qingsword.com ~]# systemctl restart named

					#切换到从服务器,删除未加密前从主服务器获得的DNS信息
					[root@qingsword.com ~]# ls /var/named/slaves/
					192.168.1.arpa  qingsword.com.zone
					[root@qingsword.com ~]# rm -rf /var/named/slaves/*

					#重启从服务器named服务,此时无法从主服务器获得DNS信息了,因为从服务器还未配置与主服务器相同的密钥文件,主服务器会自动阻止从服务器的请求
					[root@qingsword.com ~]# systemctl restart named

					#再次查看slaves文件夹,看不到任何DNS信息
					[root@qingsword.com ~]# ls /var/named/slaves/
					

5)将密钥文件从主服务器传输到从服务器上(或在从服务器上手动创建一个)

					#在主服务器上使用scp,将密钥文件传输给从服务器
					[root@qingsword.com ~]# scp /etc/qingsword.key 192.168.1.23:/var/named/chroot/etc/

					#在从服务器上给这个传输过来的文件设置权限并建立硬连接
					[root@qingsword.com ~]# chmod 640 /var/named/chroot/etc/qingsword.key 
					[root@qingsword.com ~]# chown root:named /var/named/chroot/etc/qingsword.key 
					[root@qingsword.com ~]# ln /var/named/chroot/etc/qingsword.key /etc/qingsword.key
					[root@qingsword.com ~]# ls -l /etc/qingsword.key 
					-rw-r-----. 2 root named 80 12月  7 10:52 /etc/qingsword.key
					

6)修改从服务器named主配置文件,添加支持密钥验证

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

					#在options区块后,logging区块前添加一段,include指向/etc中的配置文件名称,server后面是主服务器的IP,keys后是密钥名称

					options{
						..options区块..
					};

					include "/etc/qingsword.key";
					server 192.168.1.233{
						keys { qingsword-key; };
					};
					
					logging {
						..logging区块..
					};
					

7)重启从服务器的named服务,测试配置是否成功

					[root@qingsword.com ~]# systemctl restart named

					#现在又能顺利的从主服务器上获取DNS信息了,而且这些信息都是加密传输的
					[root@qingsword.com ~]# ls /var/named/slaves/
					192.168.1.arpa  qingsword.com.zone
					

0×5.DNS缓存服务器配置

缓存服务器的配置十分简单,在实际环境中应用也比较少,实验环境如下:

RHEL7服务端,安装了bind,相当于企业内部的DNS缓存服务器,安装了两块网卡,一块网卡对外(IP 192.168.1.233/24),一块网卡对内(IP 192.168.100.233/24);
内网客户端CentOS7,IP 192.168.100.23/24,配置其DNS指向192.168.100.233;

在服务端安装好bind,修改主配置文件

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

					#将options区块的监听和接收ip改成any后,另添加一条forwarders规则,指向DNS服务器的地址(本例使用国内的114域名解析),添加这条规则后,这台服务器就可以作为DNS缓存服务器来使用了,无需修改其他配置
					options {
						listen-on port 53 { any; };
						..省略部分输出..
						allow-query     { any; };
						forwarders { 114.114.114.114; };
					
					#重启named服务
					[root@qingsword Desktop]# systemctl restart named

					#清空iptables规则并保存(也可以将相应规则添加到其中并允许)
					[root@qingsword Desktop]# iptables -F
					[root@qingsword Desktop]# service iptables save
					

将客户端的网络配置中的DNS地址修改成服务端对内的IP地址即可,此时客户端发起的所有DNS查询,都会发往服务端,再由服务端访问114,收到114的返回信息后,将信息缓存到本地,再将请求的DNS结果发回客户端,客户端再次查询相同的DNS信息时会非常的快,服务端会查询缓存,然后直接将DNS信息发给客户端,而不需要再次像114请求,从而节约了时间。

0×6.配置DNS分离解析

分离解析技术有点类似我们所使用的CDN,在不同的地区使用不同的IP查询同一个域名的DNS信息时,会返回不同的结果,实验环境如下:

服务端RHEL7,安装了bind,在同一块网卡上添加了两个IP(192.168.1.233/24,192.168.100.233/24)来模拟不同的地区来源;
客户端CentOS7,先将IP设置成(192.168.1.0/24)网段,稍后更改成(192.168.100.0/24)来模拟不同的请求来源;

1)配置服务端,修改主配置文件

					#只需要修改两个any,然后删除根域区块
					[root@qingsword.com ~]# vim /etc/named.conf
					options {
						listen-on port 53 { any; };
						..省略部分输出..
						allow-query     { any; };


					#删除下面这段根域区块
					zone "." IN {
						type hint;
						file "named.ca";
					};
					

2)修改named.rfc1912.zones文件

					[root@qingsword.com ~]# vim /etc/named.rfc1912.zones

					#在文件的末尾添加下面的内容
					
					#定义不同区域的IP段
					acl "Earth" { 192.168.1.0/24; };
					acl "Mars" { 192.168.100.0/24; };
					
					#针对不同区域设置对应的解析文件
					view "Earth" {
					 match-clients { "Earth"; };
					 zone "qingsword.com" {
					  type master;
					  file "qingsword.com.Earth";
					 };
					};

					view "Mars" {
					 match-clients { "Mars"; };
					 zone "qingsword.com" {
					  type master;
					  file "qingsword.com.Mars";
					 };
					};
					

3)创建解析文件

					#使用localhost的模板文件复制两份,保存其属性
					[root@qingsword.com ~]# cp -a /var/named/named.localhost /var/named/qingsword.com.Earth
					[root@qingsword.com ~]# cp -a /var/named/named.localhost /var/named/qingsword.com.Mars

					#分别编辑这两个文件
					[root@qingsword.com ~]# vim /var/named/qingsword.com.Earth

					$TTL 1D
					@  IN SOA  qingsword.com. admin.qingsword.com. (
								0 ; serial
								1D ; refresh
								1H ; retry
								1W ; expire
								3H ) ; minimum

						NS		ns.qingsword.com.
					ns	IN A	192.168.1.233
					www	IN A	192.168.1.233

					[root@qingsword.com ~]# vim /var/named/qingsword.com.Mars

					$TTL 1D
					@  IN SOA  qingsword.com. admin.qingsword.com. (
								0 ; serial
								1D ; refresh
								1H ; retry
								1W ; expire
								3H ) ; minimum

						NS		ns.qingsword.com.
					ns	IN A	192.168.100.233
					www	IN A	192.168.100.233
					

4)配置完成后,重启named服务

					[root@qingsword.com ~]# systemctl restart named

					#清空iptables
					[root@qingsword.com ~]# iptables -F
					

5)在客户端配置两个IP,模拟不同的地区分别测试

					#使用nmcli添加两个网卡配置,分别模拟Earth与Mars地区
					[root@qingsword ~]# nmcli connection add con-name Earth ifname eno16777736 type ethernet autoconnect no ip4 192.168.1.23/24 gw4 192.168.1.1

					[root@qingsword ~]# nmcli connection add con-name Mars ifname eno16777736 type ethernet autoconnect no ip4 192.168.100.23/24 gw4 192.168.100.1
				
					[root@qingsword ~]# nmcli connection modify Earth ipv4.dns "192.168.1.233"
					[root@qingsword ~]# nmcli connection modify Mars ipv4.dns "192.168.100.233"

					#切换网卡配置,使用nslookup查看地址解析,不同的源IP解析的地址IP也不相同,这就是分离解析
					[root@qingsword ~]# nmcli connection up Earth 
					[root@qingsword ~]# nslookup 
					> www.qingsword.com
					Server:		192.168.1.233
					Address:	192.168.1.233#53

					Name:	www.qingsword.com
					Address: 192.168.1.233

					[root@qingsword ~]# nmcli connection up Mars
					[root@qingsword ~]# nslookup 
					> www.qingsword.com
					Server:		192.168.100.233
					Address:	192.168.100.233#53

					Name:	www.qingsword.com
					Address: 192.168.100.233