《Linux就该这么学》培训笔记_ch13_使用Bind提供域名解析服务

时间:2022-10-07 18:08:36

《Linux就该这么学》培训笔记_ch13_使用Bind提供域名解析服务

文章最后会post上书本的笔记照片。

文章主要内容

 

DNS域名解析服务

域名相较于由数字构成的IP地址更容易被理解和记忆,所以人们更习惯通过域名的方式来访问网络中的资源。但是,网络中的计算机之间只能基于IP地址来相互识别对方的身份,而且要想在互联网中传输数据,也必须基于外网的IP地址来完成。

DNS(Domain Name System,域名系统)是一项用于管理和解析域名与IP地址对应关系的技术,即能够接受用户输入的域名或IP地址,然后自动查找与之匹配(或者说具有映射关系)的IP地址或域名,即:

  • 正向解析:域名 -> IP地址
  • 反向解析:IP地址 -> 域名

DNS域名解析服务采用的目录树层次结构:

《Linux就该这么学》培训笔记_ch13_使用Bind提供域名解析服务

域名后缀一般分为国际域名和国内域名。原则上来讲,域名后缀都有严格的定义,但在实际使用时可以不必严格遵守。目前最常见的域名后缀有.com(商业组织)、.org(非营利组织)、.gov(*部门)、.net(网络服务商)、.edu(教研机构)、.pub(公共大众)、.cn(中国国家*域名)等。

DNS提供了三种类型的服务器

  • 主服务器:在特定区域内具有唯一性,负责维护该区域内的域名与IP地址之间的对应关系。(用于管理域名和IP地址对应关系的真正服务器目前全球共有13台
  • 从服务器:从主服务器中获得域名与IP地址的对应关系并进行维护,以防主服务器宕机等情况。(分散部署在各个国家、省市或地区,以便让用户就近查询域名。同步主服务器中域名与IP地址的对应关系,减轻主服务器压力,加快用户请求速度
  • 缓存服务器:通过向其他域名解析服务器查询获得域名与IP地址的对应关系,并将经常查询的域名信息保存到服务器本地,以此来提高重复查询时的效率。(不常用,一般部署在企业内网的网关位置,用于加速用户的域名查询请求)

 13台根DNS服务器的具体信息:(亚洲仅在日本有一台根DNS服务器)

名称 管理单位 地理位置 IP地址
A INTERNIC.NET 美国-弗吉尼亚州 198.41.0.4
B 美国信息科学研究所 美国-加利弗尼亚州 128.9.0.107
C PSINet公司 美国-弗吉尼亚州 192.33.4.12
D 马里兰大学 美国-马里兰州 128.8.10.90
E 美国航空航天管理局 美国加利弗尼亚州 192.203.230.10
F 因特网软件联盟 美国加利弗尼亚州 192.5.5.241
G 美国国防部网络信息中心 美国弗吉尼亚州 192.112.36.4
H 美国陆军研究所 美国-马里兰州 128.63.2.53
I Autonomica公司 瑞典-斯德哥尔摩 192.36.148.17
J VeriSign公司 美国-弗吉尼亚州 192.58.128.30
K RIPE NCC 英国-伦敦 193.0.14.129
L IANA 美国-弗吉尼亚州 199.7.83.42
M WIDE Project 日本-东京 202.12.27.33

 


 

安装并部署Bind服务程序

 BIND(Berkeley Internet Name Domain,伯克利因特网名称域)服务是全球范围内使用最广泛、最安全可靠且高效的域名解析服务程序。建议在生产环境中安装部署bind服务程序时加上chroot(俗称牢笼机制)扩展包,以便有效地限制bind服务程序仅能对自身的配置文件进行操作,以确保整个服务器的安全

安装bind服务程序:yum install -y bind-chroot

bind服务程序中有三个比较关键的文件:

  • 主配置文件(/etc/named.conf):里面的参数用来定义bind服务程序的运行。
  • 区域配置文件(/etc/named.rfc1912.zones):用来保存域名和IP地址对应关系的所在位置。对应着每个域和相应IP地址所在的具体位置,当需要查看或修改时,可根据这个位置找到相关文件。
  • 数据配置文件目录(/var/named):该目录用来保存域名和IP地址真实对应关系的数据配置文件。

bind服务程序名称为named,在部署bind服务之前要先修改bind服务程序的主配置文件/etc/named.conf,使得服务器上的所有IP地址均可提供DNS域名解析服务,以及允许所有人对本服务器发送DNS查询请求

vim /etc/named.conf               #在11行和17行,地址均改为any
...
11 listen-on port 53 { any; };    #服务器上的所有IP地址均可提供DNS域名解析服务。原始值为127.0.01
...
17 allow-query { any; };          #允许所有人对本服务器发送DNS查询请求。原始值为localhost
...

如果遇到启动bind服务程序失败的情况,可以执行以下命令:

  • named-checkconf命令:检查bind服务程序主配置文件/etc/named.conf 中语法或参数的错误。
  • named-checkzone命令:检查bind服务程序数据配置文件/var/named/xxxx中语法或参数的错误。

正反向解析配置实验

正向(域名/主机名 -> IP),反向(IP -> 域名)。

配置正反向解析需要编辑区域配置文件和数据配置文件。

第1步:编辑区域配置文件(/etc/named.rfc1912.zones)。

区域配置文件用来保存域名和IP地址对应关系的所在位置。在这个文件中,定义了域名与IP地址解析规则保存的文件位置以及服务类型等内容,而没有包含具体的域名、IP地址对应关系等信息。服务类型有三种,分别为hint(根区域)、master(主区域)、slave(辅助区域),其中常用的master和slave指的就是主服务器和从服务器

vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {             #正向解析参数
type master;                           #服务类型为主服务器
file "linuxprobe.com.zone";            #域名与IP地址解析规则保存的文件位置(/var/named/linuxprobe.com.zone)
allow-update {none;};                  #允许哪些客户机动态更新该解析信息(这里不允许任何人)
};
zone "10.168.192.in-addr.arpa" IN {    #反向解析参数,表示192.168.10.0./24网段的反向解析区域
type master;
file "192.168.10.arpa";
};

第2步:编辑数据配置文件(var/named/xxxx)。(文件名在编辑区域配置文件时已经自定义)

从/var/named目录中复制一份正向解析的模板文件(named.localhost)反向解析的模板文件(named.loopback)。然后把域名和IP地址的对应数据填写数据配置文件中并保存。在用cp命令复制时一定要加上-a参数,保留原始文件的所有者、所属组、权限属性等信息,这里的权限至关重要!以便让bind服务程序顺利读取文件内容

注意域名最后一个“.”,在输入网址时通常为了方便而省略,但在做dns配置时不能省略掉

cd /var/named/
cp -a named.localhost linuxprobe.com.zone
cp -a named.loopback 192.168.10.arpa
vim linuxprobe.com.zone                                               #编辑正向解析数据配置文件
$TTL 1D                                                               #生存周期为1天
@       IN SOA linuxprobe.com. root.linuxprobe.com. (                 #授权信息开始(Start Of Authority) 域名 域名管理员邮箱(邮箱的@符号用.代替)
                                                     0  ;  serial     #更新序列号(该序列号作为slave与master更新的依据,一般利用日期来设定)
                                                     1D ;  refresh    #更新时间(命令slave多久进行一次主动更新)
                                                     1H ;  retry      #重试延时(当到了refresh时间但slave无法连接master时重试连接的时间间隔)
                                                     1W ;  expire     #失效时间(当slave一直无法连接上master,则经过expire的时间后命令)
                                                     3H);  minimum    #无效解析记录的缓存时间(没有指定生存期的数据,可以保存在数据库中的时间和TTL)    
        NS ns.linuxprobe.com.                                         #域名服务器记录(Name Server,NS后面接的一定是主机名称)
ns      IN A 192.168.10.10                                            #地址记录(A表示正向解析的标记,格式 [hostname] IN A [IP])
        IN MX 10 mail.linuxprobe.com.                                 #邮箱交换记录(MX与Mail Server有关,用途是邮件转发,MX后的数值越小越优先,后面的hostname必须有一条A记录)
mail    IN A    192.168.10.10    
www     IN A    192.168.10.10    
bbs     IN A    192.168.10.20 vim 192.168.10.arpa #编辑反向解析数据配置文件
$TTL 1D                
@       IN SOA linuxprobe.com. root.linuxprobe.com.(
                                                    0  ;  serial
                                                    1D ;  refresh
                                                    1H ;  retry
                                                    1W ;  expire
                                                    3H);  minimum    
        NS    ns.linuxprobe.com.    
ns      A     192.168.10.10    
10      PTR   ns.linuxprobe.com.                                      #PTR为指针记录,仅用于反向解析(格式: [IP] IN PTR [主机名称])
10      PTR   mail.linuxprobe.com. 10      PTR   www.linuxprobe.com. 20      PTR   bbs.linuxprobe.com.

 第3步:把网卡的DNS地址修改为本机的IP地址,重启网卡服务和named服务,用nslookup命令检验正反向解析结果。

nslookup命令用于检测能否从DNS服务器中查询到域名与IP地址的解析记录,进而更准确地检验DNS服务器是否已经能够为用户提供服务。

vim /etc/sysconfig/network-scripts/ifcfg-eno16777728    #修改网卡参数
...
DNS=192.168.10.10                                       #把DNS地址改为本机ip地址
...
systemctl restart network                               #重启网卡服务
systemctl restart named                                 #重启named服务
nslookup                                                
>www.linuxprobe.com                                     #显示提供正向解析的服务器为192.168.10.10,解析出IP:192.168.10.10
>bbs.linuxprobe.com                                     #解析出IP:192.168.10.20
>mail.linuxprobe.com                                    #解析出IP:192.168.10.10
>192.168.10.10                                          #显示提供反向解析的服务器为192.168.10.10,解析出域名:ns/www/mail.linuxprobe.com.
>192.168.10.20                                          #解析出域名:bbs.linuxprobe.com.

 

 


 

部署从服务器

在上一节实验的基础上,以客户端192.168.10.20作为从服务器,从主服务器192.168.10.10上同步数据配置文件。

主服务器192.168.10.10要做的更改:

  1. 更改主服务器的区域配置文件,使其允许指定从服务器的更新请求,然后重启DNS服务程序;
  2. 如果从服务器配置好,且重启DNS服务很多次,但依然无法从主服务器同步数据配置文件,则清空主服务器的iptables防火墙
vim /etc/named.rfc1912.zones           #更改主服务器的区域配置文件,使其允许指定从服务器的更新请求
zone "linuxprobe.com" IN {
type master;
file "linuxprobe.com.zone";
allow-update { 192.168.10.20; };       #允许来自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; };
};
systemctl restart named                #重启named服务
iptables -F                            #清空iptables防火墙
service iptables save                  

从服务器要做的工作:

  1. 安装bind服务程序;
  2. 编辑主配置文件,使得服务器上的所有IP地址均可提供DNS域名解析服务,以及允许所有人对本服务器发送DNS查询请求;
  3. 编辑区域配置文件,填写主服务器的IP地址与要抓取的区域信息;
  4. 修改网卡DNS为本机IP,重启网卡服务和DNS服务。
yum install -y bind-chroot
vim /etc/named.conf
...
11 listen-on port 53 { any; };
...
17 allow-query { any; };
...
vim /etc/named.rfc1912.zones                            #编辑区域配置文件
zone "linuxprobe.com" IN { 
type slave;                                             #从服务器类型为slave
masters { 192.168.10.10; };                             #指明主服务器ip地址
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";
};
vim /etc/sysconfig/network-scripts/ifcfg-eno16777728    #修改网卡DNS参数
...
DNS=192.168.10.20
...
systemctl restart network                               #重启网卡服务
systemctl restart named                                 #重启named服务
cd /var/named/slaves                                    #进入同步数据配置文件的存放位置/var/named/slaves
ls                                                      #看到有对应的数据配置文件(内容经过加密),说明同步成功
nslookup                                                #检验提供DNS解析服务的是不是本机自身
>192.168.10.10                                          
>www.linuxprobe.com                                     #显示由192.168.10.20提供DNS解析,解析出对应IP为192.168.10.10

 


 

安全的加密传输

bind服务程序为了提供安全的解析服务,已经对TSIG(RFC 2845)加密机制提供了支持。TSIG主要是利用了密码编码的方式来保护区域信息的传输(Zone Transfer),即TSIG加密机制保证了DNS服务器之间传输域名区域信息的安全性。

在上一节实验基础上,配置TSIG加密传输功能,使得只有拥有与主服务器相同的密钥认证文件的从服务器才能从主服务器更新DNS信息。

dnssec-keygen命令:用于生成安全的DNS服务密钥,格式:dnssec-keygen [参数]。

dnssec-keygen命令的常用参数:

参数 作用
-a 指定加密算法,包括RSAMD5(RSA)、RSASHA1、DSA、NSEC3RSASHA1、NSEC3DSA等
-b 密钥长度(HMAC-MD5的密钥长度在1~512位之间)
-n 密钥的类型(HOST表示与主机相关)

主服务器要做的工作:

  1. 生成DNS服务密钥(公钥+私钥),查看生成的私钥文件,复制key参数值;
  2. 进入bind服务程序用于保存配置文件的目录/var/named/chroot/etc/,创建密钥验证文件tansfer.key。把该文件做一个硬链接到/etc目录中。为安全起见,把文件所属组改为named,降低文件权限。
  3. 开启并加载Bind服务的密钥验证功能。先在主服务器的主配置文件中加载密钥验证文件,然后进行设置,使得只允许带有master-slave密钥认证的DNS服务器同步数据配置文件,重启named服务。
dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave    #生成一个主机名称为master-slave的128位HMAC-MD5算法的密钥文件(公钥+私钥)
ls -al Kmaster-slave.+157+46845.*                        #运用通配符查看生成的密钥文件,会有一个私钥文件(后缀为private)和公钥文件(后缀为key)
cat Kmaster-slave.+157+46845.private                     #查看私钥文件,复制当中的key参数值
...
Key: 1XEEL3tG5DNLOw+1WHfE3Q==
...
cd /var/named/chroot/etc/                                #进入bind服务程序用于保存配置文件的目录
vim transfer.key                                         #创建密钥验证文件
key "master-slave" {                                     #密钥名称
algorithm hmac-md5;                                      #加密算法
secret "1XEEL3tG5DNLOw+1WHfE3Q==";                       #私钥加密字符串
};
chown root:named transfer.key                            #把文件所属组改为named
chmod 640 transfer.key                                   #降低文件权限
ln transfer.key /etc/transfer.key                        #创建一个密钥验证文件的硬链接到/etc目录(配置主配置文件时需要,密钥验证文件必须在/etc目录)
vim /etc/named.conf                                      #编辑bind服务主配置文件,开启并加载Bind服务的密钥验证功能
...
9 include "/etc/transfer.key";                           #密钥验证文件必须在/etc目录
18 allow-transfer { key master-slave; };                 #只允许拥有该密钥验证文件的人进行同步
...
systemctl restart named                                  #重启bind服务程序

之后,清空从服务器/var/named/slaves目录中从主服务器同步过来的数据配置文件,然后重启bind服务,发现已经无法再从主服务器获取到数据配置文件了。

rm -rf /var/named/slaves/*    #清空目录下所有数据配置文件
systemctl restart named       #重启bind服务
ls /var/named/slaves          #再查看slaves目录,发现依然为空,此时从服务器无法再从主服务器中获取数据配置文件

从服务器要做的工作:

  1. 在bind服务程序的配置文件目录中创建密钥认证文件(步骤和参数跟主服务器中的设置一样),并设置相应的权限,然后把该文件做一个硬链接到/etc目录中;
  2. 开启并加载从服务器的密钥验证功能(与主服务器中的设置稍有不同)。在主配置文件中加载密钥认证文件,然后按照指定格式写上主服务器的IP地址和密钥名称,重启bind服务。
cd /var/named/chroot/etc              #进入bind服务程序的配置文件目录
vim transfer.key                      #创建密钥认证文件(参数和主服务器的密钥验证文件一样)
key "master-slave" {
algorithm hmac-md5;
secret "1XEEL3tG5DNLOw+1WHfE3Q==";    
};
chown root:named transfer.key
chmod 640 transfer.key
ln transfer.key /etc/transfer.key     #创建密钥验证文件的硬链接
vim /etc/named.conf
...
9 include "/etc/transfer.key"; 
...
43 server 192.168.10.10               #指明主服务器的IP地址和密钥名称
44 {
45 keys { master-slave; };
46 }; 
...
systemctl restart named
ls /var/named/slaves/                 #重启bind服务后,查看slaves目录,又能从主服务器同步到数据配置文件

 


 

部署缓存服务器(仅供了解,实验不成功很平常)

DNS缓存服务器(Caching DNS Server)是一种不负责域名数据维护的DNS服务器。缓存服务器就是把用户经常使用到的域名与IP地址的解析记录保存在主机本地,从而提升下次解析的效率(最多只是毫秒级的提升,意义不大)。DNS缓存服务器一般用于经常访问某些固定站点而且对这些网站的访问速度有较高要求的企业内网中,但实际的应用并不广泛。

此实验很简单,配置是不会有错的,但至于为什么客户机不能解析dns,很大原因可能出在上级DNS服务器不允许同步DNS信息。上级DNS服务器地址指的是获取数据配置文件的服务器

缓存服务器准备两张网卡,一张桥接(能上外网),一张仅主机模式(只能主机间通信),客户机只有一张仅主机模式网卡。只要客户机能解析外网的DNS,就说明一定是由缓存服务器提供域名解析服务的。

缓存服务器需要做的:配置bind服务程序的主配置文件,添加缓存转发参数,重启bind服务。

vim /etc/named.conf
...
17 forwarders { 8.8.8.8; };    #上级DNS服务器地址最好ping测试下,ping通再用
...
systemctl restart named        #重启bind服务

客户机需要做的:修改网卡参数,把DNS地址改为缓存服务器的IP,重启网卡。

vim /etc/sysconfig/network-scripts/ifcfg-eno16777728
...
DNS=192.168.10.10
...
systemctl restart network

随后客户机用nslookup测试外网网站,检验DNS能否被解析。

 


 

分离解析技术

 当一个网站知名度越来越高,海内外都有用户,仅仅把网站部署在一个地方,势必造成部分用户访问速度很慢,因此知名度极高的网站通常需要在全球各地部署服务器,通过DNS服务的分离解析功能,即可让位于不同地理范围内的读者通过访问相同的网址,而从不同的服务器获取到相同的数据

图解:

《Linux就该这么学》培训笔记_ch13_使用Bind提供域名解析服务

DNS服务器需要做的:

  1. 配2块仅主机模式网卡,地址分别为122.71.115.10(北京)和106.185.25.10(美国);
  2. 配置bind服务的主配置文件。删除51-54行的根域信息DNS分离解析功能和DNS根服务器配置参数有冲突);
  3. 编辑区域配置文件;
  4. 建立数据配置文件(正向解析),重启bind服务;
vim /etc/named.conf               #配置bind服务的主配置文件
...
11 listen-on port 53 { any; }; 
...
17 allow-query { any; };
...
51 # zone "." IN {                #注释等同删除,删除根域信息
52 # type hint;
53 # file "named.ca";    
54 # };
vim /etc/named.rfc1912.zones              #编辑区域配置文件
1 acl "china" { 122.71.115.0/24; };       #使用acl参数分别定义两个变量名称(china与american),后续参数china=122.71.115.0/24 2 acl "american" { 106.185.25.0/24; };    
3 view "china"{                           #通过判断用户的IP地址属于哪个网段,然后去分别加载不同的数据配置文件(linuxprobe.com.china或linuxprobe.com.american)
4 match-clients { "china"; };
5 zone "linuxprobe.com" {                 #常规的zone参数定义
6 type master;
7 file "linuxprobe.com.china";
8 };
9 };
10 view "american" {
11 match-clients { "american"; };
12 zone "linuxprobe.com" {
13 type master;
14 file "linuxprobe.com.american";
15 };
16 };
cd /var/named                                    #进入存放数据配置文件的目录
cp -a named.localhost linuxprobe.com.china       #复制两份正向解析的模板
cp -a named.localhost linuxprobe.com.american    
vim linuxprobe.com.china
$TTL 1D                  
@       IN SOA linuxprobe.com. root.linuxprobe.com. (    
                                                     0  ;  serial    
                                                     1D ;  refresh    
                                                     1H ;  retry   
                                                     1W ;  expire   
                                                     3H ;) minimum    
NS      ns.linuxprobe.com.    
ns      IN A    122.71.115.10    
www     IN A    122.71.115.15   
vim linuxprobe.com.american
$TTL 1D     
@       IN SOA linuxprobe.com. root.linuxprobe.com. (    
                                                     0  ;  serial    
                                                     1D ;  refresh   
                                                     1H ;  retry    
                                                     1W ;  expire    
                                                     3H ;) minimum    
NS      ns.linuxprobe.com.   
ns      IN A    106.185.25.10    
www     IN A    106.185.25.15   
systemctl restart named    #重启bind付务                  

客户机需要做的:

分别设置网卡地址为122.71.115.1(北京)和106.185.25.1(美国),将DNS地址分别设置为服务器主机的两个IP地址:122.71.115.10(北京)和106.185.25.10(美国),nslookup测试。

 


 

书本笔记

《Linux就该这么学》培训笔记_ch13_使用Bind提供域名解析服务

《Linux就该这么学》培训笔记_ch13_使用Bind提供域名解析服务

《Linux就该这么学》培训笔记_ch13_使用Bind提供域名解析服务

《Linux就该这么学》培训笔记_ch13_使用Bind提供域名解析服务

 《Linux就该这么学》培训笔记_ch13_使用Bind提供域名解析服务