天天看点

dns详解(一)

<code>一:DNS(Domain Name Service),协议</code>

<code>二:DNS服务相关概念</code>

<code>三:DNS的实现方式</code>

<code>四:主配置文件格式</code>

<code>五:测试工具</code>

<code>六:配置正向区域</code>

一:DNS(Domain Name Service),协议

    C/S

        53/{tcp,udp}:默认使用该协议通信

                    :主要是用udp实现解析

    www.mt.com:FQDN(full qualified domain) //主机名

    解析过程:hosts---&gt;本地缓存--&gt;DNS:/etc/resolv.conf

    根域名:.

    顶级域名:top level domain:tld //

        组织域:.com,.net,.org,.gov,.edu,.mil

        国家域:.lq,.tw,.hk,.ip,.cn,...

    父域知道子域,但是子域不知道父域

    查询完后:缓存到本地,下一次的话就直接使用缓存

        缓存也有TTL,用来保证有效 //TTL倒计时,到时清除

    思想:分层而治,划片[区]而管

    www.baidu.com. //最后一个 . 是可以不带的,但是是存在的

    DNS查询过程:两段

        1:到自己所指向的DNS服务器 //递归

        2:本地DNS在网上查找的过程 //迭代

        递归:弟弟我帮你

        迭代:自己去吧

    DNS查询类型:

        递归查询;

        迭代查询

    DNS名称解析方式://两个不同的数据库

        名称---&gt;IP:正向

        IP--&gt;名称:反向

        //早期智能正向解析,而不能反向解析

        //反向:另外一个树

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

                    [.]

                   /

                []    //in-addr.arpa.

               /

             /

           [1]    

          /  |

        [1]  [2]

                 \

                  [3]

                    \

                      [4]

    1.2.3.4===4.3.2.1.in-addr.arpa

    反向:IP地址表示的过程也是从下往上走:

        表示的时候是:1.2.3.4

        查找过程:

            第一阶段:本地dns--&gt;.

            第二阶段:in-addr.arpa--&gt;1--&gt;2--&gt;3

    正向:也是从下往上查找的    

        表示的时候是:www.baidu.com

            第一阶段: 本地DNS---&gt;.

            第二阶段:.--&gt;.com--&gt;.baidu---&gt;www

    注意:二者的名称空间,非为同一个空间,即非为同一棵树;因此,也不是同一个解析库

dns相关网站

    万网//https://wanwang.aliyun.com/domain/ 

    godaddy    //https://sg.godaddy.com/zh/

二:DNS服务相关概念

1.主-辅DNS

    辅:在主dns挂了的时候,及时顶上去

        :在忙的时候,也可以做负载均衡

        :只能辅到主dns去更新,复制

        :新加入的条目,只能通过主DNS

    主DNS:维护所负责解析的域数据库的服务器;读写操作都可进行

    从DNS:从主DNS或其他从DNS服务器那里“复制”一份解析库;但只能进行读操作

        “复制”操作的实施方式:

            序列号:serial,也即是数据库的版本号;主dns数据库内容发生变化时,其版本号递增

            刷新时间间隔:refresh,从s每多久到主s检查序列号更新状况

            重试时间间隔:retry,小于refresh//否则刷新时间已经改变,从s请求主解析库失败时,再次发起请求的时间间隔

            过期时长:expire,从s多久之后放弃从主s同步数据;停止提供服务;

                //因为他没有权限,进行写,所以他也就不再提供服务了

                //需要手动配置为从为主NS

            否定答案的缓存时长:我没有知道,多长时间内你不要问我

        主s“通知“从s随时更新数据://从s定期间隔来复制,主s更新主动推送

            pull:拉取,拉过来 //从s定期从主s pull数据

            push:推送

    区域传送:

        全量传送:axfr传送整个解析库 //一般第一次的时候

        增量传送:ixfr仅传送变化的数据

    区域(zone)域(domain)

        mt.com是一个域

            FQDN--&gt;IP

                正向解析库://也成为一个区域:正向解析区域

            IP--&gt;FQDN

                反向解析库://反向解析区域

        一个域内有:正向解析区域和反向解析区域

        一个域内:正向或者反向//又负责n个域的解析

        区域是物理概念:例如一个正向或者反向的解析库文件

        域是逻辑概念:.com,.cn等

        //因此这两个是无所谓谁大谁小的

    子域需要得到父域的授权

    每一个DNS只知道自己的负责的DNS子域,而不知道父域是谁

        因此每次查找,可能都需要到根查找    

    如果A请求NS1,单NS1不负责该域,NS1会直接查找根,而根是在配置文件中有直接定义的

        全球的根节点服务器:13个,10:Usa,1:japan,1瑞士,1:英国

            A-M标识,中国2014新增:L:

            l.gtld-servers.net //中国的,位于北京

    把DNS封了的话,国内的访问国内的网站都将失效

        安全:dns缓存毒化,主机名和dns对应到其他ip

        现在有:DNSsec //dns数据上上进行签名     

2.区域数据库文件:

    资源记录:Resouce Record,简称rr;

        记录类型:A,AAAA,PTR,SOA,NS,CNAME,MX

        SOA:start of authority:起始授权记录;一个区域解析库有且只能哟一个SOA记录,而且必须放在第一条;

        NS:Name service,域名服务记录;一个区域解析库可以有多个NS记录;其中一个为主

        A:address,地址记录FQDN--&gt;IPV4

        AAAA:地址记录,FQDN-IPv6

        CNAME:Canonical Name:别名记录

        PTR:Pointer ,IP---&gt;FQDN

        MX:mail eXchanger,邮件交换器

            优先级:0-99,数字越小,优先级越高

        资源记录类型还有很多种,这只是其中几种而已

3.资源记录的定义格式:

    语法:name   [TTL]   IN   RR_TYPE   value 

    资源记录类型:SOA,NS,MX,A,AAAA,CANME,PTR

    区域传送:AXRF,IXFR

    资源记录定义的格式:

        name  [ttl]  IN RR_TYPE  value 

    SOA:

        name:当前区域的名字;例如"magedu.com.",或者"2.3.4.in-addr.arpa.";

            区域名字可以用@取代

        value:由多部分组成

            1.当前区域的区域名称(也可以使用主DNS服务器名称)

            2.当前区域管理员的邮箱地址,但地址中不能使用@符号,使用“."取代

            3.(主从服务协调属性的定义以及否定答案的TTL)

                {serial,refresh,retry,expire,negative answer}      

            serial,refresh time,retry time,expire time,否定答案的TTL

                M,H,D,W

    例如:SOA

<code>        </code><code>magedu.com.  86400 IN  SOA  mt.com. admin.mt.com.  (</code>

<code>                                </code><code>2017010801;serial 是为以内</code>

<code>                                </code><code>2H ;refresh time刷新时间</code>

<code>                                </code><code>10min; retry</code>

<code>                                </code><code>1W;expire</code>

<code>                                </code><code>1D;否定答案的TTL值</code>

<code>                                </code><code>)</code>

<code>        </code><code>SOA:6+5=11</code>

<code>        </code><code>NS:5</code>

<code>        </code><code>MX:6</code>

        例如:NS

            name:当前区域的名称

            value:当前区域的某DNS服务器的名字,例如ns.mt.com.

            mt.com.    86400 IN NS ns1.mt.com.

        例如:MX

            name:当前区域的区域名称

            value:当前区域某邮件交换服务器的主机名

                注意:MX记录可以有多个;但每个记录的value之前应该有一个数字表示其优先级

            mt.com.      86400   IN   MX 10   mx1.mt.com.       

            mt.com.      86400   IN   MX 9    mx2.mt.com.

        例如:A

            name:某FQDN,例如www.mt.com.

            value:某v4地址

            例如:

            www.mt.com.     IN  A 1.1.1.1 

            www.mt.com.     IN  A 1.1.1.2

            bbs.mt.com.     IN  A 1.1.1.1 

        例如:AAAA

            name:FQDN

            value:IPv6地址

        例如:PTR

            name:IP地址,有特定格式,IP反过来写,而且加特定后缀

            例如1.2.3.4的记录应该写为    4.3.2.1.in-addr.arpa.

            value:FQDN

            4.3.2.1.in-addr.arpa.    IN   PTR  www.mt.com.

        例如CNAME:

            name:别名FQDN

            value:FQDN格式的正式名字

            web.mt.com.    IN  CNAME  www.mt.com.

    注意:

        1.TTl可以从全局集成

        2.@表示当前区域的名称

        3.相邻的两个记录,其name相同时,后面的可以省略

            www.mt.com.     IN  A 1.1.1.2    

            可以

                            IN  A 1.1.1.2    

            //后一个不写

        4.MX,NS等类型的记录其value为一个FQDN,此FQDN应该有一个A记录

4.缓存DNS

    缓存DNS server:自己不负责任何域,只负责帮人查找解析

    DNS服务器类型:

        不负责解析域:

            缓存DNS //接受所有DNS查询,进行递归解析

        负责解析至少一个域:

            主DNS

            辅助DNS //备份以及负载均衡

缓存DNS

    一个DNS服务器可以不包含任何域的配置信息,它将接收到的所有DNS查询进行递归解析,

    将解析的结果返回给我们的查询客户端,并且将查询结果缓存下来,

    这样的服务器就称之为Caching DNS Server

三:DNS的实现方式

DNS的开源实现:

    dnsmasp //提供dhcp和bind

    bind //这里重点讲bind

1.DNS and Bind

    BIND的安装配置:

        BIND:berkely Internet Name Domain--&gt;ISC.org{bind,dhcpd}

            早期为伯克利负责维护,后期为ISC

        dns:协议

        bind:dns的一种实现

        named:bind程序的运行的进程名

    yum info bind

    yum list all bind*

    程序包:

        bind-utils:被bind和bind-utils包中的程序共同用到的文件

        bind:提供dns server程序,以及几个常用到的测试程序

        bind-chroot:可以选择程序,根切换,早期bind有漏洞,为了减少破坏,使用chroot

                :所有配置文件都放在chroot目录中,然后所有的环境和配置文件都放在哪里

        rpm -ql bind-utils //提供的命令有:dig,host,nslookup,nsupdate

        yum install bind 

        rpm -ql bind //查看bind的所有生成文件

    主配置文件:/etc/named.conf

        或包含近来的其他文件

            /etc/named.rfc1912.zones 

            /etc/named.root.key

    解析库文件:

        /var/named/目录下

            一般名字为:ZONE_NAME.zone

        注意:

            1.一台DNS服务器可同时为多个区域提供解析

            2.必须要有根区域文件:named.ca

            3.还应该有两个区域解析库:localhost和127.0.0.1的正反向解析

                    named.localhost:正向,named.loopback:反向

    rndc:名称服务器的远程控制工具

        remote name domain controller:  953/tcp但默认监听于127.0.0.1地址,因此仅允许本地使用

        修改配置文件:cp /usr/share/man/man5/rndc.conf.5.gz 解压到/etc/rndc.conf

2.缓存名称服务器        

    bind程序安装完成之后,默认即可做缓存服务器

    其他用户指向该name server即可,缓存服务器,允许本地递归即可

    systemctl start named.service

        1.named监听tcp和udp的53号端口    

        2.缓存域名服务器是不需要定义任何区域的,区域主要由:v4&amp;v6的正反向解析记录即可

            因为他不需要负责任何区域,只需要解析自己就可以了    

四:主配置文件格式

    全局配置段:

        options{...}

    日志配置段:

        logging{...}

    区域配置段:

        zone{...} 

        由本级负责解析或者转发的区域

    注:每个配置语句都以分号结尾,否则即为语法错误    

    1.缓存名称服务器的配置:

        监听能与外部通信的地址

        listen-on port 53 { 192.168.4.100; };  //花括号前后都有空格,监听地址分号结尾

        dnssec-enable no;  //可能会影响实验

        dnssec-validation no;

        allow-query { 192.168.4.0/24; }//允许内网主机查询

         //bindkeys-file "/etc/named.iscdlv.key";  //已经关闭了dnssec因此这个密钥文件就没有用了

        注释: /* ,,,  */ 多行注释, //单行注释

        named-checkconf  //检查语法错误

        named-checkconf /etc/namned.conf //指定配置文件位置

        systemctl restart named.service    

        netstat -tnul |grep 53

                tcp:953是rndc

    2.vim /etc/resolv.conf 修改 :最多只能有个三个

        nameserver 192.168.4.100 //监听的地址指向自己

        ping www.baidu.com //在缓存nameserver上测试,能够ping通

        dig -t A www.baidu.com //在本机使用,也可以,速度比较快

            Got answer:请求得到了答案

            flags: qr:查询请求  ra:请求答案  

            ANSWER SECTION:可能是本地的缓存解析的

            AUTHORITY SECTION:权威段,谁负责解析的

            ADDITIONAL SECTION:附加段,真实的ip对应

        只要本地测试可以,就证明,本地做缓存服务器是可以的

    3.允许其他人查询

        /etc/named.conf

            allow-query     { 192.168.4.0/24; };

        dig -t A www.baidu.com @192.168.4.100 //其他内部主机测试即可

    小结:自己把nameserver指向自己,listen-on port修改对就可以了

五:测试工具

    dig,host,nslookup

    1.dig命令

        dig [-t RR_TYPE] name @Server

        用于测试dns系统,因此不会使用hosts文件

        查询:

            +[no]trace :跟踪解析过程

            +[no]recurse:进行递归解析 

        dig +trace -t A www.baidu.com //追踪查询过程

            1.找根:一个根返回顶级域 .com的所有dns,只有一个会响应  .--&gt; .com

            2. com服务器,告诉我们baidu的所有dns,只有一个响应,.com--&gt;baidu.com.

            3. baidu.com的服务器,找到www,www是一个cname,因此返回            

        dig -x 192.168.4.100 //反向解析

        模拟完全区域传送

            dig -t axfr DOMAIN [@server}

    2.host命令

        host -t A www.baidu.com

        host -t NS baidu.com  //baidu.com这个域内的NS

        host [-t RR_TYPE] name SERVER_IP

    3.nslookup命令

        nslookup [options] [name] [server]

        nslookup&gt;

            server IP:指定nameserver

            set q=RR_TYPE

            192.168.0.1 

    4.rndc named服务控制命令

        rndc status //查看状态

        rndc stop //可以关闭

        rndc flush //清空服务器缓存

        rndc reload [zone] //重载

        rndc refresh zone  //该zone转为维护模式,不让其解析

个人使用:

    申请域名+ip

    在注册商:申请修改ns记录:域名==ip

六:配置正向区域

    以为mt.com域为例

    1.定义区域

        主配置文件或者主配置文件的辅助配置文件中实现

        zone "ZONE_NAME"  IN {

            type {master|slave|hint|forward} //hint提示为根区域 

            file "ZONE_NAME.ZONE";

        };

    2.建立区域数据文件

        在/var/named目录下建立区域数据文件

    3.让服务器重载配置文件和区域数据文件

        检查语法格式

    4.权限及属组修改

        chgrp named mt.com.zone

        chmod o= mt.com.zone

        172.16.4.100 ns1,bbs

        172.16.4.12 mx1

        172.16.4.13    mx2

        172.16.4.14    www,web 

        172.16.4.15 bbs

    实现:

        1.vim /etc/named.rfc1912.zones  //rfc:Request For Comments注释请求文档,各种协议标准文档

<code>            </code><code>zone </code><code>"mt.com"</code> <code>IN {        </code><code>//mt.com这里不加“."</code>

<code>                    </code><code>type master;</code>

<code>                    </code><code>file </code><code>"mt.com.zone"</code><code>;   </code><code>//默认位置位/var/named目录中</code>

<code>            </code><code>};</code>

<code>            </code><code>===================================</code>

<code>            </code><code>zone </code><code>"4.168.192.in-addr.arpa"</code> <code>IN {  </code><code>//反向区域</code>

<code>                    </code><code>type master;    </code>

<code>                    </code><code>file </code><code>"192.168.4.zone"</code><code>;        </code><code>// 正向文件名</code>

<code>            </code><code>}</code>

            ================================================

        2.    /var/named/mt.com.zone

            语法:name   [TTL]   IN   RR_TYPE   value{[域名|DNS_name]+mail}

            例如:SOA

                mt.com.  86400 IN  SOA  mt.com. admin.mt.com.  (

                                        2017010801;serial 是为以内

                                        2H ;refresh time刷新时间

                                        10min; retry

                                        1W;expire

                                        1D;否定答案的TTL值

                                            )            

                value:可以不写全,但是一定尾部不能带 “."  :ns1 

                        写全的话,是一定要带"."            :ns1.mt.com.

                        会自动补齐/etc/named.rfc1912.zones中定义的

                            zone"mt.com"

                        或者开头:$ORIGIN mt.com.

                反向区域中是不需要MX记录的

                反向记录的第一条NS记录,value要写全,因为自动补齐的内容是4.168.192

            ======================================================    

            正向:

<code> </code><code>$TTL 3600                </code><code>//注:这个是$而不是@</code>

<code> </code><code>$ORIGIN mt.com.</code>

<code> </code><code>@    IN    SOA    ns1.mt.com.    admin.mt.com.    (  </code><code>//注,这是小括号,不是花括号</code>

<code>                            </code><code>2017030101</code>

<code>                            </code><code>1H</code>

<code>                            </code><code>10M</code>

<code>                            </code><code>3D</code>

<code>                            </code><code>1D )</code>

<code>                    </code><code>IN    NS        ns1    </code>

<code>                    </code><code>IN    MX 10    mx1    </code>

<code>                    </code><code>IN    MX 20    mx2    </code>

<code>                </code><code>ns1    IN    A    172.16.4.100</code>

<code>                </code><code>mx1    IN    A    172.16.4.12</code>

<code>                </code><code>mx2    IN    A    172.16.4.13</code>

<code>                </code><code>www    IN    A    172.16.4.14</code>

<code>                </code><code>web    IN    CNAME    www</code>

<code>                </code><code>bbs    IN    A    192.168.4.15</code>

<code>                </code><code>bbs    IN    A    192.168.4.100</code>

            ===========================================================

            反向: //出错很有可能是IP地址写错了

<code>$TTL 3600</code>

<code>$ORIGIN 4.168.192.</code><code>in</code><code>-addr.arpa.</code>

<code>@    IN    SOA    ns1.mt.com.    admin.mt.com. (</code>

<code>                                </code><code>2017030101</code>

<code>                                </code><code>1H</code>

<code>                                </code><code>10M</code>

<code>                                </code><code>3D</code>

<code>                                </code><code>12H )</code>

<code>                    </code><code>IN    NS    ns1.mt.com.</code>

<code>                </code><code>100    IN    PTR    ns1.mt.com.</code>

<code>                </code><code>100    IN    PTR    bbs.mt.com.</code>

<code>                </code><code>12    IN    PTR    mx1.mt.com.</code>

<code>                </code><code>13    IN    PTR    mx2.mt.com.</code>

<code>                </code><code>100    IN    PTR    www.mt.com.</code>

<code>                </code><code>14    IN    PTR    web.mt.com.</code>

<code>                </code><code>15    IN    PTR    bbs.mt.com.</code>

        ========================================================    

        3.named-checkconf

            named-checkzone mt.com /var/named/mt.com.zone

            rndc status;rndc reload ;rndc status

            number of zones:会发生改变

            测试:

                dig -t NS mt.com

                dig -t MX mt.com

                dig -t A bbs.mt.com //两次执行可能会发生变化

        4.修改属性

            chown :named mt.com.zone     

            chmod o= mt.com.zone  //取消其他人的权限

            chmod o= 192.168.4.zone 

            chgrp named 192.168.4.zone 

        5.测试

            dig -x 192.168.4.100

注意:rpm -ql bind //假如删除了bind的配置可以到/usr/share/man/man5中找回配置文件 

Windows查看查看DNS缓存:

    ipconfig /displaydns

解析顺序验证:

1.[root@localhost ~]# cat /etc/nsswitch.conf |grep -i name

# An example Name Service Switch config file. This file should be

#    dns            Use DNS (Domain Name Service)

hosts:      files dns myhostname //先从hosts文件(files),后采用dns

2.cat /etc/resolv.conf

nameserver 8.8.8.8

本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1983897,如需转载请自行联系原作者