• DNS服务器原理简述、搭建主/从DNS服务器并实现智能解析


    1. TLD:Top Level Domain 顶级域名

    组织域:.com, .net, .org, .gov, .edu, .mil
    国家域:.iq, .tw, .hk, .jp, .cn, ...

    2. 域名分级

    根域名: .
    顶级域名:.com .edu .gov .int .net .cn .us .jp ........
    二级域名:baidu.com microsoft.com jd.com qq.com aliyun.com edu.cn
    三级域名:map.baidu.com nankai.edu.cn
    四级域名:www.nankai.edu.cn cs.nankai.edu.cn

    3. DNS查询类型

    DNS查询类型分为递归查询和迭代查询;
    递归查询的意思是找了谁谁就一定要给出答案。那么允许递归的意思就是帮忙去找位置,如A对B允许递归,那么B询问A时,A就去帮忙找答案;
    迭代查询的意思是如果A不允许对B递归,那么A就会告诉B的下一层域的地址让B自己去找,如果迭代查询最终得出了答案,那一定是权威答案;

    4. DNS名称解析方式

    正向解析: hostname ---> IP
    访问示例:

    A客户端请求www.jzbg.com --> 由DNS服务器完成(1、查询本地缓存记录和hosts文件,如果有直接返回,2、向root"."发起查询查询,查询.com的NS记录返回其.com的NS服务器))--->再向.com的NS服务器查询"jzbg.com"域的NS服务器,并返回其结果值---->根据jzbg的NS服务器记录地址,---> NS服务器查询其所对应的www主机所对应的IP地址,并返回给服务器。
    
    正向解析的层级如下:
    .
    com
    jzbg
    www
    
    由于缓存是多层次缓存的,所以真正的查询可能并没有那么多步骤,上图的步骤是完全没有所需缓存的查询情况。假如某主机曾经向DNS服务器提交了www.jzbg.com的查询,那么在DNS服务器上除了缓存了www.jzbg.com的记录,还缓存了".com"和"jzbg.com"的记录,如果再有主机向该DNS服务器提交ftp.jzbg.com的查询,那么将跳过"."和".com"的查询过程直接向jzbg.com发出查询请求。
    

    反向解析: IP ---> hostname
    访问示例:

    A客户端想查询IP地址4.2.3.1反解记录 ---> 由DNS发起请求查询"."域,由"."返回其ip-addr.arpa的NS记录,--> 服务器查询ip-addr.arpa的NS服务器,由NS服务器返回"1"区域的NS服务器地址,并将结果返回到服务器--->服务器查询"1"区域中的记录,由"1"区域返回"2"区域中的NS记录--->服务器向"2"区域查询"3"区域,由2区域返回3区域中的NS记录--->服务器再让3区域中的NS记录,3区域查询并返回4的主机所对应的主机地址。
    
    反向解析的层级如下:
    .
    ip-addr.arpa
    1
    2
    3
    4 
    

    5. 反向解析的作用

    DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”,正向查找区域就是通常所说的域名解析,反向查找区域即是IP反向解析,它得到作用是通过查找IP地址的PTR记录来得到该IP地址指向的域名。要成功得到域名就必须有该IP地址的PTR记录。PTR及记录是邮件交换记录的一种,邮件交换记录中有A记录和PTR记录,A记录解析名字到地址,PTR记录解析地址到名字。
    反向域名解析系统(Reverse DNS)的功能确保适当的邮件交换记录是生效的。反向域名解析与通常的正向域名解析相反,提供IP地址到域名的对应。IP反向解析主要应用到邮件服务器中来阻拦垃圾邮件。多数垃圾邮件发送者使用动态分配或者没有注册域名的IP地址来发送垃圾邮件,以避免追踪,使用域名反向解析后,就可以大大降低垃圾邮件的数量。
    比如用xxx@name.com这个邮箱给kasum@lwork.com发一封信,lwork邮件服务器接到这封信会查看这封信的信头文件,这封信的信头文件会显示这封信是由哪个IP地址发出来的。然后根据这个IP地址进行反向解析,如果反向解析到这个IP对应的域名是name.com就接收这封邮件,如果反向解析这个IP没有对应到name.com,那么就拒绝这封邮件。
    由于在域名系统中,一个IP地址可以对应多个域名,因此从IP出发去找域名,理论上应该遍历整个域名树,但是这在internet上是不现实的。为了完成逆向域名解析,系统提供一个特别域,该特别域称为逆向解析域in-addr.arpa.这样欲解析的IP地址就会被表达城一种像域名一样的可显示串形式,后缀以逆向解析域域名“in-addr.arpa”结尾。

    测试反解(Windows方法)

    C:UsersAdministrator>nslookup -qt=ptr 111.204.53.64
    服务器:  xd-cache-1.bjtelecom.net
    Address:  219.141.136.10
    非权威应答:
    64.53.204.111.in-addr.arpa      name = mail.ybjt.net
    
    [c:~]$ nslookup -qt=ptr 123.59.246.200
    非权威应答:
    服务器:  xd-cache-1.bjtelecom.net
    Address:  219.141.136.10
    200.246.59.123.in-addr.arpa	name = mail.ehousechina.com
    

    测试反解(Linux方法)

    [Allen@master ~]$ dig -x 123.59.246.200 | grep -A1 "ANSWER SECTION"
    ;; ANSWER SECTION:
    200.246.59.123.in-addr.arpa. 21599 IN	PTR	mail.ehousechina.com.
    [Allen@master ~]$ dig -x 111.204.53.64 | grep -A1 "ANSWER SECTION"
    ;; ANSWER SECTION:
    64.53.204.111.in-addr.arpa. 37	IN	PTR	mail.ybjt.net.
    

    6. 权威答案与非权威答案

    • 权威答案:直接负责这个域的NS服务器返回的答案;
    • 非权威答案:服务器不负责这个域,只是因为之前解析过,所以缓存中有,返回缓存中的答案;将这种答案叫做非权威答案是因为,上级DNS可能随时会更新,而所查询的DNS服务器本地缓存不一定及时更新了,所以这时客户端得到的答案可能是无效的;

    7. 主/从DNS服务器

    • 主DNS服务器:维护所负责解析的域的数据库的服务器;读写操作均可进行;主服务器的数据会不断发生改变;
    • 从DNS服务器:从主DNS服务器那里或其它的从DNS服务器那里“复制”一份解析库;但只能进行读操作不能修改;从服务器的数据库要随时同步主服务器的数据;

    8. 主/从之间的同步方式

    在主DNS服务器上定义数据库的序号,当要改变数据库时,手动将序号增加,从DNS服务器每隔一段时间去同步时,根据这个序号判断是否更新自己的数据库(如果主DNS服务器的序号大,就要更新数据);
    配置文件中要需要定义一下几个计时器:

    • 刷新时间间隔refresh:表示从服务器多长时间去同步一次;
    • 重试时间间隔retry:表示同步不到时等待多长时间以后再尝试同步,重试时间要短于刷新时间;
    • 过期时长expire:表示从服务器始终联系不到主服务器时,多久之后放弃从主服务器同步数据;停止提供服务;
    • negative answer ttl: 否定答案的缓存时长;

    假如在刷新时间为5分钟,从服务器刚刷新完数据库,过1分钟后,主服务器就更新了数据库,那么在后面的4分钟之内,从服务器与主服务器的数据库是不同步的,如果在这段时间主服务器挂了,从服务器将没办法得到数据,也没办法向客户端提供最新数据服务,所以用刷新时间解决数据库更新同步是不完美的;

    9. 主实时的通知从更新数据

    主服务器数据库有变化,会立即通知从服务器更新数据库;这样数据库同步就有了两种叫法:一种站在从服务器角度是拉取,一种是站在主服务器角度描述推送;

    10. 区域传送

    当主服务器数据库量很大,有上万个域名解析,从服务器来来取数据库时,主服务器数据库只更新了一条信息,从服务器则不用把整个数据库同步一遍,而只需同步变化的数据即可;当从服务器是新数据库时才同步整个数据库;这个同步的过程也叫区域传送,有两种方式,一种是全量传送axfr,一种是增量传送ixfr;

    11. 创建主/从DNS,实现智能解析实验

    11.1. 基础信息说明

    • 二级域名:jzbg.com、jzbgsec.com
    • jzbg.com主DNS服务器:10.207.51.40:master.jzbg.com
    • jzbg.com从DNS服务器:10.207.51.30; 10.207.51.31:slave.jzbg.com
    • jzbgsec.com主DNS服务器:10.207.51.32:master.jzbgsec.com
    • web服务器:10.207.51.41:www.jzbg.com--->www.a.jzbgsec.com
    • web服务器:10.207.51.42:www.jzbg.com--->www.b.jzbgsec.com
    • client1:10.207.51.61
    • client2:10.207.51.81

    实现效果:当client1访问www.jzbg.com时解析到10.207.51.41;当client2访问www.jzbg.com是解析到10.207.51.42;

    11.2. 配置主DNS服务器

    [root@master ~]# yum install -y bind
    

    11.2.1. 修改主配置文件

    [root@master ~]# vim /etc/named.conf        ##区域配置保持默认即可
    options {
        listen-on port 53 { 10.207.51.40; };
        allow-query     { any; };
        forward first;
        forwarders { 10.207.51.32; };
        recursion yes;
        allow-recursion { 10.0.0.0/8;172.16.0.0/15;192.168.0.0/16; };
        dnssec-enable no;
        dnssec-validation no;
        forward first;
        forwarders { 8.8.8.8; };
    
        //zone "." IN {
        //	type hint;
        //	file "named.ca";
        //};
    
    [root@master ~]# vim /etc/named.rfc1912.zones
    acl client1 { 10.207.51.61;10.207.51.30; };
    acl client2 { 10.207.51.81;10.207.51.31; };
    
    view "client1" {
    	match-clients { "client1"; };
    
    	zone "." IN {
    		type hint;
    		file "named.ca";
    	};
    
    	zone "jzbg.com" IN {
    		type master;
    		file "jzbg.com.zone.c1";
    		allow-transfer	{ 10.207.51.30; };
    		allow-update { none; };
    	};
    
    	zone "51.207.10.in-addr.arpa" IN {
    		type master;
    		file "10.207.51.zone.c1";
    		allow-transfer	{ 10.207.51.30; };
    		allow-update { none; };
    	};
    
            zone "jzbgsec.com" IN {
    	        type forward;
    	        forward only;
            	forwarders { 10.207.51.32; };
            };
    };
    
    view "client2" {
    	match-clients { "client2"; };
    
    	zone "." IN {
    		type hint;
    		file "named.ca";
    	};
    
    	zone "jzbg.com" IN {
    		type master;
    		file "jzbg.com.zone.c2";
    		allow-transfer	{ 10.207.51.31; };
    		allow-update { none; };
    	};
    
    	zone "51.207.10.in-addr.arpa" IN {
    		type master;
    		file "10.207.51.zone.c2";
    		allow-transfer	{ 10.207.51.31; };
    		allow-update { none; };
    	};
    
            zone "jzbgsec.com" IN {
    	        type forward;
    	        forward only;
            	forwarders { 10.207.51.32; };
            };
    };
    

    11.2.2. 创建zonefile

    [root@master ~]# vim /var/named/jzbg.com.zone.c1 
    $TTL	3600
    $ORIGIN jzbg.com.
    @	IN	SOA	master.jzbg.com.	admin.jzbg.com.	( 2018111601 1H 30M 5H 1H )
    	IN	NS	master
    	IN	NS	slave
    master	IN	A	10.207.51.40
    slave 	IN	A	10.207.51.31
    www		IN	CNAME	www.a.jzbgsec.com.
    
    [root@master ~]# vim /var/named/jzbg.com.zone.c2
    $TTL	3600
    $ORIGIN jzbg.com.
    @	IN	SOA	master.jzbg.com.	admin.jzbg.com.	( 2018111601 1H 30M 5H 1H )
    	IN	NS	master
    	IN	NS	slave
    master	IN	A	10.207.51.40
    slave 	IN	A	10.207.51.31
    www		IN	CNAME	www.b.jzbgsec.com.
    
    [root@master ~]# vim /var/named/10.207.51.zone.c1 
    $TTL	3600
    $ORIGIN 51.207.10.in-addr.arpa.
    @	IN	SOA	master.jzbg.com.	admin.jzbg.com.	( 2018111601 1H 30M 5H 1H )
    	IN	NS	master.jzbg.com.
    	IN	NS	slave.jzbg.com.
    40	IN	PTR	master.jzbg.com.
    31 	IN	PTR	slave.jzbg.com.
    41	IN	PTR	www.jzbg.com.
    
    [root@master ~]# vim /var/named/10.207.51.zone.c2
    $TTL	3600
    $ORIGIN 51.207.10.in-addr.arpa.
    @	IN	SOA	master.jzbg.com.	admin.jzbg.com.	( 2018111601 1H 30M 5H 1H )
    	IN	NS	master.jzbg.com.
    	IN	NS	slave.jzbg.com.
    40	IN	PTR	master.jzbg.com.
    31 	IN	PTR	slave.jzbg.com.
    42	IN	PTR	www.jzbg.com.
    

    11.2.3. 修改权限

    [root@master ~]# cd /var/named/
    [root@master named]# chown :named jzbg.com.zone.c1 jzbg.com.zone.c2 10.207.51.zone.c1 10.207.51.zone.c2 
    [root@master named]# chmod 640 jzbg.com.zone.c1 jzbg.com.zone.c2 10.207.51.zone.c1 10.207.51.zone.c2
    

    11.2.4. 启动服务

    [root@master named]# systemctl start named
    [root@master named]# ss -antu | grep "<53"
    udp    UNCONN     0      0      10.207.51.40:53                    *:*                  
    tcp    LISTEN     0      10     10.207.51.40:53                    *:*             
    

    11.3. 配置备DNS服务器

    [root@slave ~]# yum install -y bind
    

    10.3.1. 修改主配置文件

    [root@slave ~]# vim /etc/named.conf        ##区域配置保持默认即可
    options {
        listen-on port 53 { 10.207.51.31; };
        allow-query     { any; };
        forward first;
        forwarders { 10.207.51.32; };
        recursion yes;
        allow-recursion { 10.0.0.0/8;172.16.0.0/8;192.168.0.0/8; };
        dnssec-enable no;
        dnssec-validation no;
        forward first;
        forwarders { 8.8.8.8; };
    
        //zone "." IN {
        //	type hint;
        //	file "named.ca";
        //};
    
    
    [root@slave ~]# vim /etc/named.rfc1912.zones
    acl client1 { 10.207.51.61; };
    acl client2 { 10.207.51.81; };
    
    view "client1" {
    	match-clients { "client1"; };
    
    	zone "jzbg.com" IN {
    		type slave;
    		file "slaves/jzbg.com.zone.c1";
    		masters { 10.207.51.40; };
    		transfer-source 10.207.51.31;
    	};
    	
    	zone "51.207.10.in-addr.arpa" IN {
    		type slave;
    		file "slaves/10.207.51.zone.c1";
    		masters { 10.207.51.40; };
    		transfer-source 10.207.51.31;
    	};
    
    	zone "jzbgsec.com" IN {
    		type forward;
    		forward only;
    		forwarders { 10.207.51.32; };
    	};
    };
    
    
    view "client2" {
    	match-clients { "client2"; };
    
    	zone "." IN {
          		type hint;
            	file "named.ca";
    	};
    
    	zone "jzbg.com" IN {
    		type slave;
    		file "slaves/jzbg.com.zone.c2";
    		masters { 10.207.51.40; };
    		transfer-source 10.207.51.31;
    	};
    	
    	zone "51.207.10.in-addr.arpa" IN {
    		type slave;
    		file "slaves/10.207.51.zone.c2";
    		masters { 10.207.51.40; };
    		transfer-source 10.207.51.31;
    	};
    
    	zone "jzbgsec.com" IN {
    		type forward;
    		forward only;
    		forwarders { 10.207.51.32; };
    	};
    };
    

    11.3.2. 修改权限

    [root@slave ~]# cd /var/named/
    [root@slave named]# chown named:named slaves
    [root@slave named]# chmod 770 slaves
    

    11.3.3. 启动服务

    [root@slave ~]# systemctl start named
    [root@slaves ~]# ss -antu | grep "<53"
    udp    UNCONN     0      0      10.207.51.31:53                    *:*                  
    tcp    LISTEN     0      10     10.207.51.30:53                    *:*                  
    

    11.4. 测试效果

    [root@client ~]# dig -b 10.207.51.61 www.jzbg.com @10.207.51.40
    
    ; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> -b 10.207.51.61 www.jzbg.com @10.207.51.40
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18485
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;www.jzbg.com.			IN	A
    
    ;; ANSWER SECTION:
    www.jzbg.com.		3600	IN	CNAME	www.a.jzbgsec.com.
    www.a.jzbgsec.com.	3600	IN	A	10.207.51.41    ##测试主DNS,客户端10.207.51.61解析www.jzbg.com,IP地址为10.207.51.41,解析成功;
    
    ;; AUTHORITY SECTION:
    jzbgsec.com.		3600	IN	NS	master.jzbgsec.com.
    
    ;; ADDITIONAL SECTION:
    master.jzbgsec.com.	3600	IN	A	10.207.51.32
    
    ;; Query time: 5 msec
    ;; SERVER: 10.207.51.40#53(10.207.51.40)
    ;; WHEN: Fri Nov 16 18:28:07 CST 2018
    ;; MSG SIZE  rcvd: 122
    
    
    
    
    
    [root@client ~]# dig -b 10.207.51.81 www.jzbg.com @10.207.51.40 
    
    ; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> -b 10.207.51.81 www.jzbg.com @10.207.51.40
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21173
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;www.jzbg.com.			IN	A
    
    ;; ANSWER SECTION:
    www.jzbg.com.		3600	IN	CNAME	www.b.jzbgsec.com.
    www.b.jzbgsec.com.	3600	IN	A	10.207.51.42    ##测试主DNS,客户端10.207.51.81解析www.jzbg.com,IP地址为10.207.51.42,解析成功;
    
    ;; AUTHORITY SECTION:
    jzbgsec.com.		3600	IN	NS	master.jzbgsec.com.
    
    ;; ADDITIONAL SECTION:
    master.jzbgsec.com.	3600	IN	A	10.207.51.32
    
    ;; Query time: 5 msec
    ;; SERVER: 10.207.51.40#53(10.207.51.40)
    ;; WHEN: Fri Nov 16 18:28:32 CST 2018
    ;; MSG SIZE  rcvd: 122
    
    
    
    
    
    [root@client ~]# dig -b 10.207.51.61 www.jzbg.com @10.207.51.31
    
    ; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> -b 10.207.51.61 www.jzbg.com @10.207.51.31
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36254
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;www.jzbg.com.			IN	A
    
    ;; ANSWER SECTION:
    www.jzbg.com.		3600	IN	CNAME	www.a.jzbgsec.com.
    www.a.jzbgsec.com.	3600	IN	A	10.207.51.41    ##测试从DNS,客户端10.207.51.61解析www.jzbg.com,IP地址为10.207.51.41,解析成功;
    
    ;; AUTHORITY SECTION:
    jzbgsec.com.		3600	IN	NS	master.jzbgsec.com.
    
    ;; ADDITIONAL SECTION:
    master.jzbgsec.com.	3600	IN	A	10.207.51.32
    
    ;; Query time: 1 msec
    ;; SERVER: 10.207.51.31#53(10.207.51.31)
    ;; WHEN: Sun Nov 18 20:40:35 CST 2018
    ;; MSG SIZE  rcvd: 122
    
    
    
    
    
    [root@client ~]# dig -b 10.207.51.81 www.jzbg.com @10.207.51.31
    
    ; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> -b 10.207.51.81 www.jzbg.com @10.207.51.31
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4116
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;www.jzbg.com.			IN	A
    
    ;; ANSWER SECTION:
    www.jzbg.com.		3600	IN	CNAME	www.b.jzbgsec.com.
    www.b.jzbgsec.com.	2921	IN	A	10.207.51.42    ##测试从DNS,客户端10.207.51.81解析www.jzbg.com,IP地址为10.207.51.42,解析成功;
    
    ;; AUTHORITY SECTION:
    jzbgsec.com.		2921	IN	NS	master.jzbgsec.com.
    
    ;; ADDITIONAL SECTION:
    master.jzbgsec.com.	2921	IN	A	10.207.51.32
    
    ;; Query time: 0 msec
    ;; SERVER: 10.207.51.31#53(10.207.51.31)
    ;; WHEN: Sun Nov 18 20:40:50 CST 2018
    ;; MSG SIZE  rcvd: 122
    
  • 相关阅读:
    Golang之redis
    Golang之Socket
    Golang之单元测试
    Golang之定时器,recover
    Python深度学习之安装theano(windows)
    电容充放电时间常数RC计算方法(转载)
    输入阻抗的理解(转载)
    浮点数的二进制表示
    modbus-poll和modbus-slave工具的学习使用——modbus协议功能码04的解析——04读输入寄存器
    STM32调试中遇到的工具困难(转载+整理)
  • 原文地址:https://www.cnblogs.com/jzbgltb/p/9967063.html
Copyright © 2020-2023  润新知