时间:2018.1.23
作者:李强
参考:man,info,magedu讲义,万能的internet
实验环境:VMware® Workstation 12 Pro ,Centos 6.9,Centos 7.4,SecureCRT Version 8.1.4
声明:以下英文纯属个人翻译,英文B级,欢迎纠正,以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。
版本:v1-2018.1.23

官方资料

[ https://www.isc.org/downloads/bind/doc/]

1、安装软件包

1.1 安装DNS服务器端

getent services domain

getent services | grep domain

可以提供DNS服务的软件有许多,历史悠久的有isc组织的bind

yum install bind (bind(Berkeley Internet Name Domain))

==配置文件==
/etc/logrotate.d/named
/etc/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/rwtab.d/named
/etc/sysconfig/named
/run/named
==库文件==
/usr/lib/systemd/system/named-setup-rndc.service
/usr/lib/systemd/system/named.service
/usr/lib/tmpfiles.d/named.conf
/usr/lib64/bind
/usr/libexec/generate-rndc-key.sh
==二进制文件==
/usr/sbin/arpaname
/usr/sbin/ddns-confgen
/usr/sbin/dnssec-checkds
/usr/sbin/dnssec-coverage
/usr/sbin/dnssec-dsfromkey
/usr/sbin/dnssec-importkey
/usr/sbin/dnssec-keyfromlabel
/usr/sbin/dnssec-keygen
/usr/sbin/dnssec-revoke
/usr/sbin/dnssec-settime
/usr/sbin/dnssec-signzone
/usr/sbin/dnssec-verify
/usr/sbin/genrandom
/usr/sbin/isc-hmac-fixup
/usr/sbin/lwresd
/usr/sbin/named
/usr/sbin/named-checkconf
/usr/sbin/named-checkzone
/usr/sbin/named-compilezone
/usr/sbin/named-journalprint
/usr/sbin/nsec3hash
/usr/sbin/rndc
/usr/sbin/rndc-confgen
==帮助文件==
/usr/share/doc/bind-9.9.4/..
/usr/share/man/man{1,5,8}/..
==日志文件==
/var/log/named.log
==数据库文件==
/var/named
/var/named/data
/var/named/dynamic
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback
/var/named/slaves

1.2 安装DNS客户端相关软件包

yum install bind-utils //客户端工具,例如diag、host、nslookup等。

yum install bind-chroot //会将所有的named服务的文件通过文件挂载的方式,生成一个新的根对于named服务来说。

2、相关概念,工作原理

FQDN:Full Qualified Domain Name

根域:13组根域,ICANN(The Internet Corporation for Assigned Namesand Numbers)互联网名称与数字地址分配机构,

负责在全球范围内对互联网通用顶级域名(gTLD)以及国家和地区顶级域名(ccTLD)系统的管理、以及根服务器系统的管理

  • 查询方式(递归和迭代)

    递归,我问你,你回答我

    迭代,我问你,我不知道,你去问甲,甲说我知道,你去问乙,乙说我知道,你去找丙,丙说我知道,xxx是ipxxx,

    一般我们就是递归到DNS服务器,然后DNS服务器去迭代查找,然后将查询的结果,回复给客户端请求。根不提供递归操作。

    DNS缓存机制。因为我们不可能总是去询问DNS服务器,所以会将你访问的DNS缓存到本地,设置一个老化时间。

    DNS请求,先决定我去×××啊,首先是nsswitch.conf 名称服务交换服务,去决定我们从哪里去查找名称解析。对于hosts而言默认是files然后是dns
    files定义在/etc/hosts中,dns定义在/etc/resolve.conf中。

  • DNS解析过程:
graph LR
A[DNS客户端]-->B[DNS客户端hosts文件]
B[DNS客户端hosts文件]-->|如果没找到|C[DNS客户端本地DNS缓存]
C[DNS客户端本地缓存]-->|没找到|D[DNS服务器]
D[DNS服务器]-->|是否属于本地zone|E[DNS服务器本地数据库]
E[DNS服务器本地数据库]-->|是否存在于本地缓存|F[DNS本地缓存]
F[DNS本地缓存]-->|没找到|G[DNS服务器iteration迭代查询]
  • Qustion:DNS如何查看本地缓存和清除缓存?

windows下可以通过ipconfig /displaydns 和ipconfig /flushdns

linux 下客户端默认不存在dns缓存信息,需要安装nscd软件包来管理dns缓存信息,但是只是能某种程度上提高dns解析的速度,但是其记录是data所以无法通过cat或者nscd命令本身查看,只能用nscd -i hosts 来清除dns的缓存。

DNS server 通过rndc flush 来清除缓存,具体看man rndc

2.1 Resource record

  • 资源记录

SOA:start of authority 起始授权,表明查询此区域从这里指定的DNS解析服务器开始

NS: name server 域名服务器,告诉我们这个区域有哪些DNS解析服务器,有哪些子域的DNS服务器

MX:mail exchanger 邮件交换器

A: address FQDN-IP,此区域下有哪些IPV4主机记录

PTR:pointer(指针) IP-FQDN 此记录在反向解析的区域中和正向解析的A记录作用一样

AAAA:address FQDN-IPV6,这个是针对IPV6的解析,和A记录一样,表示当前区域下有哪些IPV6主机

CNAME:canonical(正确) name 正确的记录,记录别名

资源记录放置在DNS的数据库文件(区域数据文件,区域有自己的名称)中,通常数据库文件是文本格式,

  • 资源记录格式:

name [ttl] class RRtype(资源记录类型) Value

1、ttl值可以从全局继承
$TTL 1D

2、@表示应用当前区域文件的区域名

3、 当相同的name对应多个不同的value值,采用轮询的方式来响应dns请求。

4、 多个不同的name对应相同的value值,仅代表能通过不同的名称找到这个主机ip而已

5、class 有三种常用IN ,HS,CH


SOA记录格式
$TTL 1D
@ IN  SOA xxx (

    ;serial
    ;refresh //从服务器同步时间
    ;retry   //从服务器同步失败后,再次尝试的时间
    ;expire  //当主服务器挂了,我尝试多久判断主服务器停止服务,我也停止服务,
    ;minimum //否定结果的缓存有效期

)
NS记录格式

MX记录格式

A记录格式
name 可以有多种表示方式
@ 表示区域名zone.
可以简写,也可以写全就是name.zone.
当大量连续相似的可以使用

$GENERATE 1-127  表示连续的1-127 然后之后用$ 来调用这个1-127

$ORIGIN EXAMPLE.
$GENERATE 1-127 HOST-$ A 1.2.3.$
表示
HOST-1.EXAMPLE. A 1.2.3.1.EXAMPLE.
...........................
...........................
HOST-127.EXAMPLE. A 1.2.3.127.EXAMPLE.
PTR记录格式

CNAME记录格式

3、 dig 和host 和nslookup客户端测试工具 ,rndc和named

  • 服务器端工具

  • rndc

SYNOPSIS
       rndc [-b source-address] [-c config-file] [-k key-file] [-s server] [-p port] [-V] [-y key_id] {command}

用法:
command常用如下
reload:从新加载配置文件和区域数据
flush:清除服务器的缓存
  • named
SYNOPSIS
       named [-4] [-6] [-c config-file] [-d debug-level] [-E engine-name] [-f] [-g] [-m flag] [-n #cpus]
             [-p port] [-s] [-S #max-socks] [-t directory] [-U #listeners] [-u user] [-v] [-V] [-x cache-file]
  • named-checkconf (检查named的配置文件语法)

SYNOPSIS
       named-checkconf [-h] [-v] [-j] [-t directory] {filename} [-p] [-z]
用法:
filename不指定默认是/etc/named.conf
-p:如果检查没有错误,以规范的格式删除/etc/named.conf和其中include的文件内容
-z:
-t:
  • named-checkzone(检查named的zone配置文件语法)
  • arpaname (将ip地址生成反向解析的arpa格式)

  • 客户端工具

  • dig(domain information groper域名信息搜索器)
SYNOPSIS
        dig [@server] [-b address] [-c class] [-f filename] [-k filename] [-m] [-p port#] [-q name] [-t type]
           [-x addr] [-y [hmac:]name:key] [-4] [-6] [name] [type] [class] [queryopt...]

       dig [-h]

       dig [global-queryopt...] [query...]
用法:

我们以百度www.baidu.com来查询

1、我们先找根服务器
dig NS .

然后去找负责com.区域的服务器

2、dig NS com. @a.root-servers.net.(192.5.5.241)

;; QUESTION SECTION:
;com.                           IN      NS

;; AUTHORITY SECTION:
com.                    172800  IN      NS      f.gtld-servers.net.
com.                    172800  IN      NS      l.gtld-servers.net.
com.                    172800  IN      NS      c.gtld-servers.net.
com.                    172800  IN      NS      d.gtld-servers.net.
com.                    172800  IN      NS      e.gtld-servers.net.
com.                    172800  IN      NS      j.gtld-servers.net.
com.                    172800  IN      NS      b.gtld-servers.net.
com.                    172800  IN      NS      k.gtld-servers.net.
com.                    172800  IN      NS      m.gtld-servers.net.
com.                    172800  IN      NS      i.gtld-servers.net.
com.                    172800  IN      NS      h.gtld-servers.net.
com.                    172800  IN      NS      g.gtld-servers.net.
com.                    172800  IN      NS      a.gtld-servers.net.

;; ADDITIONAL SECTION:
a.gtld-servers.net.     172800  IN      A       192.5.6.30
b.gtld-servers.net.     172800  IN      A       192.33.14.30
c.gtld-servers.net.     172800  IN      A       192.26.92.30
d.gtld-servers.net.     172800  IN      A       192.31.80.30
e.gtld-servers.net.     172800  IN      A       192.12.94.30
f.gtld-servers.net.     172800  IN      A       192.35.51.30
g.gtld-servers.net.     172800  IN      A       192.42.93.30
h.gtld-servers.net.     172800  IN      A       192.54.112.30
i.gtld-servers.net.     172800  IN      A       192.43.172.30
j.gtld-servers.net.     172800  IN      A       192.48.79.30
k.gtld-servers.net.     172800  IN      A       192.52.178.30
l.gtld-servers.net.     172800  IN      A       192.41.162.30
m.gtld-servers.net.     172800  IN      A       192.55.83.30

3、然后去找负责baidu.com.区域的服务器

dig NS baidu.com. @a.gtld-servers.net.(192.5.6.30)

查找负责解析baidu.com.区域的DNS服务器有以下
;; QUESTION SECTION:
;baidu.com.                     IN      NS

;; AUTHORITY SECTION:
baidu.com.              172800  IN      NS      dns.baidu.com.
baidu.com.              172800  IN      NS      ns2.baidu.com.
baidu.com.              172800  IN      NS      ns3.baidu.com.
baidu.com.              172800  IN      NS      ns4.baidu.com.
baidu.com.              172800  IN      NS      ns7.baidu.com.

;; ADDITIONAL SECTION:
dns.baidu.com.          172800  IN      A       202.108.22.220
ns2.baidu.com.          172800  IN      A       61.135.165.235
ns3.baidu.com.          172800  IN      A       220.181.37.10
ns4.baidu.com.          172800  IN      A       220.181.38.10
ns7.baidu.com.          172800  IN      A       119.75.219.82

4、然后去找www.baidu.com 

dig  NS  www.baidu.com @202.108.22.220

;; QUESTION SECTION:
;www.baidu.com.                 IN      NS

;; ANSWER SECTION:
www.baidu.com.          1200    IN      CNAME   www.a.shifen.com.

;; AUTHORITY SECTION:
a.shifen.com.           1200    IN      NS      ns2.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns1.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns5.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns3.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns4.a.shifen.com.

;; ADDITIONAL SECTION:
ns1.a.shifen.com.       1200    IN      A       61.135.165.224
ns2.a.shifen.com.       1200    IN      A       180.149.133.241
ns3.a.shifen.com.       1200    IN      A       61.135.162.215
ns4.a.shifen.com.       1200    IN      A       115.239.210.176
ns5.a.shifen.com.       1200    IN      A       119.75.222.17

它说www.name.com 是www.a.shifen.com 的别名,那么负责shifen.com的DNS服务器是哪个。有好多,然后又有好多可解析a.shifen.com的DNS服务器地址

dig NS shifen.com. @192.5.6.30

;shifen.com.                    IN      NS

;; AUTHORITY SECTION:
shifen.com.             172800  IN      NS      dns.baidu.com.
shifen.com.             172800  IN      NS      ns2.baidu.com.
shifen.com.             172800  IN      NS      ns3.baidu.com.
shifen.com.             172800  IN      NS      ns4.baidu.com.

;; ADDITIONAL SECTION:
dns.baidu.com.          172800  IN      A       202.108.22.220
ns2.baidu.com.          172800  IN      A       61.135.165.235
ns3.baidu.com.          172800  IN      A       220.181.37.10
ns4.baidu.com.          172800  IN      A       220.181.38.10

好我就去问a.shifen.com区域是谁负责解析的。

;; QUESTION SECTION:
;a.shifen.com.                  IN      NS

;; AUTHORITY SECTION:
a.shifen.com.           1200    IN      NS      ns2.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns1.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns4.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns5.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns3.a.shifen.com.

;; ADDITIONAL SECTION:
ns1.a.shifen.com.       1200    IN      A       61.135.165.224
ns2.a.shifen.com.       1200    IN      A       180.149.133.241
ns3.a.shifen.com.       1200    IN      A       61.135.162.215
ns4.a.shifen.com.       1200    IN      A       115.239.210.176
ns5.a.shifen.com.       1200    IN      A       119.75.222.17

5、那么解析 www.a.shifen.com 

dig A www.a.shifen.com @61.135.165.224 

;; QUESTION SECTION:
;www.a.shifen.com.              IN      A

;; ANSWER SECTION:
www.a.shifen.com.       300     IN      A       61.135.169.125
www.a.shifen.com.       300     IN      A       61.135.169.121

;; AUTHORITY SECTION:
a.shifen.com.           1200    IN      NS      ns1.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns2.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns3.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns4.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns5.a.shifen.com.

;; ADDITIONAL SECTION:
ns1.a.shifen.com.       600     IN      A       61.135.165.224
ns2.a.shifen.com.       600     IN      A       180.149.133.241
ns3.a.shifen.com.       600     IN      A       61.135.162.215
ns4.a.shifen.com.       600     IN      A       115.239.210.176
ns5.a.shifen.com.       600     IN      A       119.75.222.17
  • nslookup (交互式查询域名工具)
SYNOPSIS
        nslookup [-option] [name | -] [server]

用法:  
  nslookup 不加参数进入交互式模式
  nslookup host server 指定dns解析host
  交互式选项主要有set和ls,exit退出交互式模式
  • host
SYNOPSIS
        host [-aCdlnrsTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait] [-m flag] [-4] [-6] {name}
            [server]

用法:
    简单查询域名的工具,不加参数列出用法
    host [name] [server]  指定用哪个域名服务器去查询主机,可以正向查询,也可以反向查询,name指定为FQDN或者ip即可。

4、DNS服务器类型,主从方式,转发,master|slave|forward

  • 主DNS服务器
options{

   allow-transfer {slaverdns_ip;};

};

zone "magedu.com" IN {

  type master;
  file "named.magedu.com"

};
  • 从DNS服务器
options{

    allow-transfer {none;};
};

zone "magedu.com" IN {

  type slave;
  masters {masterdns_ip;};
  file "slaves/named.magedu.com";    
};
sequenceDiagram
主服务器->>从服务器:小弟来给你库
从服务器->>主服务器:好的大哥
从服务器->>主服务器:大哥数据库更新了没
主服务器->>从服务器:小弟没有更新
  • 转发服务器
全局转发:

options {

    forward first|only;   //only只转发,找到找不到都不去找根;first,先找ip,ip找不到去找根
    forwarders {ip;};

};

区域转发:

zone xxx IN {             //指定哪个区域需要转发            

    forward first|only;   //only只转发,找到找不到都不去找根;first,先找ip,ip找不到去找根
    forwarders {ip;};

};

5、子域

vim /var/named.magedu.com
    zhengzhou IN  NS  zhengzhou 
    zhengzhou IN  A   192.168.23.72

6、view(视图,智能DNS)和 acl

  • 步骤

    • 首先要创建acl匹配用户端ip(可以不使用acl,直接写1.0.0.0/16在match-clients中)
    • 然后要开启view,所有的zone和include 配置的zone数据都要移动到view视图配置中
    • 为不同的acl提供不同的数据库文件,返回的解析地址也更符合用户的需求。就是只能dns,因此这里重要的是acl中数据的精准和快速的匹配。
      
      以下就是针对不同地域的客户端主机,分配不同的dns解析数据库,去解析离客户端最近的服务器地址。通常配合CDN使用。
      acl chinet {1.0.0.0/16;};
      acl cmcc   {2.0.0.0/16;};   
      acl unicom {3.0.0.0/16;};
      acl other  {any;};
      view view_chinet{

    match-clients {chinet; };
    zone "magedu.com"{
    type master;
    file "named.magedu.com";
    };
    include "/etc/named.xxx"; //这里通常放置的公共的配置数据
    };
    view view_cmcc{

    match-clients {chinet; };
    zone "magedu.com"{
    type master;
    file "named.magedu.com";
    };
    include "/etc/named.xxx"; //这里通常放置的公共的配置数据
    };
    等其他视图

注意

DNS 使用udp 53 监听查询,主从区域数据同步需使用tcp 53 和udp 53

7、bind编译安装

前提:准备编译环境,开发工具等

  • 1、下载源码,并解压,进入编译安装目录

    [https://www.isc.org/downloads/xxx]
    tar xf bind-9.10.6-P1.tar.gz
    cd bind-9.10.6-P1
  • 2、执行编译操作

    mkdir -pv /home/lq/program/bind
    ./configure --prefix=/home/lq/program/bind --sysconfdir=/etc/named/ --without-openssl
    yum  groupinstall  Development tools
    yum  install openssl-devel
    make && make install 
  • 3、创建用户

    groupadd -r -g 53 named
    useradd -r -s /sbin/nologin -u 53 -g 53 named 
  • 4、创建相关配置文件,及添加程序执行路径到PATH变量

    
    echo 'export PATH='/home/lq/program/bind/bin:$PATH'' > /etc/profile.d/named.sh
    
    man -M  /home/lq/program/share/man   named.conf
    
    vim /etc/named.conf
    options {
    
        dirname=/var/named;
    
    };
    zone "." IN {
    
      type hint;
      file "named.ca";
    
    };
    
    mkdir /var/named
    
    vim /var/named/named.ca
    
    chmod 640
    chown root:named

- 5、创建服务启动脚本

# 8、dns全局环境搭建测试

- 实验目的:

模拟客户端-运营商服务器-根域(.)-根的一级子域(com)-一级子域的一级子域(magedu.com)-(magedu.com的主从服务器)-服务器主机(www.magedu.com)的解析过程。

- 地址规划:

编号 | 主机 | ip地址
---|---|---
1 | 根(.)| 192.168.23.71/24
2 | com域(dns.com.) | 192.168.23.72/24
3 | magedu.com主域(dnsmaster.magedu.com.) | 192.168.23.72/24
4 | magedu.com备域(dnsslave.magedu.com.) | 192.168.23.74/24
5 | www网站(www.magedu.com) | 192.168.23.75/24
6 | 运营商服务器 | 192.168.23.76/24
7 | 客户端  | 192.168.32.77/24

- 根配置:
vim /etc/named.conf
    options{
        directory "/var/named";
        recursion no;
    };
    zone "." IN {
       type hint;
       file "named.ca";
    };

vim /var/named/named.ca
    $TTL 1D
    @                   IN      SOA     @ ( 0 1D 3H 1W 2H)
    @                   IN      NS      a.root-servers.net.  
    a.root-servers.net. IN      A       192.168.23.71

chmod 640 /var/named/*
chmod 640 /etc/named/named.conf
chgrp -R named /var/named/
chgrp named /etc/named/named.conf

- com.域配置:
vim /etc/named.conf
    options{
        directory "/var/named";
        recursion no;
    };
    zone "." IN {
       type hint;
       file "named.ca";
    };
    zone "com." IN {
        type master;
        file "named.com";
    };

dig NS . @ 192.168.23.71 > /var/named/named.ca

vim /var/named/named.com
    $TTL 1D
    @                   IN      SOA     dns  ( 0 1D 3H 1W 2H)
    @                   IN      NS      dns  
   magedu               IN      NS      dnsmaster.magedu
   magedu               IN      NS      dnsslave.magedu
   dns                  IN      A       192.168.23.72
   dnsmaster.magedu     IN      A       192.168.23.73
   dnsslave.magedu      IN      A       192.168.23.74

chmod 640 /var/named/*
chmod 640 /etc/named/named.conf
chgrp -R named /var/named/
chgrp named /etc/named/named.conf 
- magedu.com.主域配置:
vim /etc/named.conf
    options{
        directory "/var/named";
        recursion no;
    };

    zone "magedu.com." IN {
        type master;
        file "named.magedu.com";
    };

vim /var/named/named.com
    $TTL 1D
    @                   IN      SOA     dnsmaster  ( 0 1D 3H 1W 2H)
    @                   IN      NS      dnsmaster 
    @                   IN      NS      dnsslave
   dnsmaster            IN      A       192.168.23.73
   dnsslave             IN      A       192.168.23.74

chmod 640 /var/named/*
chmod 640 /etc/named/named.conf
chgrp -R named /var/named/
chgrp named /etc/named/named.conf   
- magedu.com.备域配置:
vim /etc/named.conf
    options{
        directory "/var/named";
        recursion no;
    };

    zone "magedu.com." IN {
        type slave;
        masters {192.168.23.73;};
        file "named.magedu.com";
    };

vim /var/named/named.com
    $TTL 1D
    @                   IN      SOA     dnsslave  ( 0 1D 3H 1W 2H)
    @                   IN      NS      dnsmaster 
    @                   IN      NS      dnsslave
   dnsmaster            IN      A       192.168.23.73
   dnsslave             IN      A       192.168.23.74
   www                  IN      A       192.168.23.75
chmod 640 /var/named/*
chmod 640 /etc/named/named.conf
chgrp -R named /var/named/
chgrp named /etc/named/named.conf

- 运营商域配置:
vim /etc/named.conf
    options{
        directory "/var/named";
        allow-recursion {any;};
    };
    zone "." IN {
       type hint;
       file "named.ca";
    };
    zone "com." IN {
        type master;
        file "named.com";
    };

dig NS . @ 192.168.23.71 > /var/named/named.ca

chmod 640 /var/named/*
chmod 640 /etc/named/named.conf
chgrp -R named /var/named/
chgrp named /etc/named/named.conf

- 客户端配置:
echo -n 'nameserver 192.168.23.76' > /etc/resolv.conf


服务测试:

压力测试:

# 9、注意事项