前言:DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
socket
C/S模式
Clients:发起应用请求的程序
Server:相应请求(提供服务)的程序
服务器端的程序必须监听在一个socket上(Socket=IP+Port),且套接字必须在客户端和服务端都有
传输层协议:TCP , UDP , SCTP
TCP :transmission control protocol 面向连接的协议,双方在互相通信的时候,需要建立虚链路,虚连接
UDP:user datagram protocol 无连接的协议,双方在互相通信的时候,不需要建立虚链路,虚连接
DNS(domain name service)应用层协议
属于C/S模式
监听的端口:53/udp, 53/tcp
www.baidu.com: FQDN( full qualified damain name )
top level domain
组织域:.com , .net , .org , gov , edu , mil
国家域:.cn , hk , tw , .jp
DNS查询类型
递归查询:从客户机到本地设置的DNS服务器
迭代查询:从根服务器到各个子服务器
通常的DNS查询过程
(1)当用户在浏览器输入域名的时候,首先会在本地的hosts文件中查找,如果hosts文件中没有对应域名的IP地址,那么就会发起一个DNS协议的网络请求,对DNS根服务器的53号端口发起一个UDP请求,根服务器在解析浏览器发送的DNS请求之后,会查找本地的DNS数据库,在本地的数据库查找完毕之后会通过网络响应给客户端。那么,这个时候客户端就拿到了域名对应的IP地址,就可以访问服务器了。
(2)对于用户第一次输入一个域名的时候,先会查找本地的hosts文件,如果hosts文件没有找到,那么将会在本地的DNS缓存中查找,如果本地缓存中没有找到,那么就会去找DNS服务器了。那么当DNS服务器返回解析到的IP地址给用户的时候,将会先将域名对应的IP地址暂存至缓存
DNS的查询分类
递归查询和迭代查询的区别
(1)递归查询
递归查询是客户端面向本地的DNS服务器的一种查询方式,在该模式下运营商的DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。
(2)迭代查询
迭代查询是运营商的DNS 服务器代理用户的DNS请求,面向全球的DNS服务器进行的查询。当客户机发送查询请求时是递归查询,而运营商的DNS服务器会首先请求根DNS 服务器,而根DNS服务器并不直接回复查询结果,而是告诉运营商DNS服务器另一台DNS 服务器地址,运营商DNS服务器再向这台DNS 服务器提交请求,依次循环直到拿到查询的结果为止。
DNS解析
DNS名称解析方式
名称—>IP:正向解析
IP—>名称:反向解析
注意:二者的名称空间,非为同一个空间,非同一颗树,因此,也不是同一个解析库
DNS服务器类型
负责解析至少一个域
主名称服务器
辅助名称服务器
不负责域解析:缓存名称服务器
一次完整的DNS查询请求所经过的流程
Client--->hosts文件--->DNS Local Cache--->服务商的DNS server (recursion) ---> DNS服务器
自己负责解析的域:直接查询数据库并返回答案
不是自己负责的解析域:server cache —> iteration(迭代)
解析答案
肯定答案
否定答案:不存在查询的键,因此,不存在与其查询键对应的值
权威答案:由直接负责DNS服务器返回的答案
非权威答案
DNS主服务器——辅助服务器
主DNS服务器:维护所负责解析的域数据库的那台服务器,读写操作均可进行
从DNS服务器:从主DNS服务器那里或其他从DNS服务器那里复制一份解析库;但只能进行读操作
复制操作的实施方式
序列号:serial,也就是数据库的版本号,当主服务器的数据库发生变化时,其版本号递增
刷新时间间隔:refresh,从服务器每隔多久到主服务器检查更新情况
重试时间间隔:retry,从服务器从主服务器请求数据库失败,再次发起请求的时长
过期时长:expire,从服务器始终练习不到主服务器,多久之后放弃从主服务器同步数据库,停止提供服务
否定答案的缓存时长
主服务器通知从服务器更新数据
数据区域传送
全量传送(axfr):将整个数据库进行传送
增量传送(ixfr):仅仅传送变更的数据
区域(zone)和域(domain)
yhyblog.cn 域
FQDN--->IP
正向解析库 + 正向解析功能 == 正向解析区域
IP ---> FQDN
反向解析库 + 方向解析功能 == 方向解析区域
区域数据库文件
资源记录:resource record
记录有其类型:A , AAAA , PTR, SOA , NS , CNAME , MX
例如:IP和域名的对应关系、IP和邮件地址的对应关系
SOA:start of authority 起始授权记录,一个区域解析库有且只能有一个SOA记录,必须放在第一条,表示授权一个解析区域
NS:name service 域名服务记录,一个区域解析库可以有多个NS记录,其中一个为主的。一个NS记录表示给一个区域进行解析
A:address,地址记录,FQDN—>IPv4
AAAA:地址记录。FQDN—>IPv6
CNAME:canonical name 别名记录
PTR:pointer , IP—>FQDN
MX:mail exchanger 邮件交换器
优先级:0-99 数字越小优先级越高
资源记录的定义格式 (非常重要,一定要牢记)
语法:name(资源记录名) [TTL值] IN RR_type(资源记录类型) 值
SOA记录详解
name : 当前区域的名字,例如 yhyblog.cn 或者2.3.4.in-addr.arpa
value:有多部分组成
(1)当前区域的区域名称(也可以使用主DNS服务器名称)
(2)当前区域管理员的邮箱地址,但地址中不能使用@符号,一般使用点号来替代
(3)(主从服务协调属性的定义以及否定答案的TTL)
yhyblog.cn 86400 IN SOA yhyblog.cn. admin.yhyblog.cn. (
2017082101 ;serial
2H ; refresh
10M; retry
1W ; expire
1D ; negative answer ttl
)
NS记录详解
name : 当前区域的区域名称
value:当前区域的某DNS服务器的名字,例如 ns.yhyblog.cn
注意:一个区域有多个ns记录
yhyblog.cn. 86400 IN NS www.yhyblog.cn
yhyblog.cn. 86400 IN NS bbs.yhyblog.cn
MX记录
name:当前区域的区域名称
value:当前区域某个邮件交换器的主机名
注意:MX记录可以有多个,但是每个记录的value之前应该有一个数字表示其优先级
yhyblog.cn. IN MX 10 mx1.yhyblog.cn.
yhyblog.cn. IN MX 20 mx2.yhyblog.cn.
A记录
name:某FQDN, 例如:www.yhyblog.cn
value:某IPv4地址
www.yhyblog.cn IN A 1.1.1.1
www.yhyblog.cn IN A 1.1.1.2
bbs.yhyblog.cn IN A 1.1.1.1
AAAA记录
name:某FQDN, 例如:www.yhyblog.cn
value:某IPv6地址
PTR
name :IP地址,有特定格式,IP反过来写,而且有特定后缀,例如:1.2.3.4的记录应该写为4.3.2.1.in-addr.arpa.;
value : FQND
4.3.2.1.in-addr.arpa. IN PTR www.yhyblog.cn
CNAME
name:别名, FQDN格式的别名
value:FQDN的正式名称
web.yhyblog.cn. IN CNAME www.yhyblog.cn
区域数据库书写格式的注意点
(1)TTL可以从全局继承
(2)@表示当前区域的名称
(3)相邻的两条记录其name相同时,后面的可省略
(4)对于正向区域来说,各XM , NS等类型的记录的value为FQDN , 此FQDN应该有一个A记录
解析库文件(非常重要)
/var/named/目录下
一般名字命名为:区域名称.zone
注意:
(1)一台DNS服务器可以同时为多个区域提供解析
例如:可以为yhyblog.cn、uplooking.com、baidu.com等区域提供解析服务
(2)必须要有根区域解析库文件,告诉DNS服务器根节点服务器地址,named.ca
(3)还应该有两个区域解析库文件,localhost 和 127.0.0.1的正反向解析库
正向解析库叫:/var/named/named.localhost
反向解析库叫:/var/named/named.loopback
rndc:名称服务器的远程控制工具
默认工作在953/tcp , 监听于127.0.0.1地址,因此仅仅是本地使用
bind程序安装完成之后,默认即可作为缓存名称服务器使用,就像我们经常在指定114.114.114.114.114一样,如果没有专门负责解析的区域。可直接启动服务。但是先不启动,先修改配置文件
CentOS 6 : service named start
CentOS 7 : systemctl start named.service
bind的主配置文件(/etc/named.conf)格式详解
全局配置段
options{...}
日志配置段
logging{...}
区域配置段
zone{...} 那些由本机负责解析的区域,或转发的区域
注意:对于DNS主机来说,每一个配置语句必须以分号结尾
作为缓存名称服务器的配置,修改配置文件/etc/named.conf
监听能与外部主机通信的地址,删除127.0.0.1, 只保留listen-on port 53 { }; 如果想监听特定的主机,listen-on port 53 { 192.168.23.3; };
并且关闭 dnssec-enable no; dnssec-validation no; dnssec-lookaside no; 注释 allow-query { localhost; };
只要修改了配置文件,必须检查配置文件的语法错误
named-checkconf /etc/name.conf
启动服务
systemctl start named.service
DNS服务既监听TCP的53号端口用于传送,又监听UDP的53号端口用于解析
DNS缓存服务器的配置步骤
1:yum 安装bind
2:编辑主配置文件/etc/named.conf
3:修改全局配置段中
listen-on port 53 { 192.168.23.10; };
//allow-query { localhost; };
dnssec-enable no;
dnssec-validation no;
dnssec-lookaside no;
4:检查配置文件是否修改正确
named-checkconf /etc/named.conf
5:重启named程序
systemctl start named.service
6:开启另外一台主机,使用nmtui命令,设置其DNS为192.168.23.10,且重启网卡
7:再ping下百度,看看是否可以正常解析
配置解析一个正向区域
前提条件:(1)在互联网注册一个域名。(2)有一台互联网主机(云服务主机)(3)在域名服务注册的后台设置指向这台互联网主机
配置 正向区域的步骤,以yhyblog.cn域为例
(1)定义解析区域 ,一般定义在/etc/named.rfc1912.zones里面
例如:在/etc/named.rfc1912.zones中添加这几行
zone "yhyblog.cn" IN {
type master;
file "yhyblog.cn.zone"; (这里的yhyblog.cn.zone中的yhyblog.cn是在互联网上注册的域名)
};
(2)建立区域数据文件(主要记录为A或者AAAA)
在/var/named目录下建立区域数据文件
区域数据文件的文件名为:/var/named/yhyblog.cn.zone
文件内容为:
$TL 3600
$ORIGIN yhyblog.cn. ; 这里会自动补全yhyblog.cn
@ IN SOA ns1.yhyblog.cn. dnsadmin.yhyblog.cn. (
2017082101
1H
10M
3D
1D ) ; SOA记录是授权一个yhyblog.cn解析域
IN NS ns1 ; NS记录是用来指定解析yhyblog.cn域,ns1为解析服务器的域名
IN MX 10 mx1 ; MX记录是用来指定解析yhyblog.cn域,ns1为解析服务器的邮件地址
IN MX 20 mx2
ns1 IN A 192.168.23.10 ;ns1域名也必须有一条A记录
mx1 IN A 192.168.23.10 ;xm1域名也必须有一条A记录
mx2 IN A 192.168.23.10 ;xm2域名也必须有一条A记录
www IN A 192.168.23.3
web IN CNAME www
bbs IN A 192.168.23.7
bbs IN A 192.168.23.8
修改yhyblog.cn.zone的权限和属组
chown .named /var/named/yhyblog.cn.zone
chmod o= /var/named/yhyblog.cn.zone
检查配置文件和区域解析库文件的语法错误
named-checkconf /etc/named.conf
named-checkconf /etc/named.rfc1912.zones
named-checkzoen yhyblog.cn /var/named/yhyblog.cn.zone
重启named服务让服务器重载配置文件和区域数据文件
rndc reload 或 systemctl reload named.service
使用dig命令测试当前配置的解析区域
dig -t A www.yhyblog.cn @192.168.23.10
配置一个正向解析区域的详细步骤(必须掌握)
1:定义解析区域, 编辑/etc/named.rfc1912.zones文件,添加
zone "yhyblog.cn" IN {
type master;
file "yhyblog.cn.zone";
};
2: 编辑/var/named/yhyblog.cn.zone,添加解析区域
$TTL 3600
; 这里会自动补全yhyblog.cn
$ORIGIN yhyblog.cn.
@ IN SOA ns1.yhyblog.cn. dnsadmin.yhyblog.cn. (
2017082101
1H
10M
3D
1D )
IN NS ns1
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 192.168.23.10
mx1 IN A 192.168.23.10
mx2 IN A 192.168.23.10
www IN A 192.168.23.3
web IN CNAME www
bbs IN A 192.168.23.7
bbs IN A 192.168.23.8
3:修改yhyblog.cn.zone的权限和属组
chown .named /var/named/yhyblog.cn.zone
chmod o= /var/named/yhyblog.cn.zone
4:检查配置文件和区域解析库文件的语法错误
named-checkconf /etc/named.conf
named-checkconf /etc/named.rfc1912.zones
named-checkzone yhyblog.cn /var/named/yhyblog.cn.zone
5:重启named服务让服务器重载配置文件和区域数据文件
systemctl reload named.service 或 rndc reload
6:使用dig命令测试当前配置的解析区域
dig -t A www.yhyblog.cn @192.168.23.10
7: 在其他的主机上,将DNS设置为:192.168.23.10,再使用dig命令检查
配置解析一个反向解析区域
(1)定义区域
在主配置文件中或在主配置文件的辅助配置文件中实现
zone “ZONE_NAME” IN {
type { master | slave | hint | forward };
file “ZONE_NAME.zone”;
};
注意:
1. 区域名字就是注册的域名
2. 方向区域的名字是这样的
反写的网段地址.in-addr.arpa
例如:10.168.192.in-addr.arpa
(2)定义区域解析库文件(主要记录为PTR)
在/var/named目录下建立区域数据文件
区域数据文件的文件名为:/var/named/192.168.23.3.zone
文件内容为:
$TTL 3600
$ORIGIN 23.168.192.in-addr.arpa.
@ IN SOA ns1.yhyblog.cn. dnsadmin.yhyblog.cn. (
2017082101
1H
10M
3D
12H )
IN NS ns1.yhyblog.cn.
10 IN PTR ns1.yhyblog.cn.
10 IN PTR mx1.yhyblog.cn.
10 IN PTR mx2.yhyblog.cn.
3 IN PTR www.yhyblog.cn.
7 IN PTR bbs.yhyblog.cn.
8 IN PTR bbs.yhyblog.cn.
并且修改yhyblog.cn.zone的权限和属组
chown .named /var/named/192.168.23.zone
chmod o= /var/named/192.168.23.zone
检查配置文件和区域解析库文件的语法错误
named-checkconf /etc/named.conf
named-checkconf /etc/named.rfc1912.zones
named-checkzone 10.168.192.in-addr.arpa /var/named/192.168.23.zone
(3)让服务器重载配置文件和区域数据文件
rndc reload 或 systemctl reload named.service
如何配置一个反向解析区域的详细步骤(必须掌握)
1:编辑/etc/named.rfc1912.zones,添加
zone "23.168.192.in-addr.arpa" IN {
type master;
file "192.168.23.zone";
};
2: 在/var/named/下,创建一个192.168.23.zone文件
$TTL 3600
$ORIGIN 23.168.192.in-addr.arpa.
@ IN SOA ns1.yhyblog.cn. dnsadmin.yhyblog.cn. (
2017082101
1H
10M
3D
12H )
IN NS ns1.yhyblog.cn.
10 IN PTR ns1.yhyblog.cn.
10 IN PTR mx1.yhyblog.cn.
10 IN PTR mx2.yhyblog.cn.
3 IN PTR www.yhyblog.cn.
7 IN PTR bbs.yhyblog.cn.
8 IN PTR bbs.yhyblog.cn.
3:修改yhyblog.cn.zone的权限和属组
chown .named /var/named/192.168.23.zone
chmod o= /var/named/192.168.23.zone
4:检查配置文件和区域解析库文件的语法错误
named-checkconf /etc/named.conf
named-checkconf /etc/named.rfc1912.zones
named-checkzone 23.168.192.in-addr.arpa /var/named/192.168.23.zone
5:重启named服务让服务器重载配置文件和区域数据文件
systemctl reload named.service 或 rndc reload
6:使用dig命令测试当前配置的反向解析区域
dig -x 192.168.23.10
7: 在其他的主机上,将DNS设置为:192.168.23.10,再使用dig命令检查
主从DNS服务器
从服务器只是在区域级别进行的。也就是说,一台从服务器只是主服务器的一个区域的副本,不是所有区域的副本。如果要配置成主服务器上所有的区域的副本,那么需要配置所有的从服务器的区域。
这里主服务器的IP地址为:192.168.23.10
这里从服务器的IP地址为:192.168.23.11
主从服务器是区域级别的概念
如何配置一个从区域 :
1>在Slave 服务器上(192.168.23.11)
(1)定义区域
定义一个从区域
zone "ZONE_NAME" IN {
type slave ;
file "slaves/ZONE_NAME.zone";
masters { MASTER_IP }
};
例如:在/etc/named.rfc1912.zones文件中增加:
zone "yhyblog.cn" IN {
type slave;
masters { 192.168.23.3; };
file "slaves/yhyblog.cn.zone";
};
zone "10.168.192.in-addr.arpa" IN {
type slave;
file "slaves/192.168.23.zone";
masters { 192.168.23.3; };
};
注意:这里为什么要将从服务器的域写在slaves目录下?这是由于named这个进程是以named的身份运行的,但是/etc/named/目录的属组是named,没有写权限,那么主服务器将不能够以named的身份在/etc/named/目录下写入数据。那么可以在/etc/named/slaves目录下写,/etc/named/slaves目录的权限为:drwxrwx--- 2 named named 6 1月 17 20:00 slaves,可以写数据。那么是否可以将/etc/named/目录改为named用户组成员可以写呢?不行,如果这样做的话,那么如果named进程被劫持,将会有权利清空里面的所有的数据,这样就是为什么会有一个/etc/named/slaves目录专门为从DNS服务器写域解析库的原因。
配置文件语法检查:named-checkconf
(2)重载配置
rndc reload 或 systemctl reload named.service
2>在Master服务器上(192.168.23.10)
(1)确保区域数据文件中应该为每一个从DNS服务器配置NS记录,并且在正向区域文件需要每个从服务器的NS记录的主机名配置一个A记录,且此A记录后面的地址为真正的从服务器的IP地址
例如:在/var/named/yhyblog.cn.zone文件里修改:
$TTL 3600
$ORIGIN yhyblog.cn.
@ IN SOA ns1.yhyblog.cn. dnsadmin.yhyblog.cn. (
2017010802
1H
10M
3D
1D )
IN NS ns1
IN NS ns2
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 192.168.23.3
ns2 IN A 192.168.23.4
mx1 IN A 192.168.23.4
mx2 IN A 192.168.23.5
www IN A 192.168.23.3
web IN CNAME www
例如:在/var/named/yhyblog.cn.zone文件里修改
$TTL 3600
$ORIGIN 10.168.192.in-addr.arpa.
@ IN SOA ns1.yhyblog.cn. dnsadmin.yhyblog.cn. (
2017010803
1H
10M
3D
12H )
IN NS ns1.yhyblog.cn.
IN NS ns2.yhyblog.cn.
3 IN PTR ns1.yhyblog.cn.
3 IN PTR ns2.yhyblog.cn.
4 IN PTR mx1.yhyblog.cn.
5 IN PTR mx2.yhyblog.cn.
3 IN PTR www.yhyblog.cn.
注意:如果要测试是否主从同步使用dig命令(在从服务器上)
例如:dig -t axfr yhyblog.cn @192.168.23.10
例如:dig -t axfr 23.168.192.in-addr.arpa @192.168.23.10
注意:时间要同步,主从服务器都使用ntpdate命令同步,写在contab -e中
子域授权
如果我们现在在公司的内网搭建一个内部的DNS服务,那么现在对于yhyblog.cn来说,公司内部有很多部门。例如ops.yhyblog.cn,java.yhyblog.cn, python.yhyblog.cn。且每一个部门有很多的服务器需要得到解析,例如:www.ops.yhyblog.cn需要被公司内部的DNS服务器解析。那么如何让公司内网的DNS主机只解析二级域,不会解析三级域,那么如何让其他的主机解析三级域呢?
子域授权
正向解析区域授权子域的方法
ops.yhyblog.cn. IN NS ns1.ops.yhyblog.cn.
ops.yhyblog.cn. IN NS ns2.ops.yhyblog.cn.
ns1.ops.yhyblog.cn. IN A IP
ns2.ops.yhyblog.cn. IN A IP
例如:在主DNS服务器/var/named/yhyblog.cn.zone 中添加:
ops IN NS ns1.ops
ns1.ops IN A 192.168.23.12
例如:子域服务器中,在/etc/named.rfc1912.zones中添加:
zone "ops.yhyblog.cn" IN {
type master;
file "ops.yhyblog.cn.zone";
};
例如:子域服务器中,在/var/named//var/named/ops.yhyblog.cn.zone中添加
$TTL 3600
$ORIGIN ops.yhyblog.cn.
@ IN SOA ns1.ops.yhyblog.cn. dnsadmin.ops.yhyblog.cn. (
2017010802
1H
10M
3D
1D )
IN NS ns1
ns1 IN A 192.168.23.12
www IN A 192.168.23.10
定义转发(仅仅转发对某个特定区域的解析请求)
注意:被转发的服务器必须允许为当前服务器做递归查询,否则转发无效
就是在被转发的主DNS服务器中添加
acl mynet {
192.168.23.0/24;
127.0.0.0/8;
};
allow-recursion { mynet; }; 允许这个网段的服务器做递归查询
(1)区域转发:仅转发对某特定区域的解析请求
zone "ZONE_NAME" IN{
type forward;
forward {first|only};
forwarders { SERVER_IP; };
注意:first:为首先转发,转发器不响应时,自行去迭代查询
only: 只转发
}
例如:在主DNS服务器/var/named/yhyblog.cn.zone 中添加:
ops IN NS ns1.ops
ns1.ops IN A 192.168.23.5
例如:在主DNS服务器/etc/named.rfc1912.zones中添加:
zone "yhyblog.cn" IN {
type forward;
forward only;
forwarders { 192.168.23.3; 192.168.23.4; };
};
(2)全局转发:凡是本地没有通过zone定义的区域查询请求,通通转给某转发器(DNS服务器)
options {
forward {only|first};
forwarders {SERVER_IP};
}
例如:在子域服务器中的/etc/named.conf中
forward only;
forwarders { 192.168.23.3; };
在bind中与安全相关的配置(了解)
acl:访问控制列表,把一个或多个地址归并为一个命名的集合,随后通过此名称即可对此集合命令的所有主机实现统一调用
acl acl_name {
ip;
net/mask
}
例如:
acl mynet {
192.168.23.0/24;
127.0.0.0/8;
};
bind有四个内置的acl
none:没有一个主机
any:任意主机
local:本机
localnet:本机所在的IP所属的网络
访问控制命令
allow-query {}:允许查询的主机,白名单
allow-transfer {}:允许向哪些主机做区域传送,默认为所有主机,应该配置为仅允许从服务器
allow-recursion {}:允许哪个主机向当前的DNS服务器发起递归请求,不允许递归的服务器不会转发请求,因此,dns服务器只允许指定的服务器进行递归查询
allow-update {}:DDNS , 允许动态更新区域数据库文件中的内容