详解DNS BIND配置及原理

2023年 5月 4日 52.2k 0

网络出现的早起是使用IP地址通讯的,那是就几台主机通讯。但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和Windows也继承保留了这个文件)。这个文件中记录着主机名称和IP地址的对应表,这样只要输入主机名称,系统就会加载hosts文件并查找对应关系,找到对应的IP,就可以访问这个IP的主机了。 但是后来主机太多了,无法保证所有人都能拿到统一的最新的hosts文件,就出现了在文件服务器上集中存放hosts文件,以供下载使用。互联网规模进一步扩大,这种方式也不堪重负,而且把所有地址解析记录形成的文件都同步到所有的客户机似乎也不是一个好办法。这时DNS系统出现了,随着解析规模的继续扩大,DNS系统也在不断的烟花,直到现今的多层架构体系。

简介

DNS,全称Domain Name System,是一个记录域名和IP地址互相映射的一个系统,可以将用户访问互联网中所使用的域名转换成对应的IP地址。通过域名得到对应的IP地址的过程被称为域名解析。DNS运行于UDP协议之上,使用53端口

DNS 解析过程

首先,客户端先在本地缓存查找是否有缓存域名,比如没有,客户端发送DNS请求IP地址或主机名,DNS服务器在收到客户端的请求后;
(1) 检查DNS服务器的缓存,若查到请求地址或名称,即向客户机发送应答信息
(2) 若没有查到,则在数据库中查找,若查到请求的地址或名称,即向客户端发出应答信息
(3) 若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级域查找二级域,二级域查找三级,直至找到要解析的地址或名称,即向客户机所在的网络的DNS服务器发出应答相应
(4) 若没有找到,返回信息错误
5294226-96827b55e2fb888a.png-52.7kB

DNS服务器分类

DNS服务器的类型可以分为以下几种
(1) 主服务器,负责至少解析一个域内的域名,维护所负责解析的域数据库,可对该域数据进行读写操作
(2) 辅服务器,负责从主服务器或其他辅服务器中复制相关解析库,为主服务器缓解解析压力
(3) 缓存服务器,不负责域名解析,仅仅作为缓存,加速解析速度
(4) 转发服务器,发现非本机负责的请求后,不再向根发起请求,而是直接转发给指定的一台或多台服务器,自身并不保存查询
. 代表根域,负责全球互联网域名IPV4根服务器、域名体系和IP等管理。全世界共有13台IPV4根域服务器。1个位主根服务器在美国。其余12个均为辅根服务器,其中9台在美国,欧洲2台位于英国和瑞典,亚洲一个位于日本。
顶级域 .com,.net,.edu等这些域名为顶级域,也称为一级域。是互联网DNS等机制中最高的域,它保存于DNS域的名字空间中
国家域 .cn,.us,.tk以国家为单位的域,和顶级域作用相同
子域(二级域),提供互联网用户注册的域名,可以任意注册,并且不区分大小写 (例如baidu.com.)
每一个域内都有一个专门的DNS服务器,这些服务器负责接收并响应本域内的主机名的解析请求
dns-tree.jpg-55kB

DNS 查询方式

目前DNS查询方式有两种,分别为递归查询(recursion)和迭代查询(iteration)
递归查询:
客户端发起一个DNS解析请求,若本地DNS服务器不能为客户端直接解析域名,则域名服务器会代替客户端(下级服务器)向域名系统中的各分支的上下级访问器进行递归查询,直到有服务器响应回答了该请求后,将请求结果返回给客户端。在此期间,客户端将一直处于等待状态
迭代查询:
客户端(下级服务器)发起DNS解析请求后,若上级DNS服务器并不能直接提供该DNS的解析结果,则该上级DNS服务器会告知客户端(下级服务器)另一个可能查询到该DNS解析结果的DNS服务器IP。客户端(下级服务器)再次请求这个DNS服务器,如此类推,直到查询到对应的结果为止。

安装DNS服务器

本次环境说明

master  192.168.31.113   dns-01
slave   192.168.31.114   dns-02

系统Centos 7.8

Bind 9版本 9.11.4

没有特殊说明的地方,我们默认都在master节点操作 (需要关闭iptables)
安装BIND9

#关闭防火墙、selinux

systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

#设置yum源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo


#安装bind9
yum install -y bind

修改BIND9配置文件
BIND配置文件说明
/etc/named.conf 主配置文件
/etc/named.rfc1912.zones 区域数据文件
区域数据文件主要存放包括主机名和对应IP地址、刷新间隔和过期时间等;关于区域数据文件的参数下面文章会有介绍
bind配置默认路径为/etc/named.conf
/etc/named.conf为主配置文件,主要包含三个段落,分别为全局配置段、日志配置段和区域配置段

# named.conf主配置文件参数详解

//全局配置段
options {
        listen-on port 53 { 192.168.31.113; }; #设置通信的网段,这里建议使用本机IP,并非127.0.0.1
        listen-on-v6 port 53 { ::1; }; #监听bind端口
        directory       "/var/named";  #指定区域文件存放路径
        dump-file       "/var/named/data/cache_dump.db"; #设置当执行rndc dumpdb命令后导出文件存放路径
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt"; #服务器输出的内存使用统计文件名
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };  #允许查询来源(这里建议修改为IP地址,localhost代表只允许本机查询) any代表所有网段
        allow-transfer { none; } #允许查询的网段
        recursion yes; #是否开启递归查询
        dnssec-enable yes; #是否支持DNSEEC开关
        dnssec-validation yes; #是否开启dnsec确认开关
        bindkeys-file "/etc/named.root.key";
        managed-keys-directory "/var/named/dynamic";
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};


//日志配置段
logging {
        channel default_debug {         
                file "data/named.run";
                severity dynamic;
        };
  #本段参数解释,将日志写入工作目录下的named.run文件。注意:如果服务器用-f参数启动,则named.run会被stderr所代替,severity 按照服务器当前Debug级别记录日志
  #bind日志可以写到很多地方,具体写入方式可以参考https://blog.csdn.net/zhu_tianwei/article/details/45103455
};

//区域配置段
zone "." IN {             #.代表根域
        type hint;       #代表根服务器,除hint还有master 代表主域名服务器,slave代表辅助域名服务器,forward 代表转发服务器
        file "named.ca";  #域信息源数据库信息文件名
};

include "/etc/named.rfc1912.zones";   #区域管理文件(包含资源记录、宏定义和注释)
                                      #通常定义在/var/named目录下且以.zone结尾
include "/etc/named.root.key";

自定义区域配置

自定义主机区域配置文件
这里我们定义了一个abcdocker.com的域 (相当于我们购买了一个域名),可以放在/etc/named.rfc1912.zones文件中,也可以放置在自定义文件中,在/etc/named.conf中include即可

zone "abcdocker.com" IN {
        type master;
        file "abcdocker.com.zone";
        allow-update { 192.168.31.113;192.168.31.114; };
};

#allow-update代表动态域

我们在/etc/named.rfc1912.zones添加上面的域名解析,然后使用下面的命令检查配置文件是否正确

[root@dns-01 ~]# named-checkconf
[root@dns-01 ~]#

#没有报错代表正常

上面我们添加的是一个域名,相当于互联网购买了一个域名,但是这个域名目前没有解析。所以我们还需要配置自定义区域数据库文件(包含资源记录、宏定义和注释)

配置文件解释
$ORIGIN .     #宏定义段,代表根,否则在下面name段需要输入abcdocker.com.
$TTL 600;       #根缓存时间(10分钟)
abcdocker.com     IN SOA ns1.abcdocker.com. dnsadmin.abbcdocker.com. {  #SOA代表资源记录配置,格式上面已经说过了
                  20200816;   #
                  10800;
                  900;
                  604800;
                  86400;
                  }
                  NS ns1.abcdocker.com.

$ORIGIN abcdocker.com     #代表域名,下面的配置都相当于配置解析ns1.abcdocker.com,这里如果不写,下面就需要些ns1.abcdocker.com
$TTL 60;     #域名过期时间,时间为60秒过期
ns1              A     192.168.31.113

常用资源记录类型

常见资源记录类型

  • SOA: Start Of Authority,起始授权
  • NS: 域名服务器的标示记录
  • A: IPV4主机地址
  • AAAA: IPV6主机地址
  • MX: 邮件交换记录
  • CNAME: Canonical Name,正式名称(别名)
  • TXT: 文件字符串,长度限制512Byte,通常做SPF记录(反垃圾邮件)
  • PTR记录: 指针记录,用来实现反向解析
  • 资源记录(Resource Record)格式

    name [ttl(缓存时间)] IN 资源记录类型 (RRtype) Value
    
    
    宏定义$开头
    TTL       #缓存时间
    ORIGIN.   #源地址,ORIGIN . 意思代表根域
    

    常用资源记录类型配置详解

    上面已经解释了长用资源记录的集中类型,下面介绍一下资源记录的配置用法
    SOA记录
    SOA: 其实授权记录,只可以有一条。必须定义在资源记录最前面
    SOA 资源记录表明此DNS名称服务器是为该DNS域中的数据的信息的最佳来源。SOA 记录与 NS 记录的区别:简单讲,NS记录表示域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析;SOA记录设置一些数据版本和更新以及过期时间的信息.

    @ 600 IN SOA  dns.abcdocker.com. 管理员邮箱,这里不使用@,因为@有特殊含义,以.代替(dnsadmin.abcdocker.com.)(
         序列号(serial number) ;注释内容,十进制数据,不能超过10位,通常使用日期时间戳,例如2018121601
         刷新时间(refresh time) ;即每隔多久到主服务器检查一次
         重试时间(retry time) ;应该小于refresh time
         过期时间(expire time);当辅助DNS服务器无法联系上主DNS服务器时,辅助DNS服务器可以在多长时间内认为其缓存是有效的,并供用户查询。
         netgative answer ttl ;非权威应答的ttl,缓存DNS服务器可以缓存记录多长时间
     )
    

    NS记录
    用于表示域名对应的DNS服务器

    name:区域名称,通常可以简写为@
    value:DNS服务器的FQDN(可以使用相对名称)
    例子:
    @ 600 IN NS ns1
    
    #NS记录需要指定一个对应的A记录
    

    A记录
    需要解析的服务器,www代表我们的域名前缀,例如www.i4t.com,这里的www就是A记录

    www  600(单位s) IN A 192.168.31.113
    www  600(单位s) IN A 192.168.31.114
    

    MX记录

    #优先级:0-99,数字越小,级别越高,
    
    @ 600 IN MX 10 mail
    @ 600 IN MX 20 smtp
    

    CNAME记录

    eshop IN CNAME www
    

    正解域 & 反解域

    DNS正解: 域名解析->返回IP
    DNS反解: IP解析->域名
    反解域主要使用PTR记录:IP -->FQDN,只能定义在反向区域文件中,反向区域文件名称为逆向网络地址加.in-addr.arpa.后缀组成

    配置正解主机域

    正向解析文件(名字到地址的映射),反向解析文件(地址到名字的映射)
    我们需要修改两台服务器的FQDN
    FQDN 完全限定域名fully qualified domain name(FQDN)是internet上特定计算机或主机的完整域名。FQDN由两部分组成:主机名和域名。
    本次环境如下

    master  192.168.31.113  dns01-113.host.com
    slave   192.168.31.114  dns02-114.host.com
    

    第一步修改主机名,将主机名修改为FQDN格式

    hostnamectl set-hostname dns01-113.host.com
    

    目前我们在不设置host的情况下,两台节点是无法通过主机名进行通信

    [root@dns01-113 ~]# ping dns-02-114.host.com
    ping: dns-02-114.host.com: 未知的名称或服务
    

    1.配置/etc/named.rfc1912.zones(也可以在/var/named.conf)添加host.com 域配置文件

    vim  /etc/named.rfc1912.zones
    
    zone "host.com" IN {
            type master;
            file "host.com.zone";
            allow-update { 192.168.31.113;192.168.31.114; };
    };
    

    2.创建区域数据库文件

    [root@dns01-113 ~]# vim /var/named/host.com.zone
    
    $TTL 600
    @    IN   SOA  dns.host.com.    604419314.qq.com.   ( 20200817 10800 900 604800 86400 )
              NS   dns.host.com.
    
    $ORIGIN  host.com.
    $TTL  60
    dns01-113  A   192.168.31.113
    dns02-114  A   192.168.31.114
    
    dns        A   192.168.31.113
    
    #这里设置了一个dns的A记录,和NS记录,还有我们主机域的A记录
    

    3.检查配置文件

    [root@dns01-113 ~]# named-checkzone host.com /var/named/host.com.zone
    zone host.com/IN: loaded serial 20200817
    OK
    

    4.修改属租属主

    [root@dns01-113 ~]# chgrp named /var/named/host.com.zone
    [root@dns01-113 ~]# chmod 640 /var/named/host.com.zone
    

    5.修改dns文件

    [root@dns01-113 ~]# vim /etc/resolv.conf
    # Generated by NetworkManager
    search host.com
    nameserver 192.168.31.113
    

    6.重启BIND

    systectl restart named
    

    7.检查
    这时候我们没有添加host,已经给我们解析上

    [root@dns01-113 ~]# dig dns02-114.host.com
    
    ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> dns02-114.host.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53152
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;dns02-114.host.com.        IN  A
    
    ;; ANSWER SECTION:
    dns02-114.host.com. 60  IN  A   192.168.31.114
    
    ;; AUTHORITY SECTION:
    host.com.       600 IN  NS  dns.host.com.
    
    ;; ADDITIONAL SECTION:
    dns.host.com.       60  IN  A   192.168.31.113
    
    ;; Query time: 0 msec
    ;; SERVER: 192.168.31.113#53(192.168.31.113)
    ;; WHEN: 一 8月 17 06:30:50 EDT 2020
    ;; MSG SIZE  rcvd: 97
    

    维护正解域
    当我们创建了正解域,我们还要对正解域进行增删改查
    增加一条A记录

    [root@dns01-113 ~]# echo "dns03-114  A   192.168.31.114" >>/var/named/host.com.zone
    
    #检查配置文件
    named-checkzone host.com /var/named/host.com.zone
    
    #重启named
    [root@dns01-113 ~]# systemctl restart named
    [root@dns01-113 ~]# ping dns03-114.host.com
    PING dns03-114.host.com (192.168.31.114) 56(84) bytes of data.
    64 bytes from 192.168.31.114 (192.168.31.114): icmp_seq=1 ttl=64 time=0.473 ms
    64 bytes from 192.168.31.114 (192.168.31.114): icmp_seq=2 ttl=64 time=0.158 ms
    
    64 bytes from 192.168.31.114 (192.168.31.114): icmp_seq=3 ttl=64 time=0.123 ms
    64 bytes from 192.168.31.114 (192.168.31.114): icmp_seq=4 ttl=64 time=0.107 ms
    

    修改、删除记录

    这里不进行演示,和添加步骤相同
    

    配置反解域

    需要注意一点的是反解析对应的配置文件应该不带有后面ip地址
    例如我解析的IP为192.168.31.113 配置文件应该写为31.168.192.in-addr.arpa 其中113这里不写,是在后面添加解析时使用
    并且一个IP只能对应唯一的FQDN反解PTR记录,且应该与正解域对应
    首先编辑/etc/named.rfc1912.zones
    添加一个域名

    zone "31.168.192.in-addr.arpa" IN {
            type master;
            file "31.168.192.in-addr.arpa.zone";
            allow-update { 192.168.31.113; };
    };
    
    #检查配置文件
    [root@dns01-113 ~]# named-checkconf
    

    在/var/named/下创建反解域区域数据库文件

    [root@dns01-113 ~]# vim /var/named/31.168.192.in-addr.arpa.zone     #名称需要根据上面定义的来创建
    $TTL  60
    @         IN  SOA    dns.host.com.    604419314.qq.com. (
                         20200818
                         10800
                         900
                         64800
                         86400
                         )
                  NS     dns.host.com.
    
    $ORIGIN  31.168.192.in-addr.arpa.
    $TTL 60
    
    113          PTR     dns01-113.host.com.
    114          PTR     dns02-114.host.com.
    
    #####################
    提示: 如果我们$ORIGIN 31.168.192.in-addr.arpa.不写全,也是可以的。例如
    
    $ORIGIN in-addr.arpa.
    $TTL 60
    113.31.168.192   PTR   dns01-113.host.com.
    #上面的写法也是可以的
    

    说明: 反解域也是要有SOA记录的,在反解域中ns记录就不用在写A记录了,因为反解区域文件只可以有PTR,不可以有A记录
    检查区域配置文件是否正常

    #31.168.192.in-addr.arpa为我们反向解析的域名
    
    [root@dns01-113 ~]# named-checkzone 31.168.192.in-addr.arpa. /var/named/31.168.192.in-addr.arpa.zone 
    zone 31.168.192.in-addr.arpa/IN: loaded serial 20200818
    OK
    

    接下来重启named

    [root@dns01-113 ~]# systemctl restart named
    

    我们使用31.168.192.in-addr.arpa反向解析,这里就会显示我们对应的主机名

    #第一种方法
    [root@dns01-113 ~]# dig -t PTR 113.31.168.192.in-addr.arpa. @192.168.31.113  +short
    dns01-113.host.com.
    
    #第二种方法
    [root@dns01-113 ~]# dig -x 192.168.31.114 @192.168.31.113 +short
    dns02-114.host.com.
    
    #dig 后面ip为需要解析的ip,@后面ip为dns服务器ip
    

    常用检查dns工具

    nslookup 
    host
    dig
    

    需要注意的是现在我们的ns记录在内网,比如内网将abcdocker.com做了劫持,当访问a.abcdocker.com在内网设置解析,它会访问内网的节点。但是当内网没有添加解析,a.abcdocker.com并不会访问公网的解析,因为我们已经将ns记录修改成内网,不会在去公网上查询
    NS记录 NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。 您注册域名时,总有默认的DNS服务器,每个注册的域名都是由一个DNS域名服务器来进行解析的,DNS服务器NS记录地址一般以以下的形式出现: ns1.domain.com、ns2.domain.com等。 简单的说,NS记录是指定由哪个DNS服务器解析你的域名。

    相关文章:

    1. DNS BIND主辅同步配置
    2. 架构师之DNS实战
    3. CentOS 7 ETCD集群配置大全
    4. Kubernetes 1.14 二进制集群安装

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论