Linux——DNS服务搭建、正反向解析、主从DNS

DNS 是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写,域名服务器是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的表,以解析消息的域名。     
域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置,地理上的域名,指代有行政自主权的一个地方区域)。
FQDN(Fully Qualified Domain Name),即完全合格域名。FQDN由两个部分组成:主机名和域名。因为DNS是逐级管理的,所以在不同的层级中主机名与域名也是不同的;以www.google.com为例,在第二层中,.com就是域名,google就是主机名,而到了第三层中,.google.com就成了域名,www就成了主机名。
主机名与域名并不是依据".“来划分的,主机名中也可以包含”."号的,主要还是要根据域名的注册情况来划分。
正向解析,从FQDN转换为IP地址称为正向解析。
反向解析 ,从IP地址转换为FQDN称为反向解析。
区域,正向解析或反向解析中,每个域的记录就是一个区域。

一、DNS查询原理

Domain Name Service域名服务,使用的UDP服务端口为53,TCP服务端口也是53端口。计算机通信在网络层的时候主机通信靠的是ip地址,需要名称解析,早期名称解析是由名称分配机构(ICANN)负责,他们使用ftp服务器供用户下载,不使用hosts文件,通过访问服务器数据进行查询。由UDP进行传输,但是可以自动转化为TCP,每台主机在访问名称解析服务器数据库后缓存在本机上,模拟一个dns缓存服务器,单这种解析方式也不适合使用访问量较大的网站,所以分布式数据库应运而生。
DNS系统在网络中的作用就是维护一个地址分布式数据库,其中记录了各种主机域名和IP地址的对应关系,以方便客户程序提供正向和反向的地址查询服务。
正向解析:根据域名查找IP地址。
反向解析:根据IP地址查域名。

1.DNS架构

Linux——DNS服务搭建、正反向解析、主从DNS_第1张图片

2.域

分为根:全球有13组根节点域名服务器,注意是13组,而非13台,负责对授权和索引。
一级域又称顶级域。每台主根都要向根服务器提出申请
组织域:.com .net .mil .gov .org .edu
国家域:.cn .hk .tw .jp .us
反向域:.in-addr.arpa
组织域
Linux——DNS服务搭建、正反向解析、主从DNS_第2张图片
国家域
Linux——DNS服务搭建、正反向解析、主从DNS_第3张图片

3.域名服务器分类

Linux——DNS服务搭建、正反向解析、主从DNS_第4张图片根据所管理的区域地址数据的来源不同,DNS系统可以分为不同的类型,在同一台DNS服务器中,相对于不同的区域来说,也拥有不同的身份,常见的几种类型如下:
缓存域名服务器:只提供域名解析结果的缓存功能,目的在于提高查询速度和效率,但是没有自己控制的区域地址数据。构建缓存域名服务器是,必须设置根域或指定其他DNS服务器作为解析来源。服务器本身不提供解析区域,只提供非权威应答。
主域名服务器:维护某一个特定DNS区域的地址数据库,对其中的解析记录具有自主控制权,是指定区域中唯一存在的权威服务器、官方服务器。构建主域名服务器时,需要自行建立所负责区域的地址数据文件。为客户端提供域名解析的主要区域,主DNS服务器宕机,会启用从DNS服务器提供服务。
从域名服务器:与主域名服务器提供完全相同的DNS解析服务,通常用于DNS服务器的热备份。对于客户机来说,无论使用主域名服务器还是从域名服务器,查询的结果都是一样的。区别在于:从域名服务器提供的解析结果不是由自己决定的,而是来自于主域名服务器。构建从域名服务器时,需要指定主域名服务器的位置,以便服务器能自动同步区域的地址数据库。主服务器DNS长期无应答,从服务器也会停止提供服务。主从区域之间的同步采用周期性检查+通知的机制,从服务器周期性的检查主服务器上的记录情况,一旦发现修改就会同步,另外主服务器上如果有数据被修改了,会立即通知从服务器更新记录。
DNS服务器的角色只是针对某一个特定的区域而言,比如:一个区域的主域名服务器可以同时是另一个区域的从域名服务器。
转发服务器    
当DNS服务器的解析区域(包括缓存)中无法为当前的请求提供权威应答时,将请求转发至其它的DNS服务器,此时本地DNS服务器就是转发服务器。

3.查询方式

DNS采用两种查询机制:递归(Recursive Query)和迭代(Iterative Query)。
递归查询 
​如果DNS服务器不能直接回应解析请求,他将以DNS客户端的方式继续请求其他DNS服务器,直到查询到该主机的域名解析结果。回复的结果可以是该主机的IP地址或者是该域名无法解析。递归查询过于消耗资源。
迭代查询
​在迭代查询方式中,如果服务器找不到相应的记录,会向客户端返回一个可能知道结果的域名服务器地址,由客户端继续向新的服务器发送查询记录。
Linux——DNS服务搭建、正反向解析、主从DNS_第5张图片
Linux——DNS服务搭建、正反向解析、主从DNS_第6张图片
实际应用中,即使用递归查询,又使用迭代查询
Linux——DNS服务搭建、正反向解析、主从DNS_第7张图片

4、DNS反向查询

找到目标主机后叫肯定应答
未找到目标主机叫做否定应答
FQDN(Full Qulified Domain Nmae)完全合格域名
DQDN-→IP 正向解析
IP-→DQDN 反向解析

5.资源记录有类型

SOA资源记录(起始授权资源记录):全称Start of Authority Record,定义了域的全局参数,进行整个域的管理设置。每个域在域开头处都包含了一个SOA资源记录,一个域文件只允许存在唯一的SOA记录。
NS资源记录(域名服务器资源记录):用来指定该域名由哪个DNS服务器来进行解析。每个域在域根处至少包含一个NS记录。
A资源记录(地址资源记录):用来把FQDN(全限定域名)映射到IP地址,正是因为有此记录DNS服务器才能解析域名对应的IP地址。  
PTR资源记录(指针资源记录):用来把IP地址映射到FQDN,用于反向查询。  
CNAME资源记录(别名资源记录):创建特定的FQDN的别名,隐藏用户网络的实现细节,使客户机无法知道真正的域名。  
MX资源记录(邮件交换资源记录):为DNS域名指定邮件交换服务器。SOA:start of authority 起始授权记录。
每个区在区的开始处都包含了一个起始授权记录(Start of Authority Record),简称SOA 记录。

6.DNS的查询顺序

本地hosts文件,本地DNS缓存,本地DNS服务器,发起迭代查询

7.DNS使用的端口号

DNS协议使用udp/tcp的53端口提供服务,客户端向DNS服务发起请求时,使用udp的53端口;DNS服务器间进行区域传送的时候使用TCP的53端口。

二、DNS服务器安装搭建

Linux系统下假设DOS服务器通常时使用Bind程序来实现的。Bind是最知名域名服务器软件,他完整的实现了DNS协议规定的各种功能。可以在各种主流的操作系统平台上运行,并且被作为许多供应商的unix标准配置封装在产品中。

1.BIND安装
[root@master ~]# yum install -y bind bind-chroot bind-utils 
BIND 全称为Berkeley Internet Name Domain(伯克利因特网名称域系统),BIND 主要有三个版本:BIND4、BIND8、BIND9。BIND8版本融合了许多提高效率、稳定性和安全性的技术,而BIND9 增加了一些超前的理念,例如IPv6支持、密钥加密、多处理器支持、线程安全操作、增量区传送等。
bind包里包含了DNS服务的主程序包。
bind-chroot包是bind的一个功能包,使bind可以在chroot模式下运行。也就是说bind运行的主目录并不是系统的根目录,只是系统的一个子目录而已。这是为了提高安全性,使得访问的范围仅限于这个子目录。
bind-utils包是客户端工具,系统默认安装,用于搜索域名指令。

DNS服务器是named,端口53用于客户端查询,端口953用于DNS主从同步。

[root@master ~]#systemctl start named
[root@master ~]#systemctl enable named
[root@master ~]#netstat -antup | grep named
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      2347/named         
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      2347/named         
tcp6       0      0 ::1:53                  :::*                    LISTEN      2347/named         
tcp6       0      0 ::1:953                 :::*                    LISTEN      2347/named         
udp        0      0 127.0.0.1:53            0.0.0.0:*                           2347/named         
udp6       0      0 ::1:53                  :::*                                2347/named
2.资源记录

资源记录的语法格式
name [TTL] IN RRTYPE VALUE(IN表示INTERNET)
www 600 IN A 1.2.3.4
www.wang.com. 600 IN A 1.2.3.4

3.BIND配置文件
(1)BIND配置文件位置

A.BIND服务主配置文件
/etc/named.conf  
zone文件(域的dns信息)
/var/named/    
如果安装了bind-chroot(其中chroot是 change root 的缩写),BIND会被封装到一个伪根目录内,配置文件的位置变为:
BIND服务主配置文件
/var/named/chroot/etc/named.conf  
zone文件
/var/named/chroot/var/named/    
chroot是通过相关文件封装在一个伪根目录内,已达到安全防护的目的,一旦程序被攻破,将只能访问伪根目录内的内容,而不是真实的根目录
B.配置文件模板
/usr/share/doc/bind-9.9.4/sample/etc/*
/usr/share/doc/bind-9.9.4/sample/var/*

(1)主配置文件解析

/etc/named.conf 是BIND的核心配置文件,它包含了BIND 的基本配置,但其并不包括区域数据。在/etc/named.conf中大致分为针对全局生效,存放常规设置的options部分;以及针对某个区域,由各个区域设置的zone部分。另外还有logging(日志选项)和acl(访问控制列表)可选。

[root@master ~]# vim /etc/named.conf   
options {
         listen-on port 53 { 127.0.0.1; }; //指定BIND通过哪些网络接口和哪个端口来接收客户端请求。如果省略端口号,则使用默认端口53。127.0.0.1允许接收来自本地的请求。如果完全省略此项或网络接口是any,则默认使用所有端口。listen-on port 53 { any; }; ,监听任意ip地址。
         listen-on-v6 port 53 { ::1; }; //指定BIND通过哪个端口监听IPv6客户端请求。IPv6,服务器只接受通配符地址,any和none。listen-on-v6 port 53 { any; }。
         directory       "/var/named";//BIND可以在该目录中找到包含区域数据的文件, #数据库默认放置的目录。
         dump-file       "/var/named/data/cache_dump.db";//统计信息
         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     { localhost; };//定义客户端可以自此发送DNS请求的网络。可以用地址信息(192.168.5.101/24)替换或使用any替换,allow-query     { any; };允许查询的范围。localhost表示本地。
         recursion yes;
         dnssec-enable yes;
         dnssec-validation yes;
         bindkeys-file "/etc/named.iscdlv.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;
        };
};
 
zone "." IN {

        type hint; //指定区域类型, type字段指定区域的类型,对于区域的管理至关重要,一共分为5种:master:主DNS服务器,拥有区域数据文件,并对此区域提供管理数据。slave:辅助DNS服务器,拥有主DNS服务器的区域数据文件的副本,服务器DNS服务器会从主DNS服务器同步所有区域数据。stub:stub区域与slave区域类似,但只复制主DNS服务器上的NS记录,而不像slave会复制所有区域数据。forward:转发配置域。hint:根域服务器的初始化使用的参数。
        file "named.ca";//区域文件,需要手动创建。范例文件为named.localhost
};
 
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
(2)域配置文件

/var/named/目录是DNS数据库文件存放目录,每一个域文件都放在这里。

(3)示例
示例1

搭建内网DNS服务器
A.修改主配置文件

[root@master ~]#cp /etc/named.conf /etc/named.conf.bak
[root@master ~]#vim/etc/named.conf
options {
        listen-on port 53 { any; };  //修改为any
        listen-on-v6 port 53 { any; };  //修改为any
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        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; };
        recursion yes;
        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;  //添加此行
        bindkeys-file "/etc/named.iscdlv.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;
        };
};
 
zone "master.cn" IN {  //区域名称改为master.cn
        type master;  //区域类型为主DNS服务器
        file "master.cn.zone";  //区域文件,需要手动创建。范例文件为named.localhost
};
 
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

B.创建区域文件

[root@master ~]#cp -a /var/named/named.localhost /var/named/master.cn.zone //-a选项保留源文件的权限
-rw-r----- 1 root named 257 5月 20 17:13 /var/named/master.cn.zone
[root@master ~]#vim /var/named/master.cn.zone
$TTL 1D  //设置有效地址解析记录的默认缓存时间,默认为1天
//master.cn.也可以使用@,表示当前的域
//dns.master.cn.该域的主域名
//root.master.cn.管理员邮件地址
master.cn.        IN SOA  dns.master.cn. root.master.cn. (
//更新序列号,用于标示数据库的变换,可以在10位以内。如果存在辅助DNS区域,建议每次更新完数据库,手动加1
                                        0       ; serial
//刷新时间,从域名服务器更新该地址数据库文件的间隔时间,默认为1天
                                        1D      ; refresh
//重试延时,从域名服务器更新地址数据库失败后,等待多长时间,默认为1小时
                                        1H      ; retry
//到期失效时间,超过改时间人无法更新地址数据库,那么不再尝试,默认为1周
                                        1W      ; expire
//无效地址解析记录默认缓存时间(该数据库中不存在的地址),默认为3小时。
                                        3H )    ; minimum
master.cn.        NS      dns.master.cn.
dns.master.cn.    A       192.168.1.71  #IPv4对应记录, AAAA    ::1            #IPv6对应记录
www.master.cn.    A       192.168.1.71
cname.master.cn.  CNAME   www.master.cn. 

IN可省略

示例2

搭建主从域名服务器
A.编写主域名服务器

[root@master named]# vim /etc/named.conf
 zone "master.cn" IN {
     type master;
     file "master.cn.zone";
     allow-transfer { 192.168.1.0/24; };    #允许哪个网段的从DNS服务器,可以同步DNS服务器zone文件,不写默认所有。
 };

B.编写从域名服务器

[root@node1 ~]# yum install bind bind-chroot bind-utils -y
[root@node1 ~]# systemctl start named
[root@node1 ~]# vim /etc/named.conf
listen-on port 53 { any; }; #监听任意ip地址
allow-query     { any; }; #允许查询的范围。
 
zone "master.cn." IN {
     type slave;        #配置slave从
     file "slaves/master.cn.zone";
     masters { 192.168.1.71; };//192.168.1.71;前后要有空格,否则飘红
 };

zone "1.168.192.in-addr.arpa" IN {
       type slave;
       file "slaves/192.168.1.arpa";
       masters { 192.168.1.71; };

};

C.客户端配置

[root@node1 ~]# ls /var/named/slaves/
[root@node1 ~]# systemctl restart named  
#客户端会下载主服务器域名配置文件
[root@node1 named]# cd slaves/
[root@node1 slaves]# ls
192.168.1.arpa  master.cn.zone
示例3

DNS主从密钥认证
访问控制(不同IP段,访问结果是不一样的),slave分担master压力,不同地域配置slave服务器,能够快速的响应客户端的请求,如果master挂掉,slave会马上接管master的服务请求,BIND服务器的软件包是bind,为了加强其安全性,最好安装bind-chroot软件包。使用了chroot机制之后,BIND会将“/var/named/chroot”认作是根目录。这样,即使BIND出现漏洞被非法入侵,入侵者获得的目录只是“/var/named/chroot”目录,而无法进入到系统的其它目录,从而加强了系统的安全性。
安装软件(master和node1都需要安装)
yum -y install bind bind-chroot

A.Server生成密钥

[root@master ~]# cd /var/named/chroot/etc/			//要在这个目录下生成密钥
[root@master etc]# dnssec- //相应文件很多
dnssec-checkds              dnssec-importkey-pkcs11     dnssec-keymgr               dnssec-signzone
dnssec-coverage             dnssec-keyfromlabel         dnssec-revoke               dnssec-signzone-pkcs11
dnssec-dsfromkey            dnssec-keyfromlabel-pkcs11  dnssec-revoke-pkcs11        dnssec-verify
dnssec-dsfromkey-pkcs11     dnssec-keygen               dnssec-settime              dnssec-verify-pkcs11
dnssec-importkey            dnssec-keygen-pkcs11        dnssec-settime-pkcs11       
[root@master etc]# dnssec-keygen  //相关帮助
Usage:
    dnssec-keygen [options] name

Version: 9.11.4-P2-RedHat-9.11.4-9.P2.el7
    name: owner of the key
Options:
    -K : write keys into directory
    -a :
        RSA | RSAMD5 | DSA | RSASHA1 | NSEC3RSASHA1 | NSEC3DSA |
        RSASHA256 | RSASHA512 | ECCGOST |
        ECDSAP256SHA256 | ECDSAP384SHA384 |
        ED25519 | ED448 | DH |
        HMAC-MD5 | HMAC-SHA1 | HMAC-SHA224 | HMAC-SHA256 | 
        HMAC-SHA384 | HMAC-SHA512
       (default: RSASHA1, or NSEC3RSASHA1 if using -3)
    -3: use NSEC3-capable algorithm
    -b :
        RSAMD5:	[512..4096]
        RSASHA1:	[512..4096]
        NSEC3RSASHA1:	[512..4096]
        RSASHA256:	[512..4096]
        RSASHA512:	[1024..4096]
        DH:		[128..4096]
        DSA:		[512..1024] and divisible by 64
        NSEC3DSA:	[512..1024] and divisible by 64
        ECCGOST:	ignored
        ECDSAP256SHA256:	ignored
        ECDSAP384SHA384:	ignored
        ED25519:	ignored
        ED448:	ignored
        HMAC-MD5:	[1..512]
        HMAC-SHA1:	[1..160]
        HMAC-SHA224:	[1..224]
        HMAC-SHA256:	[1..256]
        HMAC-SHA384:	[1..384]
        HMAC-SHA512:	[1..512]
        (if using the default algorithm, key size
        defaults to 2048 for KSK, or 1024 for all others)
    -n : ZONE | HOST | ENTITY | USER | OTHER
        (DNSKEY generation defaults to ZONE)
    -c <class>: (default: IN)
    -d  (0 => max, default)
    -E :
        name of an OpenSSL engine to use
    -f : KSK | REVOKE
    -g : use specified generator (DH only)
    -L : default key TTL
    -p : (default: 3 [dnssec])
    -r : a file containing random data
    -s : strength value this key signs DNS records with (default: 0)
    -T : DNSKEY | KEY (default: DNSKEY; use KEY for SIG(0))
    -t <type>: AUTHCONF | NOAUTHCONF | NOAUTH | NOCONF (default: AUTHCONF)
    -h: print usage and exit
    -m :
       usage | trace | record | size | mctx
    -v : set verbosity level (0 - 10)
    -V: print version information
Timing options:
    -P date/[+-]offset/none: set key publication date (default: now)
    -P sync date/[+-]offset/none: set CDS and CDNSKEY publication date
    -A date/[+-]offset/none: set key activation date (default: now)
    -R date/[+-]offset/none: set key revocation date
    -I date/[+-]offset/none: set key inactivation date
    -D date/[+-]offset/none: set key deletion date
    -D sync date/[+-]offset/none: set CDS and CDNSKEY deletion date
    -G: generate key only; do not set -P or -A
    -C: generate a backward-compatible key, omitting all dates
    -S : generate a successor to an existing key
    -i : prepublication interval for successor key (default: 30 days)
Output:
     K++.key, K++.private

[root@master etc]# dnssec-keygen -a hmac-md5 -b 128 -n host 7k  //生成密钥
master.cnk.+157+24319
[root@master etc]# cat master.cnk.+157+24319.   //私钥公钥
master.cnk.+157+24319.key      master.cnk.+157+24319.private  
[root@master etc]# cat master.cnk.+157+24319.key 
7k. IN KEY 512 3 157 776mtXx4RHcKzegc2gs1CA==
[root@master etc]# cat master.cnk.+157+24319.private 
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: 776mtXx4RHcKzegc2gs1CA==
Bits: AAA=
Created: 20200206044717
Publish: 20200206044717
Activate: 20200206044717

[root@master named]# vim /etc/named.conf 
key 7k{
    algorithm hmac-md5;
    secret "776mtXx4RHcKzegc2gs1CA==";

};
zone "bgy.cn" IN {
    type master;
    file "master.cn.zone";
    allow-transfer { key 7k; };
};
[root@master named]# systemctl restart named

B.从服务器配置

 [root@node1 named]# vim /etc/named.conf 
key bgykey {
      algorithm hmac-md5;
      secret "/vWYeYPs1wtiU+gMHLVgFA==";
};
 
zone "bgy.cn." IN {
    type slave;
    file "slaves/bgy.cn.zone.file";
    masters { 192.168.220.138 key bgykey; };
}
[root@node1 named]# systemctl restart named
示例4

搭建带有反向解析的主从域名服务器
A.搭建主域名服务器

[root@localhost ~]# vim /etc/named.conf
options {
         listen-on port 53 { any; };    # 指定域名服务监听的网络端口,默认是本机,不能对外提供服务,建议改为any ,表示任意主机,也可以删除;
         listen-on-v6 port 53 { ::1; };
         directory       "/var/named";   # 指定从/var/named目录下读取DNS数据文件;
         dump-file       "/var/named/data/cache_dump.db";   # 当执行导出命令时将DNS服务器的缓存数据存储到指定的文件中;
         statistics-file "/var/named/data/named_stats.txt"; # 指定named服务的统计文件,当执行统计命令时会将内存中的统计信息追加到该文件中;
         memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };   # 允许哪些客户端访问DNS服务,默认是本机,建议改为“any”,表示任意主机,也可以删除;
                          
 zone "master.cn" in {                             
         type master;  #类型为主区域
        file "master.cn.zone";
 }; #添加正向解析数据文件的信息 ,服务器类型是主服务器,文件名为“master.cn.zone”
 
 zone "10.168.192.in-addr.arpa" in {
         type master;
        file "192.168.10.arpa";
 };#添加反向区域文件

10.168.192.in-addr.arpa、192.168.10.arpa必须这样写
B.编写正向区域文件master.cn.zone

[root@localhost ~]# cd /var/named
[root@localhost named]# cp -p named.localhost master.cn.zone
#复制原本正向区域的模板,复制时应加“-p”选项,保留权限,否则复制的时候,其他人没有读取的权限,服务启动成功后,不会解析域名的。不然的话,执行以下命令:
[root@localhost named]# chmod o+r master.cn.zone
//给文件添加其他人可读的权限
[root@localhost named]# cp named.loopback 192.168.10.arpa
#复制原本反向区域的模板
[root@localhost named]# vim master.cn.zone 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@       IN      NS      ns1.master.cn.
ns1     IN      A       192.168.10.1
www     IN      A       192.168.10.10
ftp     IN      CNAME   www
#serial:序列号。可以供从服务器判断何时获取新数据的。
#refresh:指定多长时间从服务器要与主服务器进行核对,
#retry:如果从服务器试图检查主服务器的序列号时,主服务器没有响应,则经过这个时间后将重新进行检查
#expire:将决定从服务器在没有主服务器的情况下权威地持续提供域数据服务的时间长短
#minimum:高速缓存否定回答的存活时间                         

配置选项详解
Linux——DNS服务搭建、正反向解析、主从DNS_第8张图片C.编写反向区域配置文件192.168.10.arpa

[root@localhost named]# vim 192.168.10.arpa 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@       IN      NS      ns1.master.cn.
1       IN      PTR     ns1.master.cn.
10      IN      PTR     www.master.cn.

D.验证服务
检查对应的数据库文件

[root@localhost named]# named-checkconf -z /etc/named.conf
zone master.cn/IN: loaded serial 0
zone 10.168.192.in-addr.arpa/IN: loaded serial 0
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0

检查主区域配置文件

[root@localhost named]# named-checkconf /etc/named.conf 

#检查区域配置文件

[root@localhost named]# named-checkzone master.cn master.cn.zone
zone master.cn/IN: loaded serial 0
OK

启动DNS服务

[root@localhost named]# systemctl start named
[root@localhost named]# nslookup
> www.master.cn
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   www.master.cn
Address: 192.168.10.10
> ns1.master.cn
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   ns1.master.cn
Address: 192.168.10.1

D.搭建从域名服务器
安装bind服务

[root@localhost ~]# yum -y install bind*

编写主配置文件

[root@localhost ~]# vim /etc/named.conf
options {
        listen-on port 53 { any; };
         listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
        forwarders { 192.168.10.1; };#转发器,本机解析不了转发到192.168.10.1                                      
 zone "master.cn" in {
        type slave; #区域类型为辅助区域 
       masters { 192.168.10.1; }; #主服务器为192.168.10.1
        file "slaves/master.cn.zone"; #复制下来的文件保存到/var/named/slaves/目录下
         allow-transfer { 192.168.10.1; }; #允许从服务器上下载正向区域配置文件
  };
 zone "10.168.192.in-addr.arpa" {
         type slave;
         masters { 192.168.10.1; };
         file "slaves/192.168.10.arpa";
 }

检查named服务数据库配置文件

[root@localhost slaves]# named-checkconf -z /etc/named.conf
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0
[root@localhost /]# systemctl start named
[root@localhost /]# nslookup
> www.master.cn
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   www.master.cn
Address: 192.168.10.10
> ns1.master.cn
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   ns1.master.cn
Address: 192.168.10.1

从主域名服务器复制的正向区域文件

root@localhost /]# ls /var/named/slaves/
master.cn.zone

做转发器时需要把全局配置中的dnssec-enable ;
dnssec-validation 两个配置项全部改为“no”否则会失败!

示例5

正反向解析特殊写法
A.主配置文件

[root@Demo ~]# vim /etc/named.conf 
 options {
         listen-on port 53 { any; };				##开启端口监听  DNS为53号端口
         listen-on-v6 port 53 { ::1; };
         directory       "/var/named";
         dump-file       "/var/named/data/cache_dump.db";
         statistics-file "/var/named/data/named_stats.txt";
         memstatistics-file "/var/named/data/named_mem_stats.txt";
         allow-query     { any; };				##允许所有
         recursion yes;	
 
         dnssec-enable no ;						##可选择yes
         dnssec-validation no;					##可选择yes
         dnssec-lookaside auto;

         /* Path to ISC DLV key */
         bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";
};

logging {
        channel default_debug {
               file "data/named.run";
                 severity dynamic;
        };
 };
 
zone "." IN {									##定义一个名为“.”的区 查询类为IN
        type hint;								## 类型为hint
         file "named.ca";						##区文件是named.ca
  };
 
include "/etc/named.rfc1912.zones";				
 ##辅助区域配置文件,除了根域之外,其余所有区域配置都建议在这个配置文件中,主要为了方便管理,不会轻易破坏主配置文件。
 include "/etc/named.root.key";

B.创建正反向解析区域

[root@Demo ~]# vim /etc/named.rfc1912.zones 
 zone "Demo.com" IN {		##定义域名
         type master;
         file "named.localhost";	##正向解析文件
         allow-update { none; };
 };

 zone "0.168.192.in-addr.arpa" IN {		##定义IP地址段
         type master;
         file "named.loopback";			##反向解析文件
          allow-update { none; };
  };

C.编写正向解析文件

[root@Demo ~]# vim /var/named/named.localhost 
 $TTL 1D
 @       IN SOA  @ rname.invalid. (
                                         0       ; serial	
                                         1D      ; refresh	
                                         1H      ; retry
                                        1W      ; expire
                                         3H )    ; minimum
         NS      @
         A       127.0.0.1
         AAAA    ::1
 www     A       192.168.0.1
 test    A       192.168.0.2
 demo    A       192.168.0.3
***D.编写反向解析文件***
[root@Demo ~]# vim /var/named/named.loopback 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                         1W      ; expire
                                         3H )    ; minimum
         NS      @
         A       127.0.0.1
         AAAA    ::1
       PTR     localhost.
       PTR     www.Demo.com
       PTR     test.Demo.com
       PTR     demo.Demo.com
示例6

主从+视图+密钥
一.配置master
1.生成密钥
#cd /var/named/chroot/etc/
//要在这个目录下生成密钥
# dnssec-keygen --help //相关帮助
Usage:
dnssec-keygen -a alg -b bits -n type [options] name

Version: 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2
Required options:
    -a algorithm: RSA | RSAMD5 | DH | DSA | RSASHA1 | HMAC-MD5
    -b key size, in bits:
        RSAMD5:         [512..4096]
        RSASHA1:        	 [512..4096]
        DH:              [128..4096]
        DSA:             [512..1024] and divisible by 64
        HMAC-MD5:       [1..512]
    -n nametype: ZONE | HOST | ENTITY | USER | OTHER
    name: owner of the key
Other options:
    -c  (default: IN)
    -e use large exponent (RSAMD5/RSASHA1 only)
    -f keyflag: KSK
    -g  use specified generator (DH only)
    -t : AUTHCONF | NOAUTHCONF | NOAUTH | NOCONF (default: AUTHCONF)
    -p : default: 3 [dnssec]
    -s  strength value this key signs DNS records with (default: 0)
    -r : a file containing random data
    -v 
    -k : generate a TYPE=KEY key
Output:
     K++.key, K++.private
# dnssec-keygen -a hmac-md5 -b 128 -n host 7k			//生成密钥
master.cnk.+157+29709
# cat master.cnk.+157+29709.key                   //查看密钥
7k. IN KEY 512 3 157 DnNjNXxpHlNg8csb6V4dYA==			//记好或复制密钥

2.配置named.conf

# vim /var/named/chroot/etc/named.conf
options {
        directory "/var/named";
};
 
key 7k {                //定义密钥的名字为“7K”
        algorithm hmac-md5;            //定义密钥的算法为“hmac_md5”
        secret "DnNjNXxpHlNg8csb6V4dYA==";
};
acl ab_client {        //定义访问控制列表名为“ab_client”
        192.168.1.41;    //定义访问控制的IP
        192.168.2.0/24;
};
 
view "ab" {        //定义视图名为“ab”
        match-clients { ab_client; };    //选择控制列表
        recursion yes;            //是否允许客户端缓存数据:yes允许,no不允许
        zone "carlow.com.zone" {        //完全自定义zone文件名
                type master;        //类型:master
                file "carlow.com.zone";
                allow-transfer { key 7k; };        //只有拿到密钥才能同步
        };
};
view "all" {
        match-clients { any; };        //必须是"any"
        recursion yes;
        zone "carlow.com" {
                type master;
                file "carlow.com.all";
                allow-transfer { key 7k; };
        };
};

3.区配置

# pwd
/var/named/chroot/var/named
# cp /usr/share/doc/bind-9.3.6/sample/var/named/localhost.zone carlow.com.zone
# cp carlow.com.zone carlow.com.all
# vim carlow.com.zone
$TTL    86400
@               IN SOA  ns.carlow.com.       root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
                IN NS           ns.carlow.com.
ns              IN A            192.168.1.46		//服务器的IP;ns即nameserver
www             IN A            192.168.1.48		//www.carlow.com 的IP地址为 192.168.1.48
study           IN A            192.168.1.49		//study.carlow.com 的IP地址为 192.168.1.49
# vim carlow.com.all
$TTL    86400
@               IN SOA  ns.carlow.com.       root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
 
                IN NS           ns.carlow.com.
ns              IN A            192.168.1.46
www             IN A            192.168.1.100
study           IN A            192.168.1.200

master配置完成

3.开启服务

#service named start
Starting named:                                            [  OK  ]

二.配置slave

# pwd
/var/named/chroot/etc
# vim named.conf 
options {
        directory "/var/named/slaves";
};
 
key 7k {
        algorithm hmac-md5;
        secret "DnNjNXxpHlNg8csb6V4dYA==";        //密钥
};
acl ab_client {
        192.168.1.41;
        192.168.2.0/24;
};
 
view "ab" {
        match-clients { ab_client; };
        recursion yes;
        zone "carlow.com.zone" {
                type slave;
                file "carlow.com.zone";
                masters { 192.168.1.46 key 7k; };    //指定master的IP和密钥
        };
};
view "all" {
        match-clients { any; };
        recursion yes;
        zone "carlow.com.all" {
                type slave;
                file "carlow.com.all";
                masters { 192.168.1.46 key 7k; };
        };
};

slave配置完成

开启服务

# pwd
/var/named/chroot/var/named/slaves
# /etc/init.d/named start
Starting named:                                            [  OK  ]
# ls
carlow.com.all  carlow.com.zone				//看到master的区配置文件,表示成功

client端测试

一.网段一IP 192.168.1.41

1.指定dns服务器IP

# vim /etc/resolv.conf 
search domain.org
nameserver 192.168.1.46		//亦可是slave的IP

2.测试

# nslookup www.carlow.com        //nslookup命令查询域名IP
Server:         192.168.1.46
Address:        192.168.1.46#53
 
Name:   www.carlow.com
Address: 192.168.1.48
 
# nslookup study.carlow.com
Server:         192.168.1.46
Address:        192.168.1.46#53
Name:   study.carlow.com
Address: 192.168.1.49

二.网段二IP 192.168.2.49

1.指定dns服务器,同上

2.测试

# nslookup www.carlow.com
Server:         192.168.1.46
Address:        192.168.1.46#53
 
Name:   www.carlow.com
Address: 192.168.1.100
# nslookup study.carlow.com
Server:         192.168.1.46
Address:        192.168.1.46#53
 
Name:   study.carlow.com
Address: 192.168.1.200

效果

不同网段所访问的同一个地址(www.carlow.com)得到的结果是不一样的.

示例7 基于密钥认证的主从DNS

DNS面临的安全问题:主机枚举(Host Enumberation)、缓存毒化(Cache poisoning)、
父域攻击(Attacking the parent zone)
避免主机枚举的方式TSIG:事物签名,避免缓存毒化、父域攻击的方式DNSSEC。

 [root@master etc]# dnssec-keygen -a hmac-md5 -b 128 -n HOST master.cn.
Kmaster.cn.+157+24683
[root@master etc]# cat Kmaster.cn.+157+24683.key 
master.cn. IN KEY 512 3 157 8uQQCaYCqbxEGilYG2d/Rw==
[root@master ~]#vim /etc/named.conf
key "master.cn."{
        algorithm hmac-md5;
        secret " 8uQQCaYCqbxEGilYG2d/Rw=="; 
};
server 192.168.1.72{  
        keys { master.cn.; };
};
zone "master.cn" IN {
        type master;
        file "master.cn.zone";
        allow-transfer { key "master.cn."; };
};
zone "1.168.192.in-addr.arpa" IN {
        type master;
        file "192.168.1.arpa";
        allow-transfer { key "master.cn."; };
};
 
[root@master etc]rndc reconfig  

修改从服务器(172.16.16.1)的主配置文件:

[root@node1 ~]#vim /etc/named.conf
key "master.cn."{
        algorithm hmac-md5;
        secret " 8uQQCaYCqbxEGilYG2d/Rw=="; 
};
server 192.168.1.71{  //主从服务器互相认证
        keys { master.cn.; };
}; 
zone "1.168.192.in-addr.arpa" IN {
        type master;
        file "192.168.1.arpa";
        masters {  192.168.1.71;  };
        allow-transfer { key "master.cn."; };
};
zone "master.cn" IN {
        type slave;
        file "slaves/master.cn.zone";
masters {  192.168.1.71;  };
allow-transfer { key "master.cn."; };
};

};
 [root@master etc]# ndc reconfig //重读下配置文件

TSIG: Transaction Signatures详解

基于对称密钥加密技术的的DNS报文认证机制。密钥生成后存放至通信双方的配置文件中,报文传送前使用此密钥进行“签名”。事实上,由于使用的是对称加密技术,这里并不是实现了真正意义上的数字签名,而没有使用公钥加密技术的主要原因是基于速度的考虑。于是,出于安全的角度考虑,任何两台主机之间通信都应该使用特定的密钥。

dnssec-keygen命令
-a algorithm
指定算法,默认使用RSASHA.
-b keysize
指定支持的密钥长度。RSA: 512-2048, DH:128-4096, HMAC:1-512.
-n nametype
指定密钥的拥有者,即其使用级别;共有ZONE (DNSSEC zone key (KEY/DNSKEY)), HOST or ENTITY (host (KEY)), USER (a user(KEY)) or OTHER (DNSKEY),默认是ZONE。
{name}
The name of the key is specified on the command line. 对DNSSEC来说,名字必须是密钥所服务的ZONE的名称;对于TSIG来说,这通常是通信双方的名字.

TSIG在DNS服务器实现安全通信具有重要的意义,但也有着诸多缺陷。一是其使用基于对称密钥的认证机制使得密钥的管理和分发变得困难,因此其也不适用于互联网级别的应用,而仅能服务器企业;二是其仅提供至“下一跳”的安全性,因此较适用的场景仅是迭代查询的场景和主从之间的区域传送;三是DNS本身就是公共资源,它需要将结果公开给互联网,因此无法实现结果的机密性。四是目前为止,Linux的客户端尚不支持查询时对服务器进行认证。

(4)关于CNAME的负载均衡

DNS中的CNAME可以减轻运维压力,使得已有的DNS配置具有一定的灵活性和可扩展性。

A.CNAME转发
zone的DNS解析转发到另一个zone的DNS解析
old.taobao.com. IN CNAME new.taobao.com.
实际上上面的CNAME意图是错误的,因为old.taobao.com已经有了SOA和NS的记录。如果你为old.taobao.com配置了CNAME, 那么old.taobao.com在CNAME链中的角色是一个别名alias,在SOA和NS的角度看它的角色是一个权威名canonical name, 一个domain是不能同时承担这两种角色的。
所以,正确的做法应该是为zone下面的domain设置CNAME
img01.old.taobao.com. IN CNAME img.new.taobao.com.
img02.old.taobao.com. IN CNAME img.new.taobao.com.
B 指向CNAME的CNAME
标准DNS协议是不鼓励指向CNAME的CNAME的,因为这样会导致cname loop,同时会增加解析时间。我遇到的一个DNS服务器 就因为没有做CNAME loop的检查,不断向系统申请资源从而导致内存暴增直至宕机。

如果你决定你的DNS服务器不遵循标准DNS协议,支持多层CNAME的话,那么对于CNAME链的长度限制和CNAME loop的检查是 十分有必要的。
C. 多个CNAME值
一个domain name或许会有对应的对个CNAME,像下面这样:
img.taobao.com. IN CNAME img01.taobaocdn.com.
img.taobao.com. IN CNAME img02.taobaocdn.com.
img.taobao.com. IN CNAME img03.taobaocdn.com.
这看起来好像是一个不可思议的配置。但是你可以这样实现你的DNS服务器来做基于CNAME的负载均衡(sounds pathologicall), 方法就是你的DNS服务器每次会随机返回上面三个CNAME中的一(当然也可以是你设计的任何选择策略)。
值得一体的是,BIND9不支持这种多值的CNAME。
D.CNAME作为alias
mail.taobao.com. IN MX mail.taobaocdn.com.
mail.taobaocdn.com IN CNAME mail.alibaba.com.

————Blueicex 2020/2/5 9:50 [email protected]

你可能感兴趣的:(Linux)