DNS服务器的功能:将域名解析为IP地址(正向解析)或者将IP地址解析为域名(反向解析)
/etc/hosts (域名解析缓存文件)
分布式层次型
主机名+域名

DNS的解析过程(以解析www.baidu.com.cn为例)
1.查看本地缓存
2.默认查询本地/etc/hosts文件进行解析(具体先使用hosts文件或DNS由/etc/nsswitch.conf文件决定)
3.由本地域名服务器(/etc/resolv.conf)查询根域名服务器(进行迭代解析)和下级服务器
4.本地域名服务器得到结果后会进行缓存,然后再将结果告诉客户端


查询www.baidu.com.cn
递归查询:客户机-->本地域名服务器(查询没有结果,接着下面的步骤)
迭代解析:本地域名服务器-->根域名服务器(dig @a.root-servers.net . ns)(得到cn服务器的IP地址)
    本地域名服务器-->cn服务器(得到com.cn服务器的IP地址)
    本地域名服务器-->com.cn服务器(得到baidu.com.cn的IP地址)
    本地域名服务器-->baidu.com.cn服务器(得到最终域名服务器,解析相应的主机名)

DNS服务器的类型
    主域名服务器(省级代理)
        负责一个或一个以上原始区域的域名解析,有自己的区域数据文件,是一个权威服务器
    从域名服务器(市级代理)
        区域数据文件是从主域名服务器复制过来的,从域名服务器不是一个权威服务器
    缓存域名服务器(个人代理)
        纯粹的没有区域数据文件(本身不能响应任何DNS请求,所有记录全部向其它服务器查询)

DNS的记录类型
SOA:起始授权机构,至少是一个区域的权威服务器(主域名服务器),记录的是权威服务器的IP地址
NS:名称服务器,能解析特定域名的主机都是名称服务器(主域名服务器和从域名服务器)
A:正向记录,用于将域名解析为IP地址
PTR:反向记录,用于将IP地址解析为域名(邮件服务器)
MX:邮件交换记录,用于设置某个区域的邮件服务器地址
CNAME:别名记录,将服务器名另外设置一个名称
HINFO:硬件信息记录,并不向客户端发送回应
TXT:域名服务器版本记录,可以更改域名服务器的版本

DNS的客户端工具(10.0.100.251为DNS服务器IP)
host
    host www.sjjy.com 10.0.100.251
    host -t mx sjjy.com 10.0.100.251(针对没有定义具体IP的记录)
    host -t ns sjjy.com 10.0.100.251
    host 10.0.100.100 10.0.100.251
dig
    dig @10.0.100.251 blogs.sjjy.com
    dig @10.0.100.251 -t mx sjjy.com
nslookup
    nslookup www.sjjy.com 10.0.100.251
    nslookup
        server 10.0.100.251
        set type=mx
        sjjy.com
        

部署DNS服务器步骤
1.安装DNS服务器软件
    yum install bind*
2.在主配置文件里面定义相关的区域及信息
    vim /etc/named.conf(注意是以“//”作为注释,不是“*”)
    options {
    listen-on port 53 { 127.0.0.1; }; --- 监听端口和IP地址
    listen-on-v6 port 53 {};--- IPV6格式
    directory    "/var/named"; --- 区域数据文件
    dump-file    ""; --- 缓存文件
    statistics-file ""; ---
    memstatistics-file ""; ---
    allow-query    { localhost; }; --- 只允许本地查询,可以添加网段
    recursion yes; --- 允许递归查询

    dnssec-enable yes; --- DNS加密
    dnssec
    dnssec
    
    bindkeys-file
    managed-keys-directory
};

logging { ----  日志通道(默认/var/log/messages)
    channel default_debug {
        file "";    
    }
};

zone "." IN(internet) {
    type hint; --- 类型为缓存域名服务器(masetr(主域名服务器)|slave(从域名服务器))
    file "name.ca"; --- 存在于上面配置的directory目录下面,记录根域名服务器的地址
 
};

zone "sjjy.com" IN { --- 定义正向解析
    type master; --- 定义为主域名服务器
    file "sjjy.com.zone"; --- 定义具体的区域文件
};

zone "0.10.in-addr.arpa" IN { --- 定义反向解析
    type master; --- 同上面定义的正向解析
    file "10.0.rev"; --- 定义具体的区域文件
};

//当/etc/hosts文件删除,才会调用下面两个文件
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

};


编辑具体的区域文件
vim /var/named/sjjy.com.zone
$TTL 1D --- 缓存生存时间:1天
$ORIGIN    sjjy.com. --- 显示的声明区域名
@(代表具体的区域名称(sjjy.com.zone))    IN    SOA(权威服务器记录)    dns.sjjy.com. admin.sjjy.com.(管理员的邮件地址,“admin.”表示为“admin@”) (
    0    ; serial(序列号,用于主从域名服务器之间,为了识别何时进行更新,常用时间表示)
    1D    ;refresh(刷新时间,从域名服务器刷新的频率)
    1H    ;retry(间隔时间,当连接失败后,重连的间隔)
    1W(1个星期)    ;expire(清除时间)
    3H(3个小时)    ;minimum
)
    IN    NS    dns.sjjy.com. --- 定义名称服务器,多个换行写
    IN    NS    5(优先级,小的高,1-255)    dns2.sjjy.com.
    IN    MX    mail.sjjy.com.
dns    IN    A    10.0.100.251 --- 具体的主机对应的IP地址
dns    IN    A    10.0.100.250
mail    IN    A    10.0.100.100
www    IN    A    10.0.100.101
ftp    IN    A    10.0.100.102
blogs    IN    A    10.0.100.103
bk    IN    CNAME    blogs

vim /var/named/10.0.rev(可以不用写别名)
$TTL 1D --- 缓存生存时间:1天
$ORIGIN    0.10.in-addr.arpa. --- 显示的声明区域名
@(代表具体的区域名称(sjjy.com.zone))    IN    SOA(权威服务器记录)    dns.sjjy.com. admin.sjjy.com.(管理员的邮件地址,“admin.”表示为“admin@”) (
    0    ; serial(序列号,用于主从域名服务器之间,为了识别何时进行更新,常用时间表示)
    1D    ;refresh(刷新时间,从域名服务器刷新的频率)
    1H    ;retry(间隔时间,当连接失败后,重连的间隔)
    1W(1个星期)    ;expire(清除时间,更新失败后,多长时间后清除对应的缓存)
    3H(3个小时)    ;minimum(缓存服务器不能与主服务联系上后多长时间清除相应的记录)
)
    IN    NS    dns.sjjy.com.
251.100    IN    PTR    dns.sjjy.com.
100.100    IN    PTR    mail.sjjy.com.
101.100    IN    PTR    www.sjjy.com.
102.100    IN    PTR    ftp.sjjy.com.
103.100    IN    PTR    blogs.sjjy.com.


检查主配置文件和区域文件的语法是否有错
named-checkconf /etc/named.conf    --- 检查主配置文件语法
named-checkzone sjjy.com /var/named/sjjy.com.zone --- 检查正向区域配置文件语法
named-checkzone 0.10.in-addr.arpa /var/named/10.0.rev --- 检查反向区域配置文件语法

启动域名服务器
service named start
service named reload --- 不中断重启(在不对主配置文件进行操作的情况下)

更改正向区域文件和反向区域文件的属主和属组(因为运行named服务时是以named用户执行的)
chown named:named /var/named/sjjy.com.zone
chown named:named /var/named/10.0.rev

根域名服务器的更新:dig @a.root-servers.net . ns > /var/named/named.ca

练习:使用自己姓名的拼音作为域名搭建域名服务器,域名服务器要求有正反向区域,要求有soa、ns、mx、a、ptr、cname记录的定义,部署完成后要能够正常的提供相关域名的解析服务。


错误排除步骤
1.检查配置文件语法是否正确
    named-checkconf /etc/named.conf
    named-checkzone zlj.com zlj.com.zone
    named-checkzone 0.10.in-addr.arpa 10.0.rev
2.检查53号端口是否处于监听状态,监听什么地址
    lsof -i:53
    netstat -antpul | grep named
3.查看域名服务器配置是否正确
    vim /etc/resolv.conf
4.查看日志文件
    vim /var/log/messages
5.查看SELinux是否关闭
    getenforce
    setenforce 0


错误集:
dns_rdata_fromtext: zlj.com.zone:10: near 'mail.zlj.com.': not a valid number
解决办法:邮件服务器必须设置优先级

10.0.10.rev:3: SOA record not at top of zone (10.0.10.in-addr.arpa.10.0.10.in-addr.arpa)
解决办法:注意区域名后面需要带上".


从域名服务器(里面的数据是非权威数据,给主域名服务器提供容错功能和辅助解析,当主域名服务器宕机时,就会接管服务,在生存时间内有效)
vim /etc/named.conf
options {
    listen-on port 53 { 127.0.0.1; }; --- 监听端口和IP地址
    listen-on-v6 port 53 {};--- IPV6格式
    directory    "/var/named"; --- 区域数据文件
    dump-file    ""; --- 缓存文件
    statistics-file ""; ---
    memstatistics-file ""; ---
    allow-query    { localhost; }; --- 只允许本地查询,可以添加网段
    recursion yes; --- 允许递归查询

    dnssec-enable yes; --- DNS加密
    dnssec
    dnssec
    
    bindkeys-file
    managed-keys-directory
};

zone "." IN {
    type hint; --- 类型为缓存域名服务器(masetr(主域名服务器)|slave(从域名服务器))
    file "name.ca"; --- 存在于上面配置的directory目录下面,记录根域名服务器的地址
};

zone "sjjy.com" IN {
    type slave;
    file "slaves/sjjy.com.zone";
    master { 10.0.100.251; };
};

zone "0.10.in-addr.arpa" IN {
    type slave;
    file "slaves/10.0.100.rev"
    masters { 10.0.100.251; };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

编辑主域名服务器的正向和反向区域文件,添加从域名服务器,并且加大serial
vim /var/named/sjjy.com.zone
添加    从域名服务器
    IN    NS    dns1.sjjy.com.
dns1    IN    A    10.0.100.10

vim /var/named/10.0.0.rev
添加    从域名服务器
    IN    NS    dns1.sjjy.com.
10    IN    PTR    dns1.sjjy.com.

增加安全性,指定只有这个IP才能进行传输
vim /etc/named.conf
zone "sjjy.com" IN {
添加    allow-transfer { 10.0.100.252; };
};

DNS的其他相关配置
1.转发设置
vim /etc/named.conf
options { --- 全局定义,全部转发
    forward first|only;    first:表示先进行转发;only:表示先只选用转发
};

2.acl访问控制列表(对allow-query生效)
vim /etc/named.conf
acl mynet(列表名,自定义) { --- 不放在options里面
    10.0.0.0/16;
    192.168.10.10;
    172.16.0.0/24
};
特殊字符串
any    匹配任意主机
none    不匹配任何主机
localhost    匹配本机上的任何ipv4网络接口
localnets    匹配本机上的任何ipv4的本地网络

3.also-notify主动通知从域名服务器进行更新(当主域名服务器有更改时,但只是进行了service named reload,就需要它)
vim /etc/named.conf
options {
    also-notify { 10.0.5.151; };
};
从域名服务器上进行配置允许
options {
    allow-notify { 主域名服务器IP; };
};

4.黑名单配置(写进options里面)
blackhole {
    10.0.10.100;
    102.10.10.0/24;
};


------------------------------------------------------
DNS智能解析
1.视图的基本配置语法
    view 视图名 {
        match-clients { 客户端地址列表; };
        区域文件声明;    
    };
    示例:
    view "hunan" {
    match-clients { 172.16.0.0/16; }; --- 当ip地址很多时,使用acl,可以单独对acl生成一个文件,用include进行定义
    recursion yes;
    zone "sxjy.com" IN {
        type master;
        file "hn.sxjy.com.zone";
        allow-update { none; };
        allow-transfer { 172.16.20.223; };
        };
    zone "0.10.in-addr.arpa" IN {
        type master;
        file "hn.10.0.100.rev";
        allow-update { none; };
        allow-transfer { 172.16.20.223; };
        };
    };
    view "hubei" {
    match-clients { 172.20.0.0/16; }; --- 当ip地址很多时,使用acl,可以单独对acl生成一个文件,用include进行定义
    recursion yes;
    zone "sxjy.com" IN {
        type master;
        file "hb.sxjy.com.zone";
        allow-update { none; };
        allow-transfer { 172.16.20.223; };
        };
    zone "0.10.in-addr.arpa" IN {
        type master;
        file "hb.10.0.100.rev";
        allow-update { none; };
        allow-transfer { 172.16.20.223; };
        };
    };
    编辑区域配置文件
    vim hn.sxjy.com.zone(下面的设置是zlj.com,如果要使用的话,要修改为hn.sxjy.com)
$TTL 1D
$ORIGIN zlj.com.
@    IN    SOA    dns.zlj.com. admin.zlj.com. (
                    2016082309; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
    IN    NS    dns.zlj.com.
    IN    NS    dns1.zlj.com.
    IN    MX    5    mail.zlj.com.
dns    IN    A    10.0.10.178
dns1    IN    A    10.0.10.186
mail    IN    A    10.0.10.178
www    IN    A    10.0.0.254
ftp    IN    A    10.0.10.178
tftp    IN    CNAME    ftp    
    
    相应的在编辑hb.sxjy.com.zone时,保持NS服务器的IP地址不变,其他的主机IP地址作相应的改变
$TTL 1D
$ORIGIN zlj.com.
@    IN    SOA    dns.zlj.com. admin.zlj.com. (
                    2016082309; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
    IN    NS    dns.zlj.com.
    IN    NS    dns1.zlj.com.
    IN    MX    5    mail.zlj.com.
dns    IN    A    10.0.10.178
dns1    IN    A    10.0.10.186
mail    IN    A    10.0.100.178
www    IN    A    10.0.100.254
ftp    IN    A    10.0.100.178
tftp    IN    CNAME    ftp    


错误集:
** server can't find www.zlj.com:SERVFAIL
解决办法:将相应的区域配置文件的属主该为named

扩展
TSGI事务签名实现安全通信
首先,得要注释掉/etc/named.conf配置文件里面的dnssec,
第一步:在主服务器上生成密钥(每个视图都要生成一个密钥)
   # cd /etc
   # dnssec-keygen -a HMAC-MD5 -b 128 -n HOST hunan
   # cat Kchangsha.+157+36507.private
 
   # dnssec-keygen -a HMAC-MD5 -b 128 -n HOST hubei

第二步:在所有服务器的配置文件中加载密钥
   # vim /etc/named.conf
key "hunan" {
        algorithm hmac-md5;
        secret "9U4I7Ft1AGIm+d+MQ/rkaw==";
};

key "hubei" {
        algorithm hmac-md5;
        secret "9+tJAJ1soJT0daCB5evExw==";
};

第三步:设置主服务器的named.conf配置文件,在具体视图中使用密钥访问
注意:需要添加的地方有:
    match-clients { key changsha(当前视图名称); };
    server 其他服务器IP地址 { keys { changsha; }; };
    zone {
        allow-transfer { key changsha; };    
    };
第四步:设置从服务器的named.conf配置文件,在具体视图中使用密钥访问
注意:需要添加的地方跟第三步差不多,但是不需要在zone中添加,添加server时,注意,添加相互通信的就可以了