DNS bind使用

放肆的年华 提交于 2019-12-05 03:01:52

概念介绍

  1. DNS的分类

    • 主DNS:配置管理,不提供服务,只用来编辑配置信息,给从DNS提供同步数据
    • 从DNS:从主DNS上同步数据信息,对外提供服务
    • 缓存DNS:在主DNS和从DNS之间,用来递归解析
    • 转发器:forwarder,本地不存储任何解析信息,转发给其他DNS来做解析
  2. 记录类型

    • SOA:备注信息
    • NS:域名解析服务器,也就是某一个域的名称服务器,存储了该域的所有解析信息
    • MX:邮件交换记录,优先值越小,优先级越高
    • A:Address,域名和地址的映射关系记录,IPv4,输入域名,解析得到地址
    • AAAA:IPv6的A记录
    • PTR:反向解析记录,地址和域名的映射关系,输入地址,解析得到域名
    • CNAME:别名记录
  3. 解析原理

    DNS的解析是一个树形结构,根节点是.,在根节点以下,全世界有13个节点服务器,所有其他的域名都是直接或间接归属到.域,比如.com、.cn等域名,世界上后面还有一个.。

    DNS的查找原理是递归,当客户端去请求某一个域名的地址时,显示查看本地的缓存(可以是本地hosts),如果本地缓存中有记录,则直接返回IP地址开始请求,如果本地缓存中没有,则会向本地DNS服务器去请求该域名,如果DNS服务器上有,则返回本地,本地进行缓存,然后开始请求;如果DNS服务器上没有,则会通过转发器,向上一级DNS服务器去请求,层层递归,直到解析到,或者超出范围。

    DNS的服务递归,最大64层。

  4. 常用的工具

    dig nslookup host

安装过程

  1. 安装dns

    DNS在linux上安装的名称为bind,如果是要搭建DNS服务器,需要在服务器上,安装bind应用。

    yum install -y bind-utils bind bind-devel bind-chroot
    
  2. 编辑主配置文件/etc/named.conf

    在安装过程的时候为bind,而实际的配置文件则成为named,其中主配置文件为/etc/named.conf文件,默认情况下,是将该配置文件备份后,重新编写该配置文件。下面是本机安装时的配置文件示例。

    [root@master ~]# cat /etc/named.conf
    options {
      version "1.1.1";
      listen-on port 53 {any;};
      directory "/var/named/chroot/etc/";
      #pid-file "/var/named/chroot/var/run/named/named.pid";
      pid-file "/run/named/named.pid";
      allow-query { any; };
      Dump-file "/var/named/chroot/var/log/binddump.db";
      Statistics-file "/var/named/chroot/var/log/named_stats";
      zone-statistics yes;
      memstatistics-file "log/mem_stats";
      empty-zones-enable no;
      forwarders {192.168.64.2; };
    };
    
    key "rndc-key" {
            algorithm hmac-md5;
            secret "Eqw4hClGExUWeDkKBX/pBg==";
    };
    
    controls {
           inet 127.0.0.1 port 953
                   allow { 127.0.0.1; } keys { "rndc-key"; };
     };
    
    logging {
      channel warning {
        file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;
        severity warning;
        print-category yes;
        print-severity yes;
        print-time yes;
      };
      channel general_dns {
        file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;
        severity info;
        print-category yes;
        print-severity yes;
        print-time yes;
      };
      category default {
        warning;
      };
      category queries {
        general_dns;
      };
    };
    
    include "/var/named/chroot/etc/view.conf";
    

    其中主要的配置点为:

    • 端口:53,默认是TCP和UDP都会监听,通常使用UDP,当出现穿越的时候,使用TCP
    • zone 配置文件目录:directory,默认放在/var/named/chroot/etc/下
    • pid文件:pid文件,在CentOS 7中,默认的pid文件应该是在/run/named/named.pid,如果不在这个地方,named进程会等到超时,而导致启动失败,原因是该文件不可读。这个问题曾经困扰了我好久,最后还是通过看系统日志,才知道的。
    • forwarders:转发器,当本地DNS无法解析到是,上级DNS的地址
    • rndc-key:动态加载DNS解析信息,通过rndc进行操作,rndc和named之间的交互,是通过rndc-key来进行认证的
    • rndc controls:默认监听本地的953端口
    • 日志文件定义和使用
  3. rndc配置

    主要是配置rndc.key文件和rndc.conf文件,这两个文件默认是不存在的,直接编辑创建就可以了。

    [root@master ~]# cat /etc/rndc.key 
    key "rndc-key" {
            algorithm hmac-md5;
            secret "Eqw4hClGExUWeDkKBX/pBg==";
    };
    [root@master ~]# cat /etc/rndc.conf
    key "rndc-key" {
            algorithm hmac-md5;
            secret "Eqw4hClGExUWeDkKBX/pBg==";
    };
    
    options {
            default-key "rndc-key";
            default-server 127.0.0.1;
            default-port 953;
    };
    

    在这里配置的key和options,必须要和主配置文件中的一致。

  4. 配置view文件

    view文件,就好比是zone配置文件,一个概要文件,在该文件中可以定义zone的文件、主从配置关系等等。这里我们以abc.com为例,配置一个view文件。该文件的位置,就是named.conf的include文件位置。

    [root@master ~]# cat /var/named/chroot/etc/view.conf 
        view "View" {
         zone "abc.com" {
                type    master;
                file    "abc.com.zone";
                allow-transfer {
                        192.168.64.132;
                };
                notify  yes;
                also-notify {
                        192.168.64.132;
                };
          };
        };
    
  5. 配置zone文件

    配置好view文件之后,就可以根据view中的zone信息,创建配置zone文件。

    [root@master ~]# cat /var/named/chroot/etc/cnpc.com.zone 
    $ORIGIN .
    $TTL 3600       ; 1 hour
    abc.com                  IN SOA  op.abc.com. dns.abc.com. (
                                    2000       ; serial
                                    900        ; refresh (15 minutes)
                                    600        ; retry (10 minutes)
                                    86400      ; expire (1 day)
                                    3600       ; minimum (1 hour)
                                    )
                            NS      op.abc.com.
    $ORIGIN abc.com.
    op                A      192.168.64.131
    salt         A  192.168.64.131
    

    在这个配置文件中,实际上就是配置zone里面的各种解析的信息,比如SOA、NS、A记录等。

  6. 启动服务

    上面所有文件配置完成之后,就需要可以启动服务了,默认启动服务是使用named用户,所以需要将/var/下的named目录的归属,改为named.named。然后就可以启动服务了。

    cd /var
    chown -R named.named named
    systemctl start named
    
  7. 解析测试

    使用dig命令,可以去解析之前定义的A记录

    dig @127.0.0.1 salt.abc.com
    

    @是指定DNS服务器。

    解析的时候,可以通过查看访问日志,知道dns的使用情况,/var/named/chroot/var/log/dns_log

主从配置

  1. 概述

    刚才安装了一个DNS服务器,作为某一个zone 的master服务器,现在要为该zone配置一个slave服务器,实现在master上增加DNS记录信息,主动同步给slave节点。主要需要配置的就是master上指定slave,也就是notify,而在slave上,则必须要制定master,一个slave可以同时拥有多个masters。

  2. 安装过程

    salve的安装过程,和master类似,前面的/etc/named.conf /etc/rndc.key /etc/rndc.conf都是可以完全一样的,唯一不同的是,salve上的view.conf文件需要注意,而zone file文件可以不用写,直接从master服务器上进行同步即可。

    salt-cp '192.168.64.132' /etc/named.conf /etc/named.conf
    salt-cp '192.168.64.132' /etc/rndc.key /etc/rndc.key
    salt-cp '192.168.64.132' /etc/rndc.conf /etc/rndc.conf
    salt-cp '192.168.64.132' /var/named/chroot/etc/view.conf /var/named/chroot/etc/view.conf 
    
    [root@localhost etc]# cat view.conf 
    view "View" {
     zone "abc.com" {
            type   slave;
            file    "abc.com.zone";
            masters {       192.168.64.131;
            };
      };
    };
    

    在slave的view配置文件中,与master不同的是,type为slave,而其他都不用写,指定一个masters就可以了。

  3. 启动服务

    当配置好salve节点之后,就可以直接启动了,在启动之后,会自动生成zone file文件,然后通过dig命令,使用本地进行解析,如果能得到正确的返回,就证明这个时候已经同步了。

    [root@localhost etc]# dig @127.0.0.1 salt.abc.com
    
    ; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7 <<>> @127.0.0.1 salt.abc.com
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56444
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;salt.abc.com.          IN  A
    
    ;; ANSWER SECTION:
    salt.abc.com.       3600    IN  A   192.168.64.131
    
    ;; AUTHORITY SECTION:
    abc.com.        3600    IN  NS  op.abc.com.
    
    ;; ADDITIONAL SECTION:
    op.abc.com.     3600    IN  A   192.168.64.131
    
    ;; Query time: 0 msec
    ;; SERVER: 127.0.0.1#53(127.0.0.1)
    ;; WHEN: Sat Apr 20 14:56:41 CST 2019
    ;; MSG SIZE  rcvd: 91
    
  4. 同步设置

    在master主机上,增加一条A记录,是要修改master的zone配置文件,除了要添加一条A记录之外,还要修改该zone的serial值,如果不修改,是无法同步给slave的。修改完成之后,需要执行rndc reload,动态加载DNS的解析。然后分别在master和slave上进行解析测试,如果都能正常范围,则表示主从同步是生效的。

  5. 增加DNS记录

    默认修改DNS配置文件时,要修改zone的serial值,在执行rndc reload之后,能够同步给slave节点。

    • A记录

      在zone文件中添加,直接编辑配置文件,比如在abc.com.zone配置文件中增加一条A记录,格式为 域名 A IP,修改完成后,同步给slave,通过dig host都能进行解析

    • CNAME记录

      CNMAE记录是个别名记录,就是将域名A映射到域名B上,实际上解析到的地址是域名B的地址。格式为:

      域名A     CNAME   域名B
      a       A   1.2.3.4
      b       CNAME   a
      c       A   2.3.4.5
      mx      mx 5    a
      mx      mx 10   c
      [root@master etc]# host b.abc.com 127.0.0.1
      Using domain server:
      Name: 127.0.0.1
      Address: 127.0.0.1#53
      Aliases: 
      
      b.abc.com is an alias for a.abc.com.
      a.abc.com has address 1.2.3.4
      
    • MX记录

      也是在zone文件中增加,格式为:

      域名      MX      PRIORITY    域名
      mx      MX      5           mail
      

      实际上MX记录,对应的是一个A记录,然后通过A记录,递归查找到最后MX对应的IP地址。

      [root@master etc]# host mx.abc.com 127.0.0.1
      Using domain server:
      Name: 127.0.0.1
      Address: 127.0.0.1#53
      Aliases: 
      
      mx.abc.com mail is handled by 5 a.abc.com.
      mx.abc.com mail is handled by 10 c.abc.com.
      

      同一个MX域名可以对应多条记录,结果按照优先级排列,优先级值越低,优先级越高,解析出来的排序就越高。

    • PTR记录

      PTR记录不仅仅是需要配置zone文件,是需要在zone配置文件view中,重新创建一个zone,然后创建该zone的目录文件,然后才能进行解析,将IP解析成对应的域名。

       zone "168.192.in-addr.arpa" {
          type    master;
          file    "192.168.zone";
          allow-transfer {
                  192.168.64.132;
          };
          notify  yes;
          also-notify {
                  192.168.64.132;
          };
      };
      

      然后创建一个192.168.zone的配置文件,编辑解析记录。

      [root@master etc]# cat 192.168.zone 
      
      $TTL 3600       ; 1 hour
      @                  IN SOA  op.abc.com. dns.abc.com. (
                                      2000     ; serial
                                      900        ; refresh (15 minutes)
                                      600        ; retry (10 minutes)
                                      86400      ; expire (1 day)
                                      3600       ; minimum (1 hour)
                                      )
                              NS      op.abc.com.
      131.64      IN PTR  master.abc.com
      

      实际上的这条解析记录意思是192.168.64.131 对应解析到的域名是master.abc.com

      [root@master etc]# host 192.168.64.131 127.0.0.1
      Using domain server:
      Name: 127.0.0.1
      Address: 127.0.0.1#53
      Aliases: 
      
      131.64.168.192.in-addr.arpa domain name pointer master.abc.com.168.192.in-addr.arpa.
      

      解析的结果131.64.168.192.in-addr.arpa master.abc.com.168.192.in-addr.arpa. 实际上要看的就是zone之前的内容,后面的都是zone的名称

      增加了PTR记录之后,slave默认是不会自动同步的,因为修改了view文件,这个时候就需要在slave上手动创建zone,和之前的zone一样,从master上进行同步。

TIPS

  1. DNS可以做简单的LB,因为DNS对应关系是一个多对多的对应关系,在对同一个域名进行解析的时候,会采用轮询的方式,向客户端返回请求的域名对应的地址,也就是说,在一定程度上,能够实现LB负载。
  2. 智能DNS:根据客户端的地址,来解析到对应的地址,这个方式和CDN缓存差不多,都是基于客户端来进行判断的,保证解析到的地址,是客户端最快能访问到的。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!