一、理论基础
1、 DNS的出现及演化
网络出现的早期是使用IP地址通讯的,那时就几台主机通讯。但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和Windows也继承保留了这个文件)。这个文件中记录着主机名称和IP地址的对应表。这样只要输入主机名称,系统就会去加载hosts文件并查找对应关系,找到对应的IP,就可以访问这个IP的主机了。
但是后来主机太多了,无法保证所有人都能拿到统一的最新的hosts文件,就出现了在文件服务器上集中存放hosts文件,以供下载使用。互联网规模进一步扩大,这种方式也不堪重负,而且把所有地址解析记录形成的文件都同步到所有的客户机似乎也不是一个好办法。这时DNS系统出现了,随着解析规模的继续扩大,DNS系统也在不断的演化,直到现今的多层架构体系。
2、DNS概述入门
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议使用UDP/TCP 53端口号,UDP负责域名解析请求报文,TCP负责多台DNS服务器之间区域传送,当域名解析请求单个报文字节数过大时,如超过512字节,可能会采用TCP 53进行通信,因此在防火墙定义策略时,可同时开启53的TCP/UDP协议。
DNS 的分布式数据库是以域名为索引的,每个域名实际上就是一棵很大的逆向树中路径,这棵逆向树称为域名空间(domain name space)。如图所示树的最大深度不得超过127 层,树中每个节点都有一个可以长达63 个字符的文本标号。
3、DNS域名解析过程
首先,客户端先在本地缓存查找有没有域名缓存,如果没有,客户端发出DNS请求翻译IP地址或主机名。DNS服务器在收到客户机的请求后:
(1)检查DNS服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息;
(2)若没有查到,则在数据库中查找,若查到请求的地址或名字,即向客户机发出应答信息;
(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。
(4)若没有找到,则返回错误信息。
4、DNS的分类
主DNS服务器:就是一台存储着原始资料的DNS服务器。
从DNS服务器:使用自动更新方式从主DNS服务器同步数据的DNS服务器。也称辅助DNS服务器。
缓存服务器:不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器。同时缓存查询回来的结果,也叫递归服务器。
根提示服务器:根据系统中的13组根服务器的IP地址寻求域名解析(需要当前DNS服务器连接外网)
转发器:这台DNS发现非本机负责的查询请求时,不再向根域发起请求,而是直接转发给指定的一台或者多台服务器。自身并不缓存查询结果。
5、DNS中记录类型
SOA | 定义了该域中的权威名称服务器,一般与ns一致 比如:dns.chengdu.com 示例: @ IN SOA dns.baidu.com. admin.baidu.com. ( |
NS | 域的授权名称服务器,在当前域中能够负责解析域名的服务器有哪些 NSDName:DNS的FQDN baidu.com. 64899 IN NS ns2.baidu.com. |
MX | 域的邮件交换器,要跟着一个优先级值,越小越高 baidu.com. 7200 IN MX 20 jpmx.baidu.com. baidu.com. 7200 IN MX 20 mx50.baidu.com. baidu.com. 7200 IN MX 10 mx.n.abc.com. baidu.com. 7200 IN MX 20 mx1.baidu.com. |
A | IPV4主机地址 |
AAAA | IPV6主机地址 |
PTR | 解析IP的指针,反向记录 |
CNAME | 权威(正式)名称,定义别名记录 www.baidu.com. 1154 IN CNAME www.a.abc.com. |
6、DNS命名规范
1. 26个英文字母
2. “0,1,2,3,4,5,6,7,8,9”十个数字
3. “-”(英文中的连词号)
4. 最多63字节长度
二、安装BIND9(DNS)
Bind是一款开放源码的DNS服务器软件,Bind由美国加州大学Berkeley分校开发和维护的,全名为Berkeley Internet Name Domain它是目前世界上使用最为广泛的DNS。
- Bind服务的安装
# yum install -y bind*
# rpm -qa bind
bind-9.9.4-37.el7.x86_64
bind主要程序有以下四个:
bind:提供了域名服务的主要程序及相关文件
bind-utils:提供了对DNS服务器的测试工具,如dig、nslookup等
bind-libs:提供了bind、bind-utils需要使用的库函数
bind-chroot:为bind服务提供了一个伪装的根目录(将/var/named/chroot作为bind的根目录)以提高安全性。
2、bind服务的配置文件
BIND服务配置文件有两种类型
主配置文件:主要存放named服务的全局配置和访问控制等参数
区域文件:存放某个DNS区域的地址解析记录。
- 主配置参考文件:
/usr/share/doc/bind-9.9.4/sample/etc/named.conf //样例文件,
# named-checkconf -z /etc/named.conf //检查是否存在语法错误
主配置文件named.conf通常位于/etc/目录下,在该文件中主要包括全局配置、区域配置两个部分,每一条配置记录的行尾以”;”表示结束,以“#”或“//”或”/* */”开始的行表示为注释文件。
全局:
# cp /etc/named.conf /etc/named.conf.back
# vim /etc/named.conf
options {
directory "/var/named"; //定义工作目录
listen-on port 53 { 127.0.0.1; }; //需要删除,或者改为当前使用的IP地址
listen-on-v6 port 53 { ::1; }; //需要删除,或者改为当前使用的IP地址
dump-file //设置域名缓存数据存放位置
statistics-file //设置状态统计文件位置。
memstatistics-file //内存使用情况记录
allow-query { localhost/any; }; //定义谁能访问,默认只有自
recursion yes; //如果是yes,并且一个DNS询问要求递归,那么服务器将会做所有能够回答查询请求的工作。如果recursion是off的,并且服务器不知道答案,它将会返回一个推荐(referral)响应。默认值是yes。注意把recursion设为no,不会阻止用户从服务器的缓存中得到数据,它仅仅阻止新数据作为查询的结果被缓存。服务器的内部操作还是可以影响本地的缓存内容
dnssec-enable yes; //是否支持DNSSEC开关,默认为yes。
dnssec-validation yes; //是否进行DNSSEC确认开关,默认为no。
pid-file //运行pid文件存放位置
};
主区域:
zone "ZONE NAME" IN {
type {master};
file "区域数据文件";
};
从区域:
zone "ZONE NAME" IN {
type {slave};
file "区域数据文件";
masters { 主服务器IP地址};
};
master:主区域
slave:从区域
hint:根区域
forward:转发
举例:
缓存服务器:
# mv /etc/named.conf /etc/named.conf.bak
# vim /etc/named.conf
options {
directory "/var/named";
};
zone "." IN {
type hint;
file "named.ca";
};
以下两项必须禁用
#include "/etc/named.rfc1912.zones";
#include "/etc/named.root.key";
或者###########################
删除zone "." IN 区域
加入以下内容: //需要添加到全局配置区域
forwarders { 202.106.196.115; 202.106.0.20; }; //此IP地址为北京市联通DNS服务器,等同于是设置转发器
forward only|first; //设置仅转发还是转发失败使用根提示进行迭代查询。
# chown :named named.conf
# chmod 640 /etc/named.conf
# systemctl restart named
完成以上配置后,将客户机DNS地址设置为此服务器IP地址,当客户机在使用此服务器地址进行解析时,此服务器自身并没有资源记录进行解析,所以服务器会寻找zone中的根区域进行解析,客户机找服务器解析过程为递归服务器寻找根区域进行解析过程为迭代。
202.106.196.115
202.106.0.20
案例二
主域名服务器:
# vim /etc/named.conf //加入以下内容
zone "abc.com" IN { //指定解析区域
type master;
file "abc.com.zone"; //区域数据配置文件
allow-update { 192.168.1.12; };
also-notify { 192.168.1.12; };
};
# vim /var/named/abc.com.zone //创建资源解析文件
在数据库中,每一个条目都称作为一个资源记录,资源记录格式为:
$TTL 600
NAME [TTL] IN RRT VALUE //name=资源记录名称,in=lnternet,RRT=资源记录类型,value=资源对应的数据
#该段表示主从DNS服务器之间同步数据规则定义
$TTL 600 //客户端获取到的解析记录在服务器中的生存周期,秒
#下行几列依次为:@ -->表示当前dns域名,IN=lnternet,SOA=标识,ns1.abc.com.=起始授权主机,指主服务器域名,admin.abc.com.=邮箱地址".等同于@"
@ IN SOA ns1.abc.com. admin.abc.com.(
20170405 //更新序列号,表示修改的依次顺序,可随意定义,不可超过10位
1H //从服务器下载数据时间间隔为1小时
5M //下载失败后的重试间隔为5分钟
2W //超过该时间任无法下载则放弃,为两周
6D //无效解析记录的生存周期
)
@ IN NS ns1.abc.com. //声明DNS服务器
IN MX 10 mail.abc.com. //10表示优先级,0-99,数字越小级别越高
ns1 IN A 192.168.1.151
mail IN A 192.168.1.152
www IN A 192.168.1.153
ftp IN A 192.168.1.154
a IN CNAME www
反向解析:
# vim /etc/named.conf //加入以下内容
zone "1.168.192.in-addr.arpa" IN {
type master;
file "192.168.1.zone";
allow-update { 192.168.1.12; };
also-notify { 192.168.1.12; };
};
# cp -p /var/named/abc.com.zone /var/named/192.168.1.zone
# vim /var/named/192.168.1.zone //修改为如内容:
$TTL 600
@ IN SOA abc.com. admin.abc.com. (
20170405
1H
5M
2D
6h
)
IN NS ns1.abc.com.
151 IN PTR ns1.abc.com.
152 IN PTR mail.abc.com.
153 IN PTR www.abc.com.
154 IN PTR ftp.abc.com.
重启服务验证:
# systemctl restart named
客户端通过nslookup命令进行解析验证
案例三
创建从域名服务器
需要另外开启一台服务器作为从服务器安装bind服务
# mv /etc/named.conf /etc/named.conf.bak
# vim /etc/named.conf
options {
directory "/var/named";
};
zone "abc.com" IN {
type slave;
masters { 192.168.1.151; };
file "slaves/abc.com.zone";
};
zone "1.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.1.10; };
file "slaves/192.168.1.zone";
};
#nslookup
#dig -t NS/A/CNAME www.abc.com //查询
#host -t MX abc.com.
#host -t NS abc.com.
#host -t A www.abc.com