搞它!!!深入了解DNS域名解析服务,教你搭建一个属于自己的DNS服务器(正向解析、反向解析、泛域名解析、邮件交换解析、别名解析、分离解析,主从结构解析)

2020-09-03 10:07:31 浏览数 (1)

一、 DNS系统

1、DNS系统简介

我们知道用户在与互联网上的主机通信时,必须知道对方的 IP 地址。但是每个 IP 地址都是由 32 位的二进制组成,即使是十进制的 IP 地址表示形式,用户想要记住也是很难的一件事,况且互联网有那么多的主机。

互联网中的主机通常不仅仅只有 IP 地址,还有对应的便于用户记忆的主机名字,比如 www.baidu.com/。产生于应用层上的域名系统 NDS(Domain Name System)就可以用来把互联网上的主机名转换成 IP 地址。

互联网中的域名系统 DNS 被设计成一个层次树状结构的联机分布式数据库系统,并且采取的是客户服务器的方式。DNS 使大多数名字都在本地进行解析,只有少量的解析需要在互联网通信,因此效率很高。采取分布式的一个好处是,即使单个计算机出了故障,也不会妨碍 DNS 系统的正常运行。

域名到 IP 地址的解析是通过许多分布在互联网上的域名服务器完成的。解析的主要过程如下:当一个主机中的进程需要把域名解析为 IP 地址时,该进程就会调用解析程序,并成为 DNS 的 一个客户,把待解析的域名放在 DNS 的请求报中,以 UDP 用户数据报方式发送给本地域名服务器。本地域名服务器在查找域名后,把对应的 IP 地址放在回答报文中返回。获得 IP 地址的后主机即可进行通信。

2、域名结构

我们通过域名树的方式来查看域名的结构,可以看出来,它实际上是一个倒过来的树,最上面的是根,没有对应的名字。因为根没有名字,所以根下面的一级节点就是顶级域名,往下同理。我们以 www.baidu.com/ 为例,www 是三级域名,baidu 是二级域名,com 是顶级域名,各级域名之间通过 . 相连。每个互联网上的主机域名都对应一个 IP 地址,并且这个域名在互联网中是唯一的。

3、域名服务器

根据域名服务器所起到的作用,可以把域名服务器分为四种不同的类型。

(1)根域名服务器

根域名服务器(root name server)是最高层次的域名服务器,也是最重要的域名服务器,全球共设有 13 个根域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和 IP 地址。当其他的域名服务器无法解析域名时,会首先求助于根域名服务器。假如所有的根域名服务器都挂了,那么整个互联网的 DNS 系统就无法工作了,因为采取的分布式结构,所以只要有一台能够正常工作,互联网的 DNS 系统就不会受到影响。

(2)顶级域名服务器(TLD)

顶级域名服务器(top-level-domain) 负责管理在该顶级域名服务器上注册的所有二级域名。当收到 DNS 查询请求时,就给出相应的回答。

(3)权限域名服务器

它是负责一个区的域名服务器,当一个权限域名服务器没有给出最后的查询结果时,就会告诉发出查询请求的 DNS 客户,下一步应当查询哪一个权限域名服务器。

(4)本地域名服务器

本地域名服务器(local name server)并不属于上面图示的服务器层次结构,但是它在域名服务系统却发挥着至关重要的作用。当一台主机发出 DNS 查询请求时,这个查询请求报文就会发送给本地域名服务器。每一个互联网提供者,或者一个大学,甚至小到一个学院,都可以拥有一台本地域名服务器,这种域名服务器也被称为默认域名服务器。我们本地网络服务连接的域名服务器指的就是本地域名服务器。

4、域名解析过程

域名解析查询的方式有两种:迭代查询与递归查询。

(1)迭代查询

本地域名服务器向根域名服务器的查询方式通常采取迭代查询(iterative query)。迭代查询有以下的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“我这里没有你要的查询结果,你需要向哪一台域名服务器进行查询”。然后本地域名服务器进行后续的查询(不替代本地域名服务器)。

(2)递归查询

主机向本地域名服务器的查询一般都采用递归查询(recursive query)。所谓的递归查询就是:如果主机所询问的本地域名服务器不知道被查出来的域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文(替代该主机继续查询),而不是主机自己进行下一步的查询。因此,递归查询返回的结果要么是所查询的 IP 地址,要么报错,表示无法查到所需要的 IP。

5、DNS记录缓存

针对上面两种方式,我们可以知道不管是递归查询还是迭代查询,都会发送 8 个 UDP 用户数据报的报文。为了提高 DNS 的查询效率,减轻根域名服务器的负荷和 DNS 数据报的查询数量,在域名服务器中广泛地使用了高速缓存。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。

假设我们要查询www.baidu.com/域名对应的 IP 地址,如果本地域名服务器上有该域名对应的 IP 地址,那么可以直接从本地域名服务器上获得对应的 IP 地址,而不需要到根域名服务器上进行查询。当本地域名服务器查询不到 IP 地址时,本地域名服务器也可以不向根域名服务器发送请求报文,而是直接向顶级域名服务器发送查询请求报文。

不仅在本地域名服务器中有高速缓存,在主机中也有。很多主机在启动的时候从本地域名服务器下载名字和地址的全部数据库,维护存放自己使用的域名的高速缓存,只有在缓存中找不到名字时才使用域名服务器。

二、 BIND 域名服务

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

1 BIND服务简述

BIND(Berkeley Internet Name Daemon) 伯克利Internet域名服务 相关软件包 bind-9.9.4-37.el7.x86_64.rpm bind-untils-9.9.4-37.el7.x86_64.rpm bind-libs-9.9.4-37.el7.x86_64.rpm bind-chroot-9.9.4-37.el7.x86_64.rpm

2、 BIND 域名服务端程序

主要执行程序: /usr/sbin/named 默认监听端口:53 TCP负责连接控制,UDP负责快速解析 主配置文件: /etc/bind/named.conf 保存DNS解析记录的数据文件位于 /var/named/

3 、BIND程序主配置文件/etc/bind/named.conf

全局配置部分 设置DNS服务器的全局参数 包括监听地址/端口、数据文件的默认位置等 使用options { … };的配置段

代码语言:javascript复制
[root@localhost ~]# vim /etc/named.conf

options {		'选项'
        listen-on port 53 { any; };	'监听地址所有'
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";	'目录在/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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };		'允许所有网网段前来解析'

4、区域配置文件 /etc/named.rfc1912.zones

设置本服务器提供域名解析的特定DNS区域 包括域名、服务器角色、数据文件名等 使用zone “区域名” IN { … }; 的配置段

代码语言:javascript复制
#正向解析
zone "localhost" IN {		'主机名,例kgc.com'
        type master;	'master类型,主服务器'
        file "named.localhost";		'区域数据文件名,A记录,可以解析主机头,'
        allow-update { none; };		'允许更新'
        allow-transfer { 173.16.16.2 }	'从服务器的IP地址'
};  

#反向解析
zone "16.16.173.in-addr.arpa" IN {		'ip地址反写'
        type master;			'主服务器'
        file "named.loopback";		'区域配置文件名'
        allow-update { none; };		'允许更新'
};

5、区域数据配置文件/var/named/目录下

代码语言:javascript复制
$TTL 1D		'有效解析记录的生命周期'
@       IN SOA  @ rname.invalid. (		'SOA标记、@域名、管理者邮箱'
                                        0       ; serial	
                                        '更新序列号,可以是10位以内的整数,当前0'
                                        1D      ; refresh	
                                        '刷新时间,重新下载地址数据的间隔,1天'
                                        1H      ; retry	
                                        '重试延时,下载失败后的重试间隔,1小时'
                                        1W      ; expire	
                                        '失效时间,超过改时间仍无法下载则放弃,1周'
                                        3H )    ; minimum	
                                        '无效解析记录的生存周期 3小时'
        NS      @	'@指自己'
        A       127.0.0.1	'回环地址,此行的首位没写,默认是自己的主机名,即输入自己的主机名就是在ping自己'
        AAAA    ::1
        @	IN	NS	ns1.bdqn.com.	'自己的域名叫做ns1.bdqn.com.'
	IN	MX 10	mail.bdqn.com.	'自己的邮件交换系统优先级别10的叫做mail.bdqn.com.'
ns1	IN	A	58.119.74.203	'主机名即主机头为ns1时,对应的ip地址58.119.74.203'
www	IN	A	173.16.16.1		'主机名为www时,对应的ip地址为为173.16.16.1'
mail	IN	A	173.16.16.4	
ftp	IN	CNAME	www	'cname,别名,即输入ftp相当于输入www'

~                       

三、正向解析搭建

第一步、进入到主配置文件

代码语言:javascript复制
[root@dns named]# vim /etc/named.conf	'配置主配置文件'
options {
        listen-on port 53 { any; };	'监听地址修改为所有'
        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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };	'允许所有主机前来解析'

第二步、配置区域文件

代码语言:javascript复制
[root@client named]# vim /etc/named.rfc1912.zones	'配置区域配置文件'

zone "shang.com" IN {			'创建一个kgc.com正向解析区域'
        type master;
        file "shang.com.zone";	
        '存放文件在默认目录/var/named下,名为shang.com.zone文件,若是没有需要自己创建'
        allow-update { none; };
}; 

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};

第三步、配置区域数据文件

代码语言:javascript复制
[root@client named]# cp -p named.localhost shang.com.zone
				'保留权限复制模板,重命名为kgc.com.zone'
[root@client named]# vim kgc.com.zone 	''修改区域数据,

$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1
www IN   A      192.168.110.132

第四步、host解析

代码语言:javascript复制
[root@client etc]# vim /etc/resolv.conf         ' 进入到DNS域名解析配置文件'
[root@client etc]# host www.shang.com             'host 解析一下'
www.shang.com has address 192.168.110.132         '解析成功'

四、反向域名解析记录 PTR

第一步、进入到主配置文件

代码语言:javascript复制
[root@dns named]# vim /etc/named.conf	'配置主配置文件'
options {
        listen-on port 53 { any; };	'监听地址修改为所有'
        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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };	'允许所有主机前来解析'

第二步、配置区域文件

代码语言:javascript复制
[root@client named]# vim /etc/named.rfc1912.zones	'配置区域配置文件'




        zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};

zone "110.168.192.in-addr.arpa" IN {       '反向解析要将ip倒过来写  还得少写一个,'
        type master;
        file "zhen.com.zone";             '  指向区域数据文件'

};

第三步、配置区域数据文件

代码语言:javascript复制
```handlebars
[root@client named]# cp -p named.localhost zhen.com.zone   ' 复制模板新建数据文件'
[root@client named]# vim zhen.com.zone                    ' 具体编辑在最下面的代码块'
[root@client named]# systemctl restart named               '因为之前修改服文件,要重新启动文件'
[root@client named]# host 192.168.110.100                'host反向解析   成功'
100.110.168.192.in-addr.arpa domain name pointer www.zhen.com.110.168.192.in-addr.arpa.



$TTL 1D
@       IN SOA  zhen.com. admin.zhen.com. (    '这里要注意,要将@改过了,'
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1
100 IN  PTR     www.zhen.com

五、泛域名解析和别名解析、邮件交换记录解析

邮件交换记录(MX)解析

第一步:先将域名mail.XXX.XXX用A记录解析到对应服务器IP,如:这里将mail.etlfreight.com用A记录解析到122.49.1.217;

第二步:将域名XXX.XXX用MX解析到mail.XXX.XXX,如这里将etlfreight.com用MX解析到mail.etlfreight.com;

代码语言:javascript复制
  $TTL 1D
@       IN SOA  zhen.com. admin.zhen.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1
100 IN  PTR     www.zhen.com                '反向解析'
www IN   A      192.168.110.132             '正向解析'
mail IN  A     192.168.100.100             ' ;mail正向解析'
smtp IN  A      mail                      '  mail的别名解析'
*   IN   A      6.6.6.6                    ' 泛域名解析'
IN  MX   5       mail.zhen.com           '   邮件交换解析'
~                                                                                      
~                                                              

六、主从解析

1、什么是主从解析、我为什么要做它

主域名服务器:通常架设在Internet环境中,提供某一个或某几个域内的主机名与IP地址的查询服务。

从服务器:为了分担域名查询的压力,提供区域数据的备份,有时还会另外架设一台从域名服务器,与主域名服务器同时提供服务。

第一步、设置从域名服务器(centos 7-2)主配置文件

代码语言:javascript复制
[root@localhost ~]# yum install bind -y	'安装bind工具'
    
[root@localhost ~]# vim /etc/named.conf		
    ...省略内容
options {
        listen-on port 53 { any; };	'修改成any'
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
  ...省略
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };	'修改成any'
...省略内容

第二步、设置从域名服务器(centos 7-2)的区域配置文件

代码语言:javascript复制
[root@localhost ~]# vim /etc/named.rfc1912.zones 
...省略内容		'添加以下内容'
zone "666.com" IN {		'设置域名'
        type slave;		'类型设置成从域名'
        file "slaves/666.com.zone";	'指定文件'
        masters {192.168.197.139; };	'设置主域名服务器的IP地址'
};
...省略内容
[root@localhost named]# ls /var/named/slaves
'发现没有文件,是因为主域名服务器还没有设置好,主域名服务器设置完成后,就可以同步自动生成666.com.zone文件了'

第三步、设置主域名服务器(centos 7-1)的主配置文件

代码语言:javascript复制
[root@localhost ~]# yum install bind -y	'安装bind工具'
[root@localhost named]# rpm -qc bind
/etc/logrotate.d/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/sysconfig/named
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback

[root@localhost ~]# vim /etc/named.conf		
    ...省略内容
options {
        listen-on port 53 { any; };	'修改成any'
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
  ...省略
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };	'修改成any'
...省略内容

第四步、设置主域名服务器(centos 7-1)的区域配置文件和区域数据配置文件

代码语言:javascript复制
[root@localhost ~]# vim /etc/named.rfc1912.zones 
    ...省略内容  '添加以下内容'
zone "666.com" IN {
        type master;	'设置类型为主服务器'
        file "666.com.zone";	'生成区域配置文件'
        allow-transfer { 192.168.197.142; };	'设置从服务器IP地址'
};
代码语言:javascript复制
[root@localhost ~]# cd /var/named
[root@localhost named]# ls
data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves
[root@localhost named]# cp -p named.localhost 666.com.zone	'将区域配置文件模板保留权限复制并改名为设置的666.com.zone'
[root@localhost named]# vim 666.com.zone 
$TTL 1D
@       IN SOA  666.com. rname.invalid. (		'域名设置666.com'
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      666.com.	'域名设置666.com'
        A       127.0.0.1
www IN  A       6.6.6.6		'设置www.666.com对应的IP地址'

第五步、主域名路由器开启服务并关闭防火墙

代码语言:javascript复制
[root@localhost named]# systemctl restart named
[root@localhost named]# systemctl stop firewalld.service 
[root@localhost named]# setenforce 0
'从域名路由器开启服务并关闭防火墙'
[root@localhost named]# systemctl restart named
[root@localhost named]# systemctl stop firewalld.service 
[root@localhost named]# setenforce 0
[root@localhost named]# ls slaves		'再次查看,发现slaves文件已经自动同步'
666.com.zone

七、分离解析

1、什么是分离解析,为什么要做分离解析

DNS的分离解析,是指根据不同的客户端提供不同的域名解析记录。来自不同地址的客户机请求解析同一域名时,为其提供不同的解析结果。也就是内外网客户请求访问相同的域名时,能解析出不同的IP地址,实现负载均衡。 比如说,国内有一家跨国公司,而且这家公司业务非常繁忙,如果把此公司的web服务部署在北京机房,国外的用户访问速度肯定会受到限制。但如果把web服务部署在国外机房,国内用户的访问速率也肯定会很慢。 那么,怎么来解决我们这个问题呢?这就是我们今天要说的DNS分离解析技术

2、实验需求

主机名

主机ip地址

DNS

192.168.110.1/12.0.0.1

内网

192.168.110.100

外网

12.0.0.12

3、实验步骤

第一步、DNS服务器加一块网卡、配置双网卡ip地址

因为这里是copy ens33的UUID所以要注释掉、 别忘了把网卡名字改了

配置外网的win10的ip以及dns

第二步、配置dns主配置文件

如下、直接改成any就行

第三步、更改区域文件

区域文件直留着这些,剩下全部干掉

然后重新回到主文件内 将这段复制过后直接干掉

第四步 配置区域数据文件

外网wan配置文件

内网lan配置文件

第五步、使得dns服务器具有路由功能,内网和外网互通

具体编辑如下

第六步、启动服务 、关闭防火墙、增强型安全防护

不仅服务器要关 其它两台也得关

第七步、验证

这时已经解析出来了,

路由功能也管用了

总结

因为步骤比较多,当出现问题的时候首要针对两个方面进行排障 第一 网络方面 第二 服务方面 一般网络方面就是ping dns解析的地址 如果连这个都没通,就别想着搭服务了 (1)重点一:网卡配置一定要把dns注释掉,双网卡复制后要把名字改了UUID注释掉 (2)重点二:别觉得ping不通就是服务出错了,你搭建的局域网中都没有这台主机怎么可能ping的通 (3)细心再细心 一般服务方面重点就是 区域数据文件的配置 因为你区域问件出错了你连服务都起不来 (1)记得把主配置文件里复制过来的删了 (2)起不来服务是正常的,每个人都有疏忽的时候,用systemctl status named看一下简单的日志信息 (3)区域文件指向什么文件名字就要用什么文件名字,cp的时候记得带属性copy,不然你会后悔的 (4)新手改文件记得copy,玩坏了还有备份

0 人点赞