DNS原理及实战配置指南
家住海边喜欢浪:zhang789.blog.51cto.com
目录
DNS简介
DNS域名结构介绍
顶级域名
DNS工作原理
工作模式和端口
资源记录
安装bind(详细)
实战:配置一个正反向解析
实战:配置DNS转发
实战:配置DNS主从
实战:子域授权
实战:配置智能DNS
根域架构拓扑图
DNS域名解析服务配置与管理详解
DNS简介
DNS服务可以为用户提供域名和IP地址之间的自动转换,通过DNS用户只需要输入机器的域名即可访问相关的服务,无需使用那些难以记忆的IP地址
DNS域名结构介绍
DNS域名又称DNS命名空间,它是以层次树状结构进行管理的,其顶层是根域,根域在整个DNS命名空间是唯一的,而根域下可以分为多个子域,每个子域又可以有多个子域
一个完整的域名是由顶级域以及各子域的名称所组成,各部分之间用圆点,“.”来分割,其中最后一个点是顶级域,最后一个“.”左边部分称为二级域名,二级域左边称为三级域名,以此类推
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解析过程
1、客户端需要解析www.qq.com,客户端向本地DNS服务器发送解析请求
2、本地DNS发现无法解析,转发给根域服务器,
3、根域服务器根据请求域名对应的顶级的com,返回com的服务器地址,
4、本地DNS服务器向com域dns服务器发出解析请求
5、com域服务器返回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转发
(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主从
上面我们已经讲过,一个域内的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; };
};
重启服务,查看目录下的文件
[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根域架构,下面是我画的一个根域架构图,大家可参考,以后有时间我会写一篇这个拓扑的博客。
上面的实验是在两台机器完成的,大家尽量从头看,因为我都是从上面往下慢慢写的,所有某些实战案例的环境也是延续上面的实验后的环境。