DNS:Domain Name Service 应用层协议,采用C/S构架

     使用端口53/udp用于地址解析, 53/tcp用于主从同步,953/tcp用于rndc(remove netservice domain controler)

    DNS名称解析name resolving  FQDN<--->IP

    nsswitch名称解析framework

wKiom1mb42HSeEKyAAA5MPSqKpU691.png

    使用本地stub resolver 读取配置文件/etc/nsswitch.conf,通过库调用读取本地是否有对应记录,没有则通过库调用执行dns解析。

    本地hosts文件结构

        IPADDR   FQDN      Ailases

域名结构

     根域

      一级域名: Top Level Domain: tld

com, edu, mil, gov, net, org, int,arpa

     三类:组织域、国家域(.cn, .ca, .hk, .tw)、 反向域

      二级域名

      三级域名

     最多127级域名

一条域名的解析过程:

wKioL1mb46Xyuh3eAABZA6gSQU8261.png

    首先查找本地/etc/hosts是否有记录,有则使用本地记录(可以修改优先级),没有找到则向本地DNS服务器发送请求,服务器,首先查询自己缓存,缓存中有直接返回值,没有则向根域名服务器发送请求(对于DNS服务器只是单向的,自顶而下,不知上级域名服务器是哪一个,但是都有根服务器的地址),根返回(这里是com)服务器中一个,本地NS继续向com服务器发送域名解析查询,域名服务器返回目标服务器NSIP(如果存在),本地NS继续向目标NS服务器发送域名解析查询,目标NS返回查询结果,本地NS服务器把记录加入缓存。

     迭代查询:对于local-NS而言,它所工作方式就是迭代查询,每次NS向不同服务服务器发送请求并返回结果;

     递归查询:对于client而言,它的查询就是递归的,它把请求给local ns,等待ns返回结果;

wKiom1mb4-SDYgGdAAAsmE12sWk248.png

1.Bind中的socket采用的是epoll模型 

2.Bind业务处理主要要关注一个run函数和isc_app_run函数 

3.Bind运行主要是两个线程和一个do while循环

main() {
     ...
     setup();//初始化工作
           / * Start things running and then wait for a shutdown request or reload. */
     do { result = isc_app_run(); //启动APP
          if (result == ISC_R_RELOAD) { 
                ns_server_reloadwanted(ns_g_server); //如果重启加载
         } else if (result != ISC_R_SUCCESS) {
                                              ...
                               result = ISC_R_SUCCESS; } }
                              while (result != ISC_R_SUCCESS);
                               ...}


  1. 在setup函数里初始化配置相关,比较庞杂,这里主要关注create_managers里,有两个重要的函数isc_taskmgr_createisc_socketmgr_create2这两个函数分别起两个线程,分别是run和watcher。分别处理任务队列。和监听socket管理相关。

  2. 这个do while循环,主要是result = isc_app_run();这个函数实际上等待各种结束程序信号,处理业务,如果需要重启服务调用ns_server_reloadwanted。

  3. run主要执行的代码是dispatch(manager),dispath主要执行的是(event->ev_action)( (isc_task_t *)task,event);处理事件相关

  4. watch主要执行的代码是result = watch_fd(manager, fd, msg);在watch_fd中,关键代码是epoll_ctl(manager->epoll_fd, EPOLL_CTL_ADD, fd, &event),这里重新注册epoll事件,然后epoll_wait再等待,而后再处理,如此反复。

DNS主从

    主DNS服务器

    从DNS服务器

    缓存DNS服务器(转发器)

主DNS服务器:管理和维护所负责解析的域内解析库的服务器

从DNS服务器:从主服务器或从服务器“复制”(区域传输)解析库副本

    序列号:解析库版本号,主服务器解析库变化时,其序列递增

    刷新时间间隔:从服务器从主服务器请求同步解析的时间间隔

    重试时间间隔:从服务器请求同步失败时,再次尝试时间间隔

    过期时长:从服务器联系不到主服务器时,多久后停止服务

    “通知”机制:主服务器解析库发生变化时,会主动通知从服务器


     1在配置文件定时同步间隔时间refresh time同步

     2修改文件后,使用rndc -c 从服务器key文件 notify,通知从更新需要同步

区域传输:

    完全传输axfr:传送整个解析库

    增量传输ixfr:传递解析库变化的那部分内容


bind   berkely Internet name domain

资源记录:

wKioL1mb5JvAeYuVAABcg8BrlMM027.png

域domain和区域zone

domain 逻辑概念

zone 物理概念

     主main

     从slave

     提示区hint(定义根)

     转发区forward(直接定义到×××)

主配置文件和区域数据文件配置

     主配置文件 /etc/named.conf 

     区域数据文件 /var/named/

option {
        diretory   "/var/named" ;
};
zone "." IN  {
        type hint;     
        file "named.ca"; #数据文件位置,相对于前面定义目录的位置
};
zone "magedu.com." IN  {
        type slave;     #slave需要定义主服务器地址
        file "xx.db";
        master {master1_ip;master2_ip; };
};

最基本的一个named.conf配置文件

options {
        directory   "/var/named" ;
};
zone "." IN  {
        type hint;
        file "named.ca";
};
zone "localhost" IN {
        type master;
        file "named.localhost";
};
zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "med.loopback";
};

检查配置文件

[root@localhost ~]# chmod 640 /etc/named.conf
[root@localhost ~]# chown root:named /etc/named
named/               named.iscdlv.key     named.root.key       
named.conf           named.rfc1912.zones 
[root@localhost ~]# chown root:named /etc/named.conf
[root@localhost ~]# ls -l /etc/named.conf
-rw-r-----. 1 root named 233 Jul 28 17:46 /etc/named.conf
[root@localhost ~]# named-checkconf
/etc/named.conf:2: unknown option 'option'

少了个s修改配置文件

[root@localhost ~]# named-checkconf
[root@localhost ~]# named-checkzone "." /var/named/named.ca
zone ./IN: has 0 SOA records
zone ./IN: not loaded due to errors.  
[root@localhost ~]# named-checkzone "0.0.127.in-addr.arpa" /var/named/named.loopback
zone 0.0.127.in-addr.arpa/IN: loaded serial 0
OK

错误日志位置/var/log/messages

 

Jul 28 17:36:56 localhost systemd: Started Generate rndc key for BIND (DNS).
Jul 28 17:36:56 localhost systemd: Starting Berkeley Internet Name Domain (DNS)...
Jul 28 17:36:57 localhost bash: zone localhost/IN: loaded serial 0
Jul 28 17:36:57 localhost bash: zone 0.0.127.in-addr.arpa/IN: loading from master file med.loopback failed: file not found
Jul 28 17:36:57 localhost bash: zone 0.0.127.in-addr.arpa/IN: not loaded due to errors.
Jul 28 17:36:57 localhost bash: _default/0.0.127.in-addr.arpa/IN: file not found
Jul 28 17:36:57 localhost systemd: named.service: control process exited, code=exited status=1
Jul 28 17:36:57 localhost systemd: Failed to start Berkeley Internet Name Domain (DNS).
Jul 28 17:36:57 localhost systemd: Unit named.service entered failed state.
Jul 28 17:36:57 localhost systemd: named.service failed.
named-checkconfig#只检查语法错误,不检查逻辑错误,重启服务时候,就会反应出来,这里file有个文件名写错了

 

在主配置文件中定义zone,在/var/named/下创建对应文件名的zone文件:

 

$TTL 600
magedu.com.(或者用@) IN SOA ns1.nmagedu.com.(NS) mail.magedu.com. (
                              20170727
                              2H 同步 间隔
                              5M 重试时间
                              2D expiretime
                              6H 缓存时间)
(与上面相同可省)  IN NS ns1(后面可省与域相同) 
                  IN MX 10 mail
   ns1           IN  A   172.16.253.116
mail               IN A  172
www            IN  A      172
WWW               IN A 172
ftp            IN CNAME www

反向区域 必须写完整FQDN

$TTL 600
0.0.172.in-addr.arpa(或者@)              IN SOA ns1.nmagedu.com.(NS) mail.magedu.com. (
                              20170727
                              2H 同步 间隔
                              5M 重试时间
                              2D expiretime
                              6H 缓存时间)
(与上面相同可省)  IN NS ns1magedu.com.
                  IN MX 10 mail
1          IN  PTR  ns1.magedu.com
1               IN PTR  www.magedu.com.