DNS原理及实战配置指南

          家住海边喜欢浪zhang789.blog.51cto.com

目录

  • DNS简介

  • DNS域名结构介绍

  • 顶级域名

  • DNS工作原理

  • 工作模式和端口

  • 资源记录

  • 安装bind(详细)

  • 实战:配置一个正反向解析

  • 实战:配置DNS转发

  • 实战:配置DNS主从

  • 实战:子域授权

  • 实战:配置智能DNS

  • 根域架构拓扑图

DNS域名解析服务配置与管理详解

DNS简介

DNS服务可以为用户提供域名和IP地址之间的自动转换,通过DNS用户只需要输入机器的域名即可访问相关的服务,无需使用那些难以记忆的IP地址

DNS域名结构介绍

DNS域名又称DNS命名空间,它是以层次树状结构进行管理的,其顶层是根域,根域在整个DNS命名空间是唯一的,而根域下可以分为多个子域,每个子域又可以有多个子域

博主干货:DNS原理及实战配置指南_第1张图片

一个完整的域名是由顶级域以及各子域的名称所组成,各部分之间用圆点,“.”来分割,其中最后一个点是顶级域,最后一个“.”左边部分称为二级域名,二级域左边称为三级域名,以此类推

www.sina.com.cn

cn是一级域名,com是二级域名,sina是三级域名

顶级域名

域名 代表含义 域名 代表含义
.com 表示商业机构  .cn 中国 
.net 表示网络服务机构 .hk 中国香港 
.org 表示非营利性组织 .tw 中国台湾
.gov 表示政府机构  .us 美国 
.edu 表示教育机构  .jp 日本
.mil 表示军事机构 

DNS工作原理

随着计算机网络的快速发展,网络中的计算机数量也是随之快速增长,以前依靠hosts文件来实现主机名和IP地址之间的通信已经无法满足现状,DNS的出现提供了一个完整的解决方案

DNS服务采用C/S方式,域名和IP地址的维护工作全部在DNS服务端进行,用户无需再在本地手动维护hosts文件 
下面是通过DNS解析域名的工作过程

1、当需要DNS解析的时候,系统会向本地DNS服务器发出DNS解析请求,由本地DNS服务器进行域名和IP地址的解析工作
2、本地DNS服务器收到用户请求后,则会在自身的DNS数据库中进行查找匹配域名和IP对应的记录,如果找到则把结果返回给客户端,如果查不到,则把请求转发给根DNS服务器
3、根DNS服务器查到域名对应的顶级域,再由顶级域查找二级域,由二级域查找三级域,以此类推,直到找打需要解析的域名和IP地址,并把结果返回给本地DNS服务器
4、最终由本地DNS服务器把结果返回给客户端
5、如果经过查找依然无法查找到,则有本地DNS服务器返回给客户端解析错误信息


案例:访问www.QQ.com的dns解析过程

博主干货:DNS原理及实战配置指南_第2张图片

1、客户端需要解析www.qq.com,客户端向本地DNS服务器发送解析请求
2、本地DNS发现无法解析,转发给根域服务器,
3、根域服务器根据请求域名对应的顶级的com,返回com的服务器地址,
4、本地DNS服务器向com域dns服务器发出解析请求
5com域服务器返回qq.com域服务器的地址
6、以此类推,本地DNS服务器向qq.com域dns服务器发出解析请求,直到在qq.com域dns服务器上面找到www.qq.com所对应的IP地址
7、qq.com把查找到的域名对应IP地址信息返回给本地DNS服务器
8、最终再由本地DNS服务器把结果返回给客户端计算机

工作模式和端口

端口:TCP/53,UDP/53      //用户客户端查询,递归查询
    TCP/953,UDP/953    //DNS主从同步
工作模式:C/S模式

资源记录

1、SOA:起始授权记录,Start of Authority Record
   每个区的开始处都包含,SOA定义了域的全局参数,进行整个域的管理,一个区有且仅有一个SOA记录
2、NS:Name Server 域名服务记录
   指定该域名由那个DNS服务器来解析,每个区在区根处至少包含一条NS记录
3、A:address记录,吧FQDN映射到IP地址,因为有此记录,所以DNS服务器能够解析FQDN域名对应的IP地址
4、PTR:反A记录,指针PRT记录把IP映射到FQDN,用于反向查询,通过IP地址,找到域名
5、CNAME:别名记录,记录创建特定FQDN的别名,用户可以使用CNAME记录来隐藏网络用户的实现细节
6、MX:邮件交换记录,为DNS指定邮件交换服务器

DNS服务器的安装

Bind是一款开放的源代码DNS服务器软件,是目前使用最广泛的DNS服务器软件

[root@localhost ~]# yum install -y bind bind-utils
用脚本在每台服务器上面安装Bind软件,并且初始化主配置文件
#!/bin/bash
##安装Bind服务
if [ ! -e /etc/init.d/named ];then
       rpm -e --nodeps bind-utils &>/dev/null
       rpm -e --nodeps bind-libs &>/dev/null
       rpm -e --nodeps bind &>/dev/null
       rpm -e --nodeps bind-chroot &>/dev/null
       yum -y install bind bind-utils &>/dev/null && echo "Bind已安装成功,请稍等,初始化Bind主配置文件。。。"
else
       echo -------------------------------------------------
       echo "此台服务器Bind已安装,请退出........."
sleep 1
fi
##初始化Bind配置文件
cd /etc/
sed -i -e 's/localhost;/any;/g' -e '/port/s/127.0.0.1/any/g' named.conf
echo -------------------------------------------------
sleep 2
echo "初始化Bind配置文件已完成........."

关键文件

/etc/named.conf    #bind主配置文件
/etc/named.rfc1912.zones    #定义zone的文件
/etc/rc.d/init.d/named    #bind脚本文件
/etc/rndc.conf    #rndc配置文件
/usr/sbin/named-checkconf    #检测/etc/named.conf文件语法
/usr/sbin/named-checkzone    #检测zone和对应zone文件的语法
/usr/sbin/rndc    #远程dns管理工具
/usr/sbin/rndc-confgen    #生成rndc密钥
/var/named/named.ca    #根解析库
/var/named/named.localhost    #本地主机解析库
/var/named/slaves    #从文件夹

named.conf配置文件

bind的主要配置文件包括named.conf和相应的区域文件,bind中各种配置都是更改这个文件来完成的,修改完成后重启生效

named.conf是bind的主要配置文件,里面存储了大量的bind自身的设置信息,bind启动时候会去检测该文件,读取文件的内容,如果文件不存在,或者里面语法错误,会导致启动失败

named.conf配置文件是有配置语句和注释组成,每条配置语句以分好“;”作为结束符,多条配置语句组成一个语句块;注释使用两个//作为注释符

named.conf配置文件所支持的所有配置语句

acl         定义一个主机匹配列表,用户访问控制权限
controls    定义rndc工具与bind服务进程的通信
include     把其他文件的内容包含进来
key         定义加密秘钥
logging     定义系统日志信息
lwres       把named配置为轻量级解析器
masters     定义主域列表
options     设置全局选项
server      定义服务器属性
trusted-keys定义信任的dnssec秘钥
view        定义视图
zone        定义区域

实战:配置一个正反向解析

1、核心配置文件的修改

[root@localhost ~]# vim /etc/named.conf 
options {
       listen-on port 53 { any; };   //修改成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; };    //修改成any,谁都可以查询
       recursion yes;

2、正向解析配置zone文件指定

[root@localhost ~]# vim /etc/named.rfc1912.zones
// 添加正向,反向解析zone指定
zone "qq.com" IN {      //域名
       type master;    //type类型,master(主)
       file "qq.com.zone";  //区域文件保存位置.zone文件位置,用实例来说明买个字段的意思
       allow-update { none; };  //是否允许动态更新(DNS和DHCP结合是使用)
};

zone "252.1.10.in-addr.arpa" IN {
       type master;
       file "252.1.10.rev";
       allow-update { none; };
};

3、建立zone文件记录文件

[root@localhost named]# cat qq.com.zone 
$TTL 600
@   IN  SOA    qq.com.  root.qq.com. (
//@代表区域名,这里就是代表xuegod.cn,可以改写为xuegod.cn
//IN Internet Name
//SOA 权威结构,后面的dns.就是其实授权记录,有且仅有一条SOA
//主机名,DNS名称
//代表DNS管理员的邮箱地址,有什么问题通知谁,@用.代替@有其他含义
               20160321;    //序列号,手工改,同步用
               1H;          //1天更新,多长时间请求更新
               5M;          //一天联系上,过5个小时再试
               1W;          //1周时间过期,一直联系不上时
               10M )        //最短的有效期,10小时,不需要更新
       IN      NS      qq.com.    //最好和上面同步,如果要写完整,可以写qq.com.后面的.一定要带上
       IN      A       127.0.0.1  //主机头,这里填写主机头,注意要对我们上面的NS记录做一条主机记录
       IN      MX 10   mail1
mail1   IN      A       10.1.252.96
www     IN      A       10.1.252.96
cname   IN      CNAME   www
*       IN      A       10.1.252.96
[root@localhost named]# cat 252.1.10.rev
$ttl   1D
@   IN  SOA qq.com. root.qq.com.    (
       20160321;
               1H;
               5M;
               1W;
               10M )
   IN  NS  qq.com.
96  IN  PTR www.qq.com.      //PTR指针,反向解析记录

4、重启DNS服务

[root@localhost named]# service named restart
Stopping named:                                            [  OK  ]
Starting named:                                            [  OK  ]

5、在客户端设置DNS服务器后测试

[root@localhost named]# nslookup 
> www.qq.com
Server:     10.1.252.97
Address:    10.1.252.97#53

Name:   www.qq.com
Address: 10.1.252.96
> 10.1.252.96
Server:     10.1.252.97
Address:    10.1.252.97#53

96.252.1.10.in-addr.arpa    name = www.qq.com.
>

实战:配置DNS转发

博主干货:DNS原理及实战配置指南_第3张图片

1)当本地DNS服务器(也是转发器)收到查询时,它会尝试使用它主持和缓存的主要和辅助区域解析该查询;
2)如果不能使用本地数据解析查询,此时它作为客户端,会将查询转发给外网DNS服务器;
3)本地DNS(转发器)收到客户端的请求后会等待一段很短的时间,等待来自外网DNS的应答;
4)对于外网DNS来说,它接收到的查询请求是递归查询,此时,它自己需要向外层层迭代找到最终答案返回给转发器(此时转发器作为DNS客户端)
5)转发器将外网DNS返回的查询结果送到客户端(非权威答案),完成解析过程。


注:转发的前提——接收转发请求的服务器(这里是外网DNS)必须能够为请求者(这里是本地DNS,也是转发器)做递归查询;

转发的类型:

(1)无条件转发:转发所有针对非本机负责解析的区域的请求; 
在主配置文件/etc/named.conf的全局选项中添加如下内容:

options {    
   forwarders { ip; };    #指明转发器是谁
   forward only|first;    #only表示仅转发 ;first表示先进行转发,如果没查询到结果,那么它自己还会根据根提示向外迭代查询
};

(2)条件转发:仅转发对特定区域的请求(即转发域); 
在区域置文件/etc/named.rfc1912.zone中定义转发域:

zone "区域名称" IN {
   type forward;          #区域的类型为转发
   forwarders {  ip; };   #指明转发器是谁
   forward only|first;    #only表示仅转发 ;first表示先进行转发,如果没查询到结果,那么它自己还会根据根提示向外迭代查询
};

实例:配置转发服务器

我们按照上图当用户访问oa.qq.com,crm.qq.com在本地进行查询,当需要解析www.qq.com就转发的外网

[root@localhost ]# yum install -y bind bind-utils
[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; };           #修改
       recursion yes;
       
       idnssec-enable no;                //改成no不检查来源头部
       dnssec-validation no;
       dnssec-lookaside auto;
       forward first;          #only,仅仅转发,first,先查找再转发,实验效果,仅仅转发
               forwarders { 192.168.211.128; };
……

博主干货:DNS原理及实战配置指南_第4张图片

实战:配置DNS主从

博主干货:DNS原理及实战配置指南_第5张图片

上面我们已经讲过,一个域内的DNS服务器一般都需要两个,我们这里就进行主从配置和区域传送

从服务器配置文件

[root@localhost ]# vim /etc/named.conf
options {
       listen-on port 53 { any; };         #修改监控地址
       listen-on-v6 port 53 { any; };      #修改监控地址
       ● ● ● ● ● ●
       allow-query     { any; };           #允许所有来查询
       recursion yes;
       ● ● ● ● ● ●
       #dnssec-enable no;                  //改成no不检查来源头部
       #dnssec-validation no;
       #dnssec-lookaside auto;
       ● ● ● ● ● ●

时间同步主从都做

[root@localhost ~]# ntpdate 0.rhel.pool.ntp.org
[root@localhost ~]# ntpdate 0.rhel.pool.ntp.org

主配置

root@localhost ~]# vim /etc/named.rfc1912.zones
//主配置文件区域参数
zone "taobao.com" IN {
   type master;
   file "taobao.com.zone";
   allow-update { none; };
   notify yes;
       also-notify{ 192.168.211.136; };
};

从配置

[root@localhost ~]# vim /etc/named.rfc1912.zones
//从配置文件区域参数
zone "taobao.com" IN {
       type slave;
       file "slaves/taobao.com.zone";
   masters { 192.168.211.128; };
};

博主干货:DNS原理及实战配置指南_第6张图片

重启服务,查看目录下的文件

[root@localhost named]# ll /var/named/slaves/
total 4
-rw-r--r-- 1 named named 377 Oct  2 11:42 taobao.com.zone

实战:子域授权

二级域是我们的三级域就可以随意定义,联系公司各个部门,都应该有自己的服务器,因为公司上万人让一台DNS服务器去解析压力会很大,分成部门每个部门一台子域DNS解析服务器,就轻松很多,过程就是在父DNS服务器中定义区域解析条目


例: 
.<–根域 
.com <–顶级域(一级域) 
taobao.com <–二级域<–子域 
ops.taobao.com <–主机名<–子域<–子域

正向解析区域授权子域的方法

父域配置

在父主机上面的区域配置文件里面添加NS记录
[root@localhost ~]# vim /var/named/taobao.com.zone
$TTL    1D
@       IN      SOA     ns1.taobao.com.     ops.taobao.com. (
                       20161015;
                       1H;
                       5M;
                       3D;
                       12H;
                       )
       IN      NS      ns1
Ns1     IN      A       127.0.0.1
oa      IN      A       192.168.211.136
//添如下内容
    IN      NS         ops     //添加一条NS记录将ops.taobao.com. 域授权ops管理
ops     IN      A       192.168.211.136  //对应上条的NS记录A记录

子域配置(授权域)

在从服务器添加ops的子域区域
[root@localhost named]# vim /etc/named.rfc1912.zones
//添加ops.taobao.com区域
zone "ops.taobao.com" IN {
       type master;
       file "ops.taobao.com.zone";
};
添加区域的zone
[root@localhost named]# cat /var/named/ops.taobao.com.zone 
$TTL    1D
@       IN      SOA     ns1.ops.taobao.com.     ops.taobao.com. (
                       2016102;
                       1H;
                       5M;
                       3D;
                       12H;
                       )
       IN      NS      ns1.ops.taobao.com.
Ns1     IN      A       127.0.0.1
mail        IN      A       192.168.244.55
zabbix  IN      A       192.168.244.66
it      IN      A       192.168.244.66
测试
[root@localhost named]# host -t A zabbix.ops.taobao.com 192.168.211.128
Using domain server:
Name: 192.168.211.128
Address: 192.168.211.128#53
Aliases:

zabbix.ops.taobao.com has address 192.168.244.66
[root@localhost named]# host -t A it.ops.taobao.com 192.168.211.128
Using domain server:
Name: 192.168.211.128
Address: 192.168.211.128#53
Aliases:

it.ops.taobao.com has address 192.168.244.66
[root@localhost named]# host -t A oa.taobao.com 192.168.211.128
Using domain server:
Name: 192.168.211.128
Address: 192.168.211.128#53
Aliases:

oa.taobao.com has address 192.168.211.136

实战:配置智能DNS

bind的视图功能,又称脑裂(split-brain): 
根据客户端来源的不同,将同一个名称解析至不同的值。 
例如,一个企业有两台web主机,对应于一个FQDN,一台位于电信机房,一台位于联通机房,为了用户访问的便利,我们欲将电信用户的域名查询请求解析为电信那台主机的ip地址,将联通用户的请求解析为另一台主机的地址,bind的视图功能就可实现这种需求。

1、一旦启动了view, 所有的zone都只能在view中定义
2、仅有必要在匹配到允许递归请求的客户所在view定义根区域
3、客户端请求到达, 是自上而下检查每个view所服务器的客户端列表

核心配置文件

[root@localhost named]# cat /etc/named.conf 
acl local { 127/8; };           #最前面添加
acl network { 192.168.211/24; };
#zone "." IN {              #这一段要注销,写到我们的include的zone文件中
#       type hint;
#      file "named.ca";
#};

view local {            #对于上面定义的acl进行区定义,名字可以不一样
       match-clients { local; };       #正式定义,名字要和acl中的相同
       recursion yes;
       include "/etc/named.local";     #这里定义我们的配置文件的另外块儿
};

view network {
       match-clients { network; };
       recursion yes;
       include "/etc/named.network";
};

// include "/etc/named.rfc1912.zones";   #上面按已经包含了,那么我们就把这行include去掉
// include "/etc/named.root.key";        #检测头部的注释

include文件创建

[root@localhost etc]# ll named.local named.network 
-rw-r--r-- 1 root root 162 Oct  2 12:20 named.local
-rw-r--r-- 1 root root 164 Oct  2 12:20 named.network

配置本地网络的include

[root@localhost etc]# cat named.local 
zone "." IN {
     type hint;
     file "named.ca";
};
zone "qq.com" IN {
       type master;
       file "qq.com.local";
       allow-update { none; };
};

配置外网网络的include

[root@localhost etc]# cat named.network 
zone "." IN {
     type hint;
     file "named.ca";
};
zone "qq.com" IN {
       type master;
       file "qq.com.network";
       allow-update { none; };
};

Zone记录文件创建

[root@localhost etc]# cd /var/named/
[root@localhost named]# cat qq.com.local            //内网的
$TTL    1D
@       IN      SOA     ns1.qq.com.     admin.qq.com. (
                       2016102;
                       1H;
                       5M;
                       3D;
                       12H;
                       )
       IN      NS      ns1
ns1 IN      A       127.0.0.1
www IN  A   192.168.211.111
[root@localhost named]# cat qq.com.network      //外网的
$TTL    1D
@       IN      SOA     ns1.qq.com.     admin.qq.com. (
                       2016102;
                       1H;
                       5M;
                       3D;
                       12H;
                       )
       IN      NS      ns1
ns1 IN      A       127.0.0.1
www IN  A   192.168.211.222

重启bind服务

[root@localhost named]# service named restart
Stopping named:                                            [  OK  ]
Starting named:                                             [  OK  ]

测试

[root@localhost named]# host www.qq.com 127.0.0.1
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases:

www.qq.com has address 192.168.211.111
[root@localhost named]# host www.qq.com 192.168.211.136
Using domain server:
Name: 192.168.211.136
Address: 192.168.211.136#53
Aliases:

www.qq.com has address 192.168.211.222

大型根域架构

    可结合上面单独构建DNS根域架构,下面是我画的一个根域架构图,大家可参考,以后有时间我会写一篇这个拓扑的博客。

    上面的实验是在两台机器完成的,大家尽量从头看,因为我都是从上面往下慢慢写的,所有某些实战案例的环境也是延续上面的实验后的环境。


博主干货:DNS原理及实战配置指南_第7张图片