DNS是什么
DNS(Domain Name System,域名系统),是互联网上存储域名和IP映射关系的一个分布式数据库,他负责把域名转换为IP地址,或IP转换为域名,工作于OSI应用层之上,DNS运行于UDP/TCP的53端口,其中,负责提供域名解析的为UDP协议的53端口,负责DNS服务器之间的区域传送采用TCP的53端口。
BIND
BIND(Berkeley Internet Name Domain)是DNS协议的开源实现。由两部分组成。
- 域名服务器(Name Server):
提供域名解析服务。 - 解析器(Resolver):
负责发起查询和向调用他的应用返回IP地址或者别名等消息。
DNS服务器的分类
- 权威域名服务器
负责授权域下面的域名解析服务,由上级权威域名服务器使用NS记录进行授权。
按照授权的层级划分,最多127层:
1)根域
使用.
表示,通常在浏览器输入时省略。负责对.com
,.cn
,.org
等顶级域进行授权,全球13个逻辑根服务器。
2)顶级域
类似于.com
,.cn
,.org
3)二级域
sina.com
,baidu.com
,aliyun.com
主DNS:
每个区域名字服务器,保存着本区域的正式数据。
从DNS:
通过“区域传送”操作,通过主服务器上获取它的数据。
-
缓存域名服务器
通过依次查询根域-顶级域-二级域的方式来解析dns条目,同时根据DNS条目的TTL值进行缓存。 -
转发域名服务器
在接收查询请求时,不向根发起请求,而是转发到指定的上级DNS服务器,而且不进行任何缓存,仅转发。
权威应答:由直接负责的DNS服务器返回解析。
非权威应答:从缓存中读取记录来回答查询,可能数据已过期。
DNS查询类型
递归查询:
- 客户端解析器把请求发送给本地DNS服务器;
- 本地服务器代替客户端,向根域-顶级域-二级域查询,并把最终结果返回给用户。
迭代查询:
- 客户端向本地DNS发起查询;
- 本地DNS不直接去帮助客户端查询,而是发给客户端一个可以解析本次请求的DNS服务器的列表,再由客户端再次向这些列表中的DNS发起请求,从而查到结果。
DNS资源记录类型
资源记录的定义格式:
name [TTL] IN RR_TYPE value
注意:
- TTL可以从全局继承;
- @可用于引用当前区域的名字
- 相邻的两条记录其name相同时,后面的可省略;
SOA
Start Of Authority,这种record 放在zone file 一开始的地方,每一个zone只能有一个SOA,而且一定是记录中第一个“记录”,它描述这个zone负责的name server,version number…等资料,以及当slave server 要备份这个zone 时的一些参数。
例:
xiaohou.com. 86400 IN SOA xiaohou.com. root.xiaohou.com. (
2017031901 ; serial
2H ; refresh
10M ; retry
1W ; expire
1D ; negative answer ttl
)
serial:序列号,作为主从更新的依据,主服务器数据库内容发生变化时,其版本号递增;
refresh:从服务器每多久到主服务器检查序列号更新状况;
retry: 从服务器从主服务器请求同步解析库失败时,间隔多久再次尝试连接;
expire:过期时长,从服务器始终联系不到主服务器时,多久之后放弃从主服务器同步数据;停止提供服务;
negative answer ttl:否定答案的缓存时长,客户端缓存的时间,设定过长会导致无法立即生效,设定过短导致客户端频繁请求
NS
name server,用来指定操作的DNS服务器名称,需注意的是不可以用IP地址表示。
例:
xiaohou.com. 86400 IN NS ns1.xiaohou.com.
xiaohou.com. 86400 IN NS ns2.xiaohou.com.
MX
mail exchanger,设定区域中邮件服务器(SMTP)的主机。 每一个值前面由一个数字,是该主机邮件传递时的优先次序,此值越低表示有越高的邮件处理优先权,取值范围0-99。
例:
xiaohou.com. IN MX 10 ns1.xiaohou.com.
IN MX 20 ns2.xiaohou.com.
A
address,将域名解析到IPv4的IP地址。
例:
www.xiaohou.com. IN A 10.0.7.100
AAAA
将域名解析到IPv6的IP位址。
例:
www.xiaohou.com. 86400 IN AAAA 3ffe: :bbb:93:5
PTR
pointer,将IP地址转换成主机的FQDN。
例:
100.7.0.10.in-addr.arpa. IN PTR www.xiaohou.com.
CNAME
canonical name,别名
例:
blog.xiaohou.com. IN CNAME www.xiaohou.com.
配置DNS服务器(BIND)
环境
IP地址 | 操作系统 | 主机名 |
---|---|---|
10.0.7.1 | Centos7 | 主DNS服务器 |
10.0.7.2 | Centos7 | 从DNS服务器 |
10.0.7.3 | Centos7 | 子域服务器 |
程序包:
bind-libs:被bind和bind-utils包中的程序共同用到的库文件;
bind-utils:bind客户端程序集,例如dig, host, nslookup等;
bind:提供的dns server程序、以及几个常用的测试程序;
bind-chroot:选装,让named运行于jail模式下;
rndc:remote name domain controller,默认与bind安装再同一主机,且只能通过127.0.0.1来连接named进程,提供辅助管理功能,服务监听于tcp的953端口。
主节点 (10.0.7.1)
安装bind
yum -y install bind-libs bind-utils bind bind-chroot
配置/etc/named.conf
options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "data/cache_dump.db";
zone-statistics yes;
statistics-file "data/named_stats.txt";
memstatistics-file "data/named_mem_stats.txt";
allow-query { any; };
//recursion:
//作为授权域名服务器 no,作为一个递归DNS服务器 yes;
recursion yes;
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
empty-zones-enable no;
};
logging {
//错误日志
channel error_log {
file "data/error_log" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
//查询日志
channel query_log {
file "data/query_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
error_log;
};
category queries {
query_log;
};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
配置/etc/named.rfc1912.zones
//正向解析
zone "xiaohou.com" IN {
type master;
file "xiaohou.com.zone";
allow-update { none; };
};
//反向解析
zone "7.0.10.in-addr.arpa" IN {
type master;
file "10.0.7.arpa.zone";
allow-update { none; };
};
配置正向区域/var/named/xiaohou.com.zone
$TTL 86400
;资源记录简写时补全的后缀,如果不指定默认为zone中定义的
$ORIGIN xiaohou.com.
@ IN SOA ns1.xiaohou.com. root.xiaohou.com. (
2017031901 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
IN NS ns1.xiaohou.com.
IN NS ns2.xiaohou.com.
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 10.0.7.1
ns2 IN A 10.0.7.2
@ IN A 10.0.7.1
www IN A 10.0.7.2
mx1 IN A 10.0.7.3
mx2 IN A 10.0.7.4
配置反向区域/var/named/10.0.7.arpa.zone
$TTL 1D
@ IN SOA ns1.xiaohou.com. root.xiaohou.com. (
11 ; serial
1H ; refresh
5M ; retry
3M ; expire
10H ) ; minimum
IN NS ns1.xiaohou.com.
IN NS ns2.xiaohou.com.
1 IN PTR ns1.xiaohou.com.
2 IN PTR ns2.xiaohou.com.
3 IN PTR mx1.xiaohou.com.
4 IN PTR mx2.xiaohou.com.
启动
systemctl start named
systemctl enable named
如果需要使用chroot启动
/usr/libexec/setup-named-chroot.sh /var/named/chroot/ on
systemctl stop named
systemctl disable named
systemctl start named-chroot
systemctl enable named-chroot
从节点 (10.0.7.2)
安装bind
yum -y install bind-libs bind-utils bind bind-chroot
配置/etc/named.conf
options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "data/cache_dump.db";
statistics-file "data/named_stats.txt";
memstatistics-file "data/named_mem_stats.txt";
allow-query { any; };
//recursion:
//作为授权域名服务器 no,作为一个递归DNS服务器 yes;
recursion yes;
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
empty-zones-enable no;
};
logging {
channel error_log {
file "data/error_log" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel query_log {
file "data/query_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
error_log;
};
category queries {
query_log;
};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
配置/etc/named.rfc1912.zones
zone "xiaohou.com" IN {
type slave;
masters { 10.0.7.1; };
file "slaves/xiaohou.com.zone";
};
zone "7.0.10.in-addr.arpa" IN {
type slave;
masters { 10.0.7.1; };
file "slaves/10.0.7.arpa.zone";
};
启动
systemctl start named
systemctl enable named
如果需要使用chroot启动
/usr/libexec/setup-named-chroot.sh /var/named/chroot/ on
systemctl stop named
systemctl disable named
systemctl start named-chroot
systemctl enable named-chroot
子域授权
子域授权,是DNS的分布式的一种实现。在原有的zone上划出一个子域,并给新DNS服务器管理。如果有客户端请求解析在此区域中的域名,则只要找新的子DNS服务器,以便减轻主DNS的压力。
配置主服务器
首先在主域服务器添加子域:
vim /var/named/xiaohou.com.zone
$TTL 86400
$ORIGIN xiaohou.com.
@ IN SOA ns1.xiaohou.com. root.xiaohou.com. (
2017031902 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
IN NS ns1.xiaohou.com.
IN NS ns2.xiaohou.com.
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 10.0.7.1
ns2 IN A 10.0.7.2
@ IN A 10.0.7.1
www IN A 10.0.7.2
mx1 IN A 10.0.7.3
mx2 IN A 10.0.7.4
blog IN NS ns1.blog
ns1.blog IN A 10.0.7.3
记得修改版本号,保证从服务器获取更新;
重新载入配置
rndc reload
配置子域服务器(10.0.7.3)
安装bind
yum -y install bind-libs bind-utils bind bind-chroot
配置/etc/named.conf
options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "data/cache_dump.db";
statistics-file "data/named_stats.txt";
memstatistics-file "data/named_mem_stats.txt";
allow-query { any; };
//recursion:
//作为授权域名服务器 no,作为一个递归DNS服务器 yes;
recursion yes;
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
empty-zones-enable no;
};
logging {
channel error_log {
file "data/error_log" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel query_log {
file "data/query_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
error_log;
};
category queries {
query_log;
};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
配置/etc/named.rfc1912.zones
zone "blog.xiaohou.com" IN {
type master;
file "blog.xiaohou.com.zone";
allow-update { none; };
};
配置/var/named/blog.xiaohou.com.zone
$TTL 1D
$ORIGIN blog.xiaohou.com.
@ IN SOA ns1.blog.xiaohou.com. root.blog.xiaohou.com. (
2017031901 ;Serial
1H ;Refresh
10M ;Retry
3D ;Expire
1D ;Minimum TTL
)
IN NS ns1
IN NS ns2
ns1 IN A 10.0.7.3
ns2 IN A 10.0.7.4
@ IN A 10.0.7.5
www IN A 10.0.7.6
mx1 IN A 10.0.7.7
mx2 IN A 10.0.7.8
启动
/usr/libexec/setup-named-chroot.sh /var/named/chroot/ on
systemctl stop named
systemctl disable named
systemctl start named-chroot
systemctl enable named-chroot
DNS转发
区域转发:
配置在zone段,仅转发对某特定区域的解析请求;
zone "ZONE_NAME" IN {
type forward;
forward first;
forwarders { 223.5.5.5;223.6.6.6; };
};
forward选项:
- first:首先转发;转发器不响应时,自行去迭代查询;
- only:只转发;
全局转发:
配置在options段,针对凡本地没有通过zone定义的区域查询请求,通通转给某转发器;
vim /etc/named.conf
options {
forward only;
forwarders { SERVER_IP; };
};
全局转发(10.0.7.1)
vim /etc/named.conf
options {
forward first;
forwarders { 223.5.5.5;223.6.6.6; };
};
区域转发(10.0.7.3)
vim /etc/named.rfc1912.zones
zone "xiaohou.com" IN {
type forward;
forward only;
forwarders { 10.0.7.1; };
};
访问控制ACL
把一个或多个地址归并为一个集合,并通过一个统一的名称调用;
acl acl_name {
ip;
net/perlen;
}
四个内置的acl:
- none:没有一个主机
- any:任意主机
- local:本机
- localnet: 本机的IP同掩码运算后得到的地址
注意: 只能先定义,后使用,通常放置在配置文件最前面
访问控制的指令:
- allow-query{}: 允许查询的主机
- allow-transfer{}: 允许区域传送
- allow-recursion{}: 通常定义在全局options段,允许递归的主机
- allow-update{}: 允许更新区域库的内容,大多数情况为none
配置acl实现访问控制,区域传送只允许slaves定义的主机,所有主机的查询操作都不被允许。
配置主服务器10.0.7.1
vim /etc/named.conf
acl slaves {
10.0.7.2;
};
vim /etc/named.rfc1912.zones
zone "xiaohou.com" IN {
type master;
file "xiaohou.com.zone";
allow-query { none; };
allow-transfer { slaves; };
allow-update { none; };
};
配置允许递归的主机
vim /etc/named.conf
options {
recursion yes;
allow-recursion { 10.0.7.0/24; };
};
视图view
我们一般常用视图拿来构建智能DNS,一个bind服务器可以定义多个view,每个view中可以定义一个或多个zone,每个view用来匹配一组客户端。
- view实现智能DNS:
多个view内可能需要对同一区域进行解析,但使用不同通的区域解析文件;
注意: view依据的来源地址并不是客户端的最终地址,而是客户端上配置的DNS节点的地址,如果上海联通的用户配置了北京电信的DNS,那么可能就会被调度到电信节点
用法:
view view_name {
match-clients { };
}
注意:
一旦启用了view,所有的zone都只能定义在view中;
仅在允许递归请求的客户端所在的view中定义根区域;
客户端请求到达时,自上而下对符合view的客户端列表进行匹配;
配置10.0.7.1主服务器,named.conf
vim /etc/named.conf
acl slaves {
10.0.7.2;
};
acl shanghai {
10.0.7.2;
};
acl beijing {
10.0.7.3;
};
acl office {
10.0.0.0/16;
};
options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "data/cache_dump.db";
statistics-file "data/named_stats.txt";
memstatistics-file "data/named_mem_stats.txt";
allow-query { any; };
//作为授权域名服务器 no;
//作为一个递归DNS服务器 yes;
recursion yes;
allow-recursion { office; };
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
empty-zones-enable no;
forwarders { 223.5.5.5;223.6.6.6; };
};
logging {
channel error_log {
file "data/error_log" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel query_log {
file "data/query_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
error_log;
};
category queries {
query_log;
};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
配置10.0.7.1主服务器,named.rfc1912.zones
vim /etc/named.rfc1912.zones
view shanghai {
match-clients { shanghai; };
zone "xiaohou.com" {
type master;
file "sh.xiaohou.com.zone";
};
};
view beijing {
match-clients { beijing; };
zone "xiaohou.com" {
type master;
file "bj.xiaohou.com.zone";
};
};
view office {
match-clients { office; };
zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};
zone "xiaohou.com" IN {
type master;
file "xiaohou.com.zone";
allow-update { none; };
allow-transfer { slaves; };
allow-query { any; };
};
zone "7.0.10.in-addr.arpa" IN {
type master;
file "10.0.7.arpa.zone";
allow-update { none; };
};
};
区域配置文件,sh.xiaohou.com.zone
vim /var/named/sh.xiaohou.com.zone
$TTL 86400
$ORIGIN xiaohou.com.
@ IN SOA ns1.xiaohou.com. root.xiaohou.com. (
2017031902 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
IN NS ns1.xiaohou.com.
IN NS ns2.xiaohou.com.
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 10.0.7.1
ns2 IN A 10.0.7.2
@ IN A 10.0.7.1
www IN A 10.0.7.2
mx1 IN A 10.0.7.3
mx2 IN A 10.0.7.4
blog IN NS ns1.blog
ns1.blog IN A 10.0.7.3
区域配置文件
vim /var/named/bj.xiaohou.com.zone
$TTL 86400
$ORIGIN xiaohou.com.
@ IN SOA ns1.xiaohou.com. root.xiaohou.com. (
2017031902 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
IN NS ns1.xiaohou.com.
IN NS ns2.xiaohou.com.
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 10.0.7.1
ns2 IN A 10.0.7.2
@ IN A 172.16.1.17
www IN A 172.16.1.18
mx1 IN A 172.16.1.19
mx2 IN A 172.16.1.20
blog IN NS ns1.blog
ns1.blog IN A 10.0.7.3
如何分析用户是移动还是联通,北京还是上海?
答:我们可以使用纯真IP数据库进行解析。
DNS客户端工具使用
dig
用法
dig [-t type] [@server] [domain] +[no]trace
示例:
dig -t A @10.0.7.1 www.xiaohou.com
dig -t NS @10.0.7.1 www.xiaohou.com
#跟踪解析过程
dig -t A @10.0.7.1 www.biadu.com +trace
#反向解析
dig -x 10.0.7.3 @10.0.7.1
模拟完全区域传送:
dig -t axfr @10.0.7.2 xiaohou.com
rndc
rndc监听于tcp的953端口,用于管理员对dns服务器进行控制
[root@node2 ~]# rndc status
#服务器和软件的版本
version: 9.9.4-RedHat-9.9.4-38.el7_3.2 <id:8f9657aa>
#cpu数量
CPUs found: 2
#工作线程数
worker threads: 2
#upd监听的端口个数
UDP listeners per interface: 2
#zone的个数
number of zones: 8
#debug的级别
debug level: 0
#区域传送
xfers running: 0
xfers deferred: 0
#soa的查询情况
soa queries in progress: 0
#查询日志是否启用
query logging is ON
#递归的客户端
recursive clients: 0/0/1000
#tcp 客户端
tcp clients: 0/100
#服务是否正常
server is up and running
其他选项
reload 重新装入配置文件和区域
reload zone [class [view]] 重新装入单个区域
refresh zone [class [view]] 安排区域的立即维护
reconfig 仅重新装入配置文件和新区域
stats 将服务器统计信息写入统计文件中
querylog 切换查询日志
dumpdb 将高速缓存转储到转储文件 (named_dump.db)
stop 将暂挂更新保存到主文件并停止服务器
halt 停止服务器,但不保存暂挂更新
trace 将调试级别增加一级
trace level 更改调试级别
notrace 将调试级别设置为 0
flush 刷新服务器的所有高速缓存
flush [view] 为某一视图刷新服务器的高速缓存
status 显示服务器的状态
restart 重新启动服务器(尚未实现)
bind压测工具
wget ftp://ftp.isc.org/isc/bind9/9.11.0-P3/bind-9.11.0-P3.tar.gz
tar xf bind-9.11.0-P3.tar.gz
cd bind-9.11.0-P3/contrib/queryperf/
./configure && make
编写测试文件
vim testdns.txt
www.baidu.com A
www.qq.com A
www.xiaohou.com A
www.sina.com A
www.youku.com A
www.aliyun.com A
测试结果
[root@node1 queryperf]# ./queryperf -d testdns.txt -s 10.0.7.1
DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $
[Status] Processing input data
[Status] Sending queries (beginning with 10.0.7.1)
[Timeout] Query timed out: msg id 1
[Timeout] Query timed out: msg id 4
[Timeout] Query timed out: msg id 5
[Timeout] Query timed out: msg id 6
[Status] Testing complete
Statistics:
Parse input file: once
Ended due to: reaching end of file
Queries sent: 6 queries
Queries completed: 6 queries
Queries lost: 0 queries
Queries delayed(?): 0 queries
RTT max: 4.270617 sec
RTT min: 0.067555 sec
RTT average: 2.169086 sec
RTT std deviation: 2.101550 sec
RTT out of range: 0 queries
Percentage completed: 100.00%
Percentage lost: 0.00%
Started at: Tue Mar 21 23:56:27 2017
Finished at: Tue Mar 21 23:56:32 2017
Ran for: 5.000125 seconds
Queries per second: 1.199970 qps
其他详细的配置可以查看:Bind9 管理员参考手册
DNS监控
- 系统监控:
CPU,内存,网络IO等监控 - named进程监控:
判断named进程是否正常运行 - 解析服务监控:
使用dig命令进行解析,监控