1、DNS的基础概念
2、DNS域名解析查询过程
3、DNS基本服务的实现
4、DNS主从同步的实现
5、DNS的高级视图功能
本机的相关信息:
[root@stu113 ~]#uname –r //查看当前系统的内核版本
2.6.32-504.el6.x86_64
[root@stu113 ~]#cat /etc/redhat-release //查看当前系统的发行版本
CentOS release6.6 (Final)
[root@stu113 ~]# ip addr | awk -F '[ /]+''/inet\>/&&!/127.0.0.1/ {print $3}'
//当前主机的ip地址
172.16.113.14
1、DNS的基础概念
DNS,域名解析服务,全名(Domain Name Server),他的工作机制是完成互联网上的主机名到指定IP地址的转换。
早期的域名解析的实现是使用hosts文件实现的,在客户端的hosts文件(Windows该文件在C:\Windows\System32\drivers\etc下;Linux系统,该文件在/etc/hosts)中定义主机名与IP地址的对应关系,当主机在访问某台主机的时候,会自动查询hosts文件中定义的对应关系,将主机名自动转换成对应的IP地址进行访问。
2、DNS域名解析的过程详解:
客户端访问互联网上的某台主机(www.magedu.com)的流程大致如下:
首先,客户端查询本地是否有该主机名与ip地址的对应关系缓存,如果有就直接以此将主机名转换成ip地址进行访问;如果没有缓存,则会查询hosts文件;如果都没有的话,便会根据本机所设置的DNS服务器(Linux中在/etc/resolve.conf中定义的。一般为当地最近的一个节点的DNS服务器IP地址)查询本地DNS服务器。
本地DNS服务器也是首先需要查看缓存中是否有该条目,如果有的话,便直接返回主机名所对应的IP地址给客户端,客户端以此IP地址与www.magedu.com进行通信。
如果本地DNS上面没有缓存,本地DNS便会去查询根服务器,去询问根服务器是否有该主机名,根服务器接收到查询请求,便会告诉本地DNS服务器:“我不知道,我只知道.com在哪,你去问.com吧。”,接着本地DNS便会根据根服务器传递过来的.com服务器的地址,到.com服务器上去查询。.com服务器回答本地DNS服务器:“我不知道,我只知道magedu.com在哪,你去问magedu.com吧。” ;最后,本地DNS又向magedu.com发起查询请求,magedu.com发现www是本域中的一台主机,便将www主机所对应的ip地址返回给本地DNS服务器。
最终,本地dns服务器将ip地址记录缓存,反馈给客户端,客户端以此IP地址进行后续的通信,若后续再有其他客户端请求此主机名的主机名解析,本地DNS便可直接从缓存中读取相应的数据反馈给客户端。我们将上述的查询过程可分解为递归查询和迭代查询两种。所谓递归查询便是A向B发起查询请求,B将最终结果返回给A;迭代查询便是A向B发起查询请求,B返回给A的不是最终结果,而是其他的查询路径C,而后A再向C发起查询,由C返回给A最终的查询结果。因此上图中,客户端向本地DNS发起解析请求,本地DNS将最终结果返回给客户端的过程便是递归查询过程;本地DNS向根服务器发起解析,根服务器返回.com等,最终由magedu.com. 返回给本地DNS服务器最终结果的过程便是迭代查询的过程。
上述所描述客户端访问互联网一台主机的过程中所提到的”根服务器”,全球共13台,并且每台都有固定的IP地址,所以本地DNS可以知道其位置,并向其发起查询请求。
根据上述的描述,我们大体可以知道,DNS的解析过程是分层进行的,并且是从最顶层(根)开始,每一层都仅记录其直属下层的位置,因此,我们称其是个倒置的树状结构,并且查询只能是自上而下,下层不能查询上层:
上图中,根”.”被称为“顶级域”, com、 cn 、 us 等被称为“一级域”,baidu 、qq等被称为是“二级域名”,而 www 、mail 、blog 便是二级域内的主机名。
我们常见的www.magedu.com或者www.baidu.com若是按照标准写法需在其最后添加根域,例如”www.baidu.com.“,只不过通常我们都会把根域给省略掉,这种主机名+域名的组合被称为是 “FQDN”(Fully Qualified Domain Name).
需要在此提一下的就是,互联网上的DNS服务并不是随便拿来就用的,需要向一些服务提供商注册使用(付费),(代理商:万网, 新网;godaddy),若你的主机数量较小,则在服务提供商所提供的后台自行映射IP与主机名对应关系即可;若主机数量较大,需呀自行搭建DNS服务的话,那么需在服务提供商所提供的后台中对你自己所搭建的DNS服务器进行授权即可。
3、DNS的基础服务实现
相关术语:
区域数据文件:由多条资源记录(ResourceRecord, RR)所构成。
正向解析 :将主机名解析成IP地址
反向解析 :将IP地址解析成主机名
资源记录的类型及格式:
格式:name [TTL] INRR_type value
注:
(1) TTL值可定义在区域数据文件的开头,全局继承
(2) name可以使用@代替来引用当前区域的名字(bind的配置文件中的zone名)
(3) 同一个name可定义多个不同的值,此时DNS会以轮询的方式进行解析,这也是早期负载均衡的实现模型。
(4) 多个name也可以定义同一个值
SOA记录:起始授权记录,每个区域数据文件的第一条
NS记录:用于标明本域的DNS服务器的位置,必须有一条与之对应的A记录
A记录:FQDN与IPv4地址的对应
AAAA记录:FQDN与IPv4地址的对应
MX记录:邮件交换记录,必须有一条与之对应的A记录
PTR记录:将IPv4地址解析成FQDN
CNAME:CanonicalName,别名记录,将一个主机名映射到另一个主机名
使用的软件:bind
使用端口(默认):
tcp53:用于主从间同步区域数据文件
udp53:用于客户端查询解析
==================================================================
安装bind,实现基本的dns服务:
bind的安装有两种方式,使用rpm包安装或是使用源码包编译安装。源码编译安装相对与rpm来讲,功能更加丰富一些,但是一般的dns应用使用rpm包安装足以应付,因此,接下来我就以rpm安装来完成以下实验----(a、基本dns服务;b、主从同步;c、子域授权)
a安装
[root@stu113 ~]# yum install -y bind //确保实现配置好了yum源
[root@stu113 ~]# rpm -qa bind* //查询安装到关于bind的所有包
bind-libs-9.8.2-0.30.rc1.el6.x86_64 //bind程序所依赖的库文件
bind-utils-9.8.2-0.30.rc1.el6.x86_64 //bind所提供的工具包(如dig等)
bind-9.8.2-0.30.rc1.el6.x86_64 //bind主程序包
b配置
bind程序在linux系统上的服务脚本文件为/etc/init.d/named,其主配置文件为/etc/named.conf
配置文件主要分为3大块,每一项都用一对花括号”{}”括起来,并且每一行的末尾都需要跟上一个”;”
options---全局配置项,对全局生效
logging---日志的配置
zone------域的配置
zone的种类:
master:主服务器的区域
slave:从服务器的区域
forward:转发区域
hint:根区域
各区域的重要参数:
options {
listen-onport 53 { IP; }; //定义监听的端口及IP地址,ip地址一般为外网地址
listen-on-v6port 53 { IP; }; //IPv6的监听端口及IP
directory "/var/named";//定义工作目录
allow-query { IP; }; //定义允许从此服务器查询解析的主机地址或范围
recursionyes; //是否开启递归查询功能
allow-recursion{ IP; }; //允许递归的主机;
forward { only|first; }; //定义是否全局转发,若此项定义在zone中,则表示只对指定的区域转发
};
zone "." IN { //双引号内的”.”表示根区域,若查询的解析在配置文件中没有定义相应的zone,则会向根服务器请求解析,IN为关键字,固定格式
typehint; //定义此zone的类型,hint为根区域
file"named.ca"; //定义区域数据文件的位置,此处使用的是相对路径,相对于options中定义的directory
}; //区域结束标示
logging {
channel default_debug {//定义日志级别
file"data/named.run"; //定义日志文件路径及日志文件名
severity dynamic;
};
};
由此,我们自建一个bind的配置文件:
[root@stu113 ~]# mv /etc/named.conf /etc/named.conf.bak //将原配置文件改名
[root@stu113 ~]# vim /etc/named.conf //创建bind的配置文件并编辑
options {
listen-on port 53 { 172.16.113.14; };
directory "/var/named" ;
allow-query { any; };
recursion no;
};
logging {
channel default_debug {
file"data/named.log";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
zone "su.com" IN { //此处定义了一个su.com的域
type master;
file "su/su.com.zone";
};
编辑完成后。保存退出,并执行
[root@stu113 ~]# named-checkconf //检查bind的配置文件是否有误,若有错误,此命令执行后会返回错误信息
创建编辑区域数据文件-----
此处需要注意的是,区域数据文件中的所有域名书写都必须带上根”.”
区域数据中的SOA记录中几个参数:
1)序列号:用于表示此区域数据文件的的版本,老版本的bind从服务器是根据刷新时间周期探测主服务器区域数据文件的序列号与本地的序列号对比,若大于本地区域数据文件的序列号,则表明主服务器区域数据文件更新了,便会发送同步请求给主服务器;新版本的bind新增了更新通知机制,主服务器一旦更新区域数据文件,便会通知从服务器。
2)刷新时间:从服务器多久查询一次此数据文件是否更新
3)重试时间:若从服务器查询主服务器上区域数据文件是否更新时,访问不到主服务器,则在重试时间周期过去后再联系主服务器
4)过期时间: 若主服务器故障宕机,则从服务器在过期时间周期后,便也会“殉情”
5)否定答案的TTL值:如果客户端请求的解析不在本服务器上,则告知客户端一定时间内别再向本服务器查询了
[root@stu113 ~]# vim/var/named/su/su.com.zone
$TTL 1d
@ IN SOA su.com. admin.su.com. (
//此处的admin.su.com为管理员邮箱,因为”@”对此文件有特殊意义,所以邮箱名使用.代替
2015091601 ;序列号;不能超过10位
2H ;刷新时间
15M ;重试时间
1W ;过期时间
12H) ;否定答案的TTL值
IN NS ns1.su.com.
ns1 IN A 172.16.113.14
www IN A 172.16.113.51
编辑完成后,保存退出,执行
[root@stu113 ~]# named-checkzone"su.com" /var/named/su/su.com.zone //检查区域数据文件
zone su.com/IN: loaded serial 2015091601
OK //若有问题,此处会提示错误信息
启动bind程序:———系统上的服务管理脚本名为named,进程也为named
[root@stu113 ~]# /etc/init.d/named start
Generating /etc/rndc.key: [ OK ]
Starting named: [ OK ]
c、启动成功,找一台可以与本机通信的主机测试一下:
通信正常;对www.su.com进行解析一下:
客户端寻找www.su.com,被解析成了区域数据文件中定义的地址;基本的dns服务已定义成功。
定义一个反向解析区域:
第一步:
在/etc/named.conf中添加如下配置:
zone "113.16.172.in-addr.arpa" IN{
type master;
file "su/113.16.172.in-addr-arpa.zone";
};
第二步:
在/var/named/su目录下创建对应的反向区域数据文件:
[root@stu113 ~]# vim/var/named/su/113.16.172.in-addr-arpa.zone //此处的文件名必须和named.conf中的file后面文件名完全一致
$TTL 1D
@ IN SOA su.com. admin.su.com. (
2015091601
1D
15m
1W
12H)
IN NS ns1.su.com.
14 IN PTR ns1.su.com.
51 IN PTR www.su.com.
保存退出并检查:
[root@stu113 ~]# named-checkzone"113.16.172.in-addr.arpa" /var/named/su/113.16.172.in-addr-arpa.zone
zone 113.16.172.in-addr.arpa/IN: loadedserial 2015091601
OK
第三步:
[root@stu113 ~]# /etc/init.d/named reload //重新加载配置文件
[root@stu113 ~]# dig -x [email protected] //使用dig命令查询测试,结果正常如下:
; <<>> DiG9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> -x [email protected]
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY,status: NOERROR, id: 56864
;; flags: qr aa rd; QUERY: 1, ANSWER: 1,AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but notavailable
;; QUESTION SECTION:
;51.113.16.172.in-addr.arpa. IN PTR
;; ANSWER SECTION:
51.113.16.172.in-addr.arpa. 86400 IN PTR www.su.com.
;; AUTHORITY SECTION:
113.16.172.in-addr.arpa. 86400 IN NS ns1.su.com.
;; ADDITIONAL SECTION:
ns1.su.com. 86400 IN A 172.16.113.14
;; Query time: 0 msec
;; SERVER: 172.16.113.14#53(172.16.113.14)
;; WHEN: Tue Sep 15 14:16:54 2015
;; MSG SIZE rcvd: 102
==================================================
4、实现DNS的主从数据文件同步:
其实实现DNS的主从同步并不复杂,配置如下:
1)在主服务器上的配置文件的zone内,添加allow-transfer,指定从服务器:
zone"su.com" IN {
type master;
file "su/su.com.zone";
allow-transfer { 172.16.113.15; };
};
zone "113.16.172.in-addr.arpa" IN{
type master;
file "su/113.16.172.in-addr-arpa.zone";
allow-transfer { 172.16.113.15; };
};
2)将区域数据文件的权限以及属主数组统一至directory下的其他目录和文件的权限及属主数组
[root@stu113named]# chmod --reference=/var/named/slaves/ /var/named/su/
[root@stu113named]# chmwon --reference=/var/named/slaves/ /var/named/su/
[root@stu113named]# chown --reference=/var/named/slaves/ /var/named/su/
[root@stu113named]# chown --reference=/var/named/named.ca /var/named/su/*
[root@stu113 named]# chmod --reference=/var/named/named.ca/var/named/su/*
3)重新加载主服务器上的配置文件:
[root@stu113named]# /etc/init.d/named reload
Reloading named: [ OK ]
4)在从服务器(IP:172.16.113.15)安装bind,注意版本最好匹配:
[root@localhost ~]# yum install -y bind
[[email protected]]# mv /etc/named.conf /etc/named.conf.bak //将现有的配置文件改名
[root@localhost yum.repos.d]# [email protected]:/etc/named.conf /etc/named.conf //远程copy主服务器的配置文件到从服务器
[root@localhost yum.repos.d]# vim /etc/named.conf //编辑配置文件
options {
listen-on port 53 { 172.16.113.15; };//将监听的端口改为本机
directory "/var/named" ;
allow-query { any; };
recursion no;
};
logging {
channel default_debug {
file"data/named.log";
severity dynamic;
};
};
zone"." IN {
type hint;
file "named.ca";
};
zone"su.com" IN {
type slave; //将区域类型改为slave
file "slaves/su.com.zone"; //主从同步时,会将区域数据文件同步到slaves下,所以将路径改为slaves下
masters { 172.16.113.14; }; //指明主服务器的位置
};
zone"113.16.172.in-addr.arpa" IN {
type slave;
file"slaves/113.16.172.in-addr-arpa.zone"; //主从同步时,会将区域数据文件同步到slaves下,所以将路径改为slaves下
masters{ 172.16.113.14; }; //指定主服务器的位置
};
保存退出并验证配置文件是否有误:
[root@localhost yum.repos.d]# named-checkconf
5)启动从服务器的bind程序:
[root@localhost ~]# /etc/init.d/named start
[root@localhost~]# ls /var/named/slaves/ //区域数据文件已同步成功
113.16.172.in-addr-arpa.zone su.com.zone
5、DNS的高级视图功能
由于IP地址有地域的划分概念,每个地区都有不同网段的IP地址,就像手机号码一样,每个网段都有其对应的地区;DNS的高级视图所实现的功能是将来自不同地区的用户解析请求,返回不同的解析结果:比如说:
www.su.com.这台主机对应两个ip地址,一个是北京(1.1.1.1);一个是江苏(2.2.2.2);根据服务器所定义的匹配原则,来自北京的用户解析请求服务器会返回ip为1.1.1.1 ,来自江苏的用户请求,服务器会返回其2.2.2.2.
下面,我将以172.168.1.51 模拟北京的用户,以172.16.113.100模拟江苏用户:
用一台服务器(172.16.113.14)来实现高级视图功能,若想实现主从同步,从服务器的设置一样。
具体实验步骤如下:
1)在named.conf中定义view:即将所有的zone都划在view之下。
2)定义区域数据文件:
[root@stu113 su]# vim su.com.zone.bj
[root@stu113 su]# vim su.com.zone.js
*****注意这两个区域数据文件的权限:数组为named ,属主为root ,权限为640
重载bind的配置文件:
[root@stu113 su]# /etc/init.d/named reload
下面用172.16.113.51进行解析测试:
[root@centos7-51 ~]# ip addr | awk -F '[ /]+''/inet\>/&&!/127.0.0.1/ {print $3}'
172.16.113.51
[root@centos7-51 ~]# dig -t A [email protected] ///视图生效
用172.16.113.100进行解析测试:
解析成功。