DNS服务

DNS基础

DNS(Domain Name System,域名系统),在Internet上作为域名与IP地址相互映射的一个分布式数据库,能够使用户更方便的使用域名访问互联网,而不用去记住只能被机器识别的IP地址。域名(FQDN)和IP地址之间的转换工作称为域名解析(或主机名解析)。

ICANN,全称Internet Corporation for Assigned Names and Numbers(互联网名称与数字地址分配机构),是一个非盈利性的国际组织,负责互联网协议(IP)地址的空间分配,协议标示符的指派,通用顶级域名 (gTLD)以及国家和地区顶级域名(ccTLD)系统的管理,以及根服务器系统的管理。官方网址是:http://www.icann.org

ICANN的作用:负责协调管理DNS各技术要素以确保普遍可解析性,使所有的互联网用户都能够找到有效的地址。它是通过监督互联网运作当中独特的技术标示符的分配以及顶级域名的授权来做到这点的。

hosts映射

早期,名字到地址的转换过程十分简单。每台计算机保存一个hosts文件,里面列出所有计算机名字和对应的IP地址,然后定期从一个维护此文件的站点更新里面的记录。当我们访问某个计算机名字时,先在hosts文件找到对应的IP,然后就可以建立连接。

随着网络规模的扩大,这种方法渐渐吃不消了。主要有以下三个原因:

  • hosts文件变得非常大
  • 主机名字会冲突
  • 集中的维护站点会不堪重负

域名结构

通常 Internet 主机域名的一般结构为:主机名.三级域名.二级域名.顶级域名。 Internet 的顶级域名由 Internet网络协会域名注册查询负责网络地址分配的委员会进行登记和管理,它还为 Internet的每一台主机分配唯一的 IP 地址。全世界现有三个大的网络信息中心: 位于美国的 Inter-NIC,负责美国及其他地区; 位于荷兰的RIPE-NIC,负责欧洲地区;位于日本的APNIC,负责亚太地区

监听的端口

1
2
3
53/udp # 普通查询
53/tcp # 从服务器到主服务器进行数据传输,为保证数据完整性,使用tcp协议
953/tcp# rndc远程域名服务器控制器

DNS的功能

每个IP地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开。有了主机名,就不用死记硬背每台IP设备的IP地址,只要记住相对直观有意义的主机名就行了。这就是DNS协议所要完成的功能。

正反解析

  • 正向解析:从域名到ip地址的解析过程
  • 反向解析:从ip地址到域名的解析过程,反向解析一般用来进行服务器的身份验证

DNS查询

  • 查询的优先级:本地hosts文件 => 本地缓存 => 本地DNS区域文件
  • 分级查询:从根域开始,依次查询每一级域名的NS记录,直到查到最终的IP地址。DNS服务器根据域名的层级,进行分级查询。每一级域名都有自己的NS记录,NS记录指向该级域名的域名服务器。这些服务器知道下一级域名的各种记录。
  • 递归查询:客户端向DNS服务器发送一次请求,DNS服务器逐级完成查询完成后直接返回结果。对于客户端来讲为递归查询,对于DNS服务器来讲是迭代查询。

  • 迭代查询:客户端需要发起多次请求才可得到结果

默认情况下,DNS服务器使用递归方式来解析域名。递归的含义就是DNS服务器作为DNS客户端向其他DNS服务器查询此解析请求,直到获得解析结果,在此过程中,原客户端则等待DNS服务器的回复。

参考链接: http://blog.csdn.net/lycb_gz/article/details/11720247

DNS应答

  • 权威应答
    如果DNS服务器在自己的区域文件里找到了客户端需要查询的记录,就会返回一个权威性应答。如果DNS服务器最近被查找过该主机记录,就会在缓存里找到记录应答客户端。如果找不到主机的A记录,就会返回(RecordNotFound)应答――同样是权威性应答。
  • 非权威应答
    如果接到DNS查询请求的服务器不是指定域的名称服务器,则:首先查询其他DNS服务器直到找到,然后此服务器将找到的内容返回给客户端――非权威性应答。其次,推荐客户端到上一级DNS服务器找。―――非权威性应答。

DNS冗余

为保证服务的高可用性,DNS要求使用多台名称服务器冗余支持每个区域。某个区域的资源记录通过手动或自动方式更新到单个主名称服务器(称为主DNS服务器)上,主 DNS 服务器可以是一个或几个区域的权威名称服务器。

其它冗余名称服务器(称为辅 DNS 服务器)用作同一区域中主服务器的备份服务器,以防主服务器无法访问或宕机。辅 DNS服务器定期与主 DNS 服务器通讯,确保它的区域信息保持最新。如果不是最新信息,辅DNS服务器就会从主服务器获取最新区域数据文件的副本。这种将区域文件复制到多台名称服务器的过程称为区域复制。

服务器类型

  • 主从服务器:主服务器数据修改,辅助服务器请求数据同步
  • 缓存服务器
  • 转发器

资源记录

  • 为了将名字解析为IP地址,服务器查询它们的区(DNS数据库文件)。区中包含组成相关DNS域资源信息的资源记录(RR)。
  • 某些资源记录不仅包括DNS域中服务器的信息,还可以用于定义域,即指定每台服务器授权了哪些域,这些资源记录就是SOA和NS资源记录。
  • 数据库中的每一个条目称作是一个资源记录(Resource Record,RR),它是一个五元组,可以用以下格式表示:
1
2
3
4
5
6
7
Domain_name Time_to_live Class Type Value
#
# Domain_name 指出这条记录适用于哪个域名
# Time_to_live 用来表明记录的生存周期,也就是说最多可以缓存该记录多长时间,可省略
# Class 一般总是IN;对应的是internet
# Type 资源记录的类型
# Value 记录的值,如果是A记录,则value是一个IPv4地址
名称 TTL值(可选) Internet 资源记录类型
NAME TTL IN RRT VALUE
www.nettest.net 600 IN A 161.202.43.78
161.202.43.78 600 IN PTR www.nettest.net

资源记录及类型

A记录:A记录也称为主机记录,是使用最广泛的DNS记录,A记录的基本作用就是说明一个域名对应的IP是多少, 它是域名和IP地址的对应关系,表现形式为 www.contoso.com 192.168.1.1 这就是一个A记录!A记录除了进行域名IP对应以外,还有一个高级用法,可以作为低成本的负载均衡的解决方案,比如说,www.contoso.com 可以创建多个A记录,对应多台物理服务器的IP地址,可以实现基本的流量均衡!)

NS记录:NS记录和SOA记录是任何一个DNS区域都不可或缺的两条记录,NS记录也叫名称服务器记录,用于说明这个区域有哪些DNS服务器负责解析,SOA记录说明负责解析的DNS服务器中哪一个是主服务器。因此,任何一个DNS区域都不可能缺少这两条记录。NS记录,说明了在这个区域里,有多少个服务器来承担解析的任务

SOA记录:NS记录说明了有多台服务器在进行解析,但哪一个才是主服务器呢,NS并没有说明,这个就要看SOA记录了,SOA名叫起始授权机构记录,SOA记录说明了在众多NS记录里那一台才是主要的服务器!

MX记录:全称是邮件交换记录,在使用邮件服务器的时候,MX记录是无可或缺的,比如A用户向B用户发送一封邮件,那么他需要向DNS查询B的MX记录,DNS在定位到了B的MX记录后反馈给A用户,然后A用户把邮件投递到B用户的MX记录服务器里!

Cname记录:又叫别名记录,我们可以这么理解,我们小的时候都会有一个小名,长大了都是学名,那么正规来说学名的符合公安系统的,那个小名只是我们的一个代名词而已,这也存在一个好处,就是比暴漏自己,比如一个网站 a.com 在发布的时候,他可以建立一个别名记录,把 b.com 发布出去,这样不容易被外在用户所察觉!达到隐藏自己的目的!

SRV记录:SRV记录是服务器资源记录的缩写,SRV记录是DNS记录中的新鲜面孔,在RFC2052中才对SRV记录进行了定义,因此很多老版本的DNS服务器并不支持SRV记录。那么SRV记录有什么用呢?SRV记录的作用是说明一个服务器能够提供什么样的服务!SRV记录在微软的Active Directory中有着重要地位,大家知道在NT4时代域和DNS并没有太多关系。但从Win2000开始,域就离不开DNS的帮助了,为什么呢?因为域内的计算机要依赖DNS的SRV记录来定位域控制器!表现形式为:

1
2
3
4
5
6
7
8
9
10
11
12
ldap._tcp.contoso.com 600 IN SRV 0 100 389 NS.contoso.com
# 说明:
ladp: 是一个服务,该标识说明把这台服务器当做响应LDAP请求的服务器
tcp:本服务使用的协议,可以是tcp,也可以是用户数据包协议《udp》
contoso.com:此记录所值的域名
600: 此记录默认生存时间(秒)
IN: 标准DNS Internet类
SRV:将这条记录标识为SRV记录
0: 优先级,如果相同的服务有多条SRV记录,用户会尝试先连接优先级最低的记录
100:负载平衡机制,多条SRV并且优先级也相同,那么用户会先尝试连接权重高的记录
389:此服务使用的端口
NS.contoso.com:提供此服务的主机

PTR记录:PTR记录也被称为指针记录,PTR记录是A记录的逆向记录,作用是把IP地址解析为域名。由于我们在前面提到过,DNS的反向区域负责从IP到域名的解析,因此如果要创建PTR记录,必须在反向区域中创建。

Bind安装配置

Bind,全称是Berkeley Internet Name Domain(伯克利因特网名字域系统)。官方网址:http://www.isc.org/ 。它主要有3个版本:BIND 4,BIND 8,BIND9。

需求

已知域名 study.infostudy.co,IP地址 192.168.127.0/24,要实现

主从权威名称服务器

1
2
ns1.study.info 192.168.127.123
ns2.study.info 192.168.127.124

邮件服务器

1
mail.study.co  192.168.127.125

网站服务器

1
www.study.co   192.168.127.126

ftp服务器

1
ftp.study.co   192.168.127.127

别名

1
www2.study.co => www.study.co

PTR

1
192.168.127.128 => www.study.co

安装和文件说明

配置yum源,安装bind的rpm包

1
2
rpm -qa |  grep '^bind'
yum -y install bind bind-utils

文件说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/usr/sbin/named
# 主程序文件
/etc/named.conf
# 主配置文件
options{....};
# 全局配置段
logging{....};
# 日志配置段
zone{.....};
# 由本机负责解析的区域或转发的区域
/var/named/
# 数据文件目录
/var/named/named.ca
# 存放根域的配置文件

区域配置的语法结构

  • 区域
1
2
3
4
5
zone "ZONE NAME" IN {
type {master|slave|hint|forward};
;主 |从 |根 |转发器
file "区域数据文件";
};
  • 主区域
1
file "区域数据文件";
  • 从区域
1
2
file "区域数据文件";
masters { master_ip; };

配置

在主机 192.168.127.123上进行配置

备份好原生配置文件

1
2
cp /etc/named.conf{,.bak}
cat /etc/named.conf

编辑 /etc/named.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
options {
listen-on port 53 { 192.168.127.123; };
allow-transfer {"none";};
allow-recursion {"any";};
recursion yes;
max-cache-ttl 900;
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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { localhost; };

dnssec-enable yes;
dnssec-validation yes;

/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

zone "." IN {
type hint;
file "named.ca";
};

zone "localhost" IN {
type master;
file "named.localhost";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
};
zone "study.info" IN {
type master;
file "zone.study.info";
};
zone "study.co" IN {
type master;
file "zone.study.co";
};
zone "127.168.192.in-addr.arpa" IN {
type master;
file "zone.192.168.127";
};

创建区域文件 /var/named/zone.study.info

1
2
3
4
5
6
7
8
9
10
11
$TTL 600
@ IN SOA @ memory.study.co. (
2006103002 ; Serial at current time
1D ; Refresh after 1 day
1H ; Retry after 1 houre
1M ; Expire after 1 month
1W) ; Minimum TTL of 1 week
study.info. IN NS ns1.study.info.
@ IN NS ns2 ; 区域名称可省略,自动补全
ns1 IN A 192.168.127.123
ns2 IN A 192.168.127.124

创建区域文件 /var/named/zone.study.co

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$TTL 600
@ IN SOA @ memory.study.co. (
2010111004 ;Serial at current time
86400 ;Refresh after 1 day
3600 ;Retry after 1 houre
2419200 ;Expire after 1 month
60480 ;Minimum TTL of 1 week
)
@ IN NS ns1.study.info.
@ IN NS ns2.study.info.
@ IN MX 10 mail.study.co.
mail IN A 192.168.127.125
www IN A 192.168.127.126
www2 IN CNAME www
ftp IN A 192.168.127.127
* IN A 192.168.127.123 ;*代表所有,即*.study.co

创建区域文件 zone.192.168.127

1
2
3
4
5
6
7
8
9
10
11
$TTL 600
@ IN SOA @ memory.study.co. (
2010111004 ;Serial at current time
86400 ;Refresh after 1 day
3600 ;Retry after 1 houre
2419200 ;Expire after 1 month
60480 ;Minimum TTL of 1 week
)
@ IN NS ns1.study.info.
@ IN NS ns2.study.info.
128 IN PTR www.study.co.

对区域进行检查和文件权限,修改属主属组;重读配置文件进行测试

1
2
3
4
5
6
7
8
9
10
11
12
chown /var/named/zone.study.*  /var/named/zone.192.168.127 --reference='/etc/named.conf'
chmod /var/named/zone.study.* /var/named/zone.192.168.127 --reference='/etc/named.conf'
named-checkconf /etc/named.conf
named-checkzone "localhost" /var/named/named.localhost
named-checkzone "0.0.127.in-addr.arpa" /var/named/named.loopback
named-checkzone "study.info" /var/named/zone.study.info
named-checkzone "study.co" /var/named/zone.study.co
named-checkzone "127.168.192.in-addr.arpa" /var/named/zone.192.168.127
setenforce disabled
/bin/sed -ri 's/(^SELINUX=).*/\1disabled/' /etc/selinux/config
systemctl enable --now named
systemctl status named

使用 dig 命令进行测试

1
2
3
4
dig @192.168.127.123 -t NS study.co
dig @192.168.127.123 -t A ftp.study.co
dig @192.168.127.123 -t A ns1.study.info
dig @192.168.127.123 -t MX study.co

如果在服务运行的过程中修改了配置文件,无需重新启动服务,使用 pkill 命令即可使服务重读配置文件

1
pkill -1 named

主从复制及区域传送

Bind 配置

从服务器(slave)192.168.127.164 bind配置,配置完成后进行主、从DNS日期时间同步

1
2
3
4
5
6
setenforce disabled
sed -ri 's/(^SELINUX=).*/\1disabled/' /etc/selinux/config
rpm -qa | grep '^bind'
yum -y install bind bind-utils
cd /etc/ ; cp named.conf{,.orig}
scp -P 22 192.168.127.123:/etc/named.conf /etc/named.conf

生成区域文件的工具: http://pgl.yoyo.org/adservers/bind-zone-file-creator.php

主 DNS 配置

在主 DNS 服务器 192.168.127.123 上修改 /etc/named.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
options {
listen-on port 53 { 192.168.127.123; };
allow-transfer {192.168.127.124; }; // 允许区域传送的IP地址
recursion yes;
notify yes; // 启用通知从服务器同步功能
max-cache-ttl 900;
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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { "any"; };

dnssec-enable yes;
dnssec-validation yes;

/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

zone "." IN {
type hint;
file "named.ca";
};

zone "localhost" IN {
type master;
file "named.localhost";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
};
zone "study.info" IN {
type master;
file "zone.study.info";
};
zone "study.co" IN {
type master;
file "zone.study.co";
};
zone "127.168.192.in-addr.arpa" IN {
type master;
file "zone.192.168.127";
};

从 DNS 配置

在从 DNS 服务器上 192.168.127.124 上配置 /etc/named.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
options {
listen-on port 53 { 192.168.127.124; }; // 修改监听地址
allow-transfer {"none";};
recursion yes;
max-cache-ttl 900;
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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { "any"; };

dnssec-enable yes;
dnssec-validation yes;

/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

zone "." IN {
type hint;
file "named.ca";
};

zone "localhost" IN {
type master;
file "named.localhost";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
};
zone "study.info" IN {
type slave; // 定义类型为从服务器
masters { 192.168.127.123; }; // 定义主服务器及IP
file "zone.study.info";
};
zone "study.co" IN {
type slave; // 定义类型为从服务器
masters { 192.168.127.123; }; // 定义主服务器及IP
file "zone.study.co";
};
zone "127.168.192.in-addr.arpa" IN {
type slave; // 定义类型为从服务器
masters { 192.168.127.123; }; // 定义主服务器及IP
file "zone.192.168.127";
};

区域传送测试

主从 DNS 服务器都重启进程,并查看日志是否传送成功

1
2
systemctl restart named
tail /var/log/messages -n 50

主服务器看到的日志信息

1
2
3
4
5
6
7
8
9
10
11
12
13
Jul 18 17:09:39 study named[3249]: running
Jul 18 17:09:39 study named[3249]: zone study.info/IN: sending notifies (serial 2006103002)
Jul 18 17:09:39 study named[3249]: zone study.co/IN: sending notifies (serial 2010111004)
Jul 18 17:09:39 study named[3249]: zone 127.168.192.in-addr.arpa/IN: sending notifies (serial 2010111004)
Jul 18 17:09:39 study named[3249]: client 192.168.127.124#45719 (study.info): transfer of 'study.info/IN': AXFR started
Jul 18 17:09:39 study named[3249]: client 192.168.127.124#45719 (study.info): transfer of 'study.info/IN': AXFR ended
Jul 18 17:09:40 study named[3249]: client 192.168.127.124#59139: received notify for zone 'study.info'
Jul 18 17:09:44 study named[3249]: client 192.168.127.124#50093 (study.co): transfer of 'study.co/IN': AXFR started
Jul 18 17:09:44 study named[3249]: client 192.168.127.124#50093 (study.co): transfer of 'study.co/IN': AXFR ended
Jul 18 17:09:44 study named[3249]: client 192.168.127.124#59139: received notify for zone 'study.co'
Jul 18 17:09:46 study named[3249]: client 192.168.127.124#44996 (127.168.192.in-addr.arpa): transfer of '127.168.192.in-addr.arpa/IN': AXFR started
Jul 18 17:09:46 study named[3249]: client 192.168.127.124#44996 (127.168.192.in-addr.arpa): transfer of '127.168.192.in-addr.arpa/IN': AXFR ended
Jul 18 17:09:46 study named[3249]: client 192.168.127.124#34993: received notify for zone '127.168.192.in-addr.arpa'

从服务器看到的日志信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Jul 18 17:09:04 bogon named[21703]: zone study.info/IN: Transfer started.
Jul 18 17:09:04 bogon named[21703]: transfer of 'study.info/IN' from 192.168.127.123#53: connected using 192.168.127.124#44390
Jul 18 17:09:04 bogon named[21703]: transfer of 'study.info/IN' from 192.168.127.123#53: failed while receiving responses: REFUSED
Jul 18 17:09:04 bogon named[21703]: transfer of 'study.info/IN' from 192.168.127.123#53: Transfer completed: 0 messages, 0 records, 0 bytes, 0.003 secs (0 bytes/sec)
Jul 18 17:09:39 bogon named[21703]: client 192.168.127.123#29674: received notify for zone 'study.info'
Jul 18 17:09:39 bogon named[21703]: zone study.info/IN: Transfer started.
Jul 18 17:09:39 bogon named[21703]: transfer of 'study.info/IN' from 192.168.127.123#53: connected using 192.168.127.124#45719
Jul 18 17:09:39 bogon named[21703]: zone study.info/IN: transferred serial 2006103002
Jul 18 17:09:39 bogon named[21703]: transfer of 'study.info/IN' from 192.168.127.123#53: Transfer completed: 1 messages, 6 records, 175 bytes, 0.013 secs (13461 bytes/sec)
Jul 18 17:09:39 bogon named[21703]: zone study.info/IN: sending notifies (serial 2006103002)
Jul 18 17:09:40 bogon named[21703]: client 192.168.127.123#49585: received notify for zone 'study.co'
Jul 18 17:09:40 bogon named[21703]: zone study.co/IN: notify from 192.168.127.123#49585: refresh in progress, refresh check queued
Jul 18 17:09:40 bogon named[21703]: client 192.168.127.123#49585: received notify for zone '127.168.192.in-addr.arpa'
Jul 18 17:09:40 bogon named[21703]: zone 127.168.192.in-addr.arpa/IN: notify from 192.168.127.123#49585: refresh in progress, refresh check queued
Jul 18 17:09:44 bogon named[21703]: zone study.co/IN: Transfer started.
Jul 18 17:09:44 bogon named[21703]: transfer of 'study.co/IN' from 192.168.127.123#53: connected using 192.168.127.124#50093
Jul 18 17:09:44 bogon named[21703]: zone study.co/IN: transferred serial 2010111004
Jul 18 17:09:44 bogon named[21703]: transfer of 'study.co/IN' from 192.168.127.123#53: Transfer completed: 1 messages, 10 records, 265 bytes, 0.002 secs (132500 bytes/sec)
Jul 18 17:09:44 bogon named[21703]: zone study.co/IN: sending notifies (serial 2010111004)
Jul 18 17:09:46 bogon named[21703]: zone 127.168.192.in-addr.arpa/IN: Transfer started.
Jul 18 17:09:46 bogon named[21703]: transfer of '127.168.192.in-addr.arpa/IN' from 192.168.127.123#53: connected using 192.168.127.124#44996
Jul 18 17:09:46 bogon named[21703]: zone 127.168.192.in-addr.arpa/IN: transferred serial 2010111004
Jul 18 17:09:46 bogon named[21703]: transfer of '127.168.192.in-addr.arpa/IN' from 192.168.127.123#53: Transfer completed: 1 messages, 5 records, 197 bytes, 0.002 secs (98500 bytes/sec)
Jul 18 17:09:46 bogon named[21703]: zone 127.168.192.in-addr.arpa/IN: sending notifies (serial 2010111004)

从服务器更新测试,修改主服务器区域文件,添加一条 N S记录并修改序列号;主服务器重启进程,测试从服务器是否正常同步

rndc远程控制

在主DNS生成 rndc 配置文件

1
2
3
4
rndc-confgen -s 127.0.0.1  -r /dev/urandom > /etc/rndc
touch /etc/rnd.conf
chmod /etc/rndc.conf --reference=/etc/named.conf
chown /etc/rndc.conf --reference=/etc/named.conf

文件 /etc/rndc 内容查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "g7vCooMXxxyLTD92+C5bOg==";
};

options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# algorithm hmac-md5;
# secret "g7vCooMXxxyLTD92+C5bOg==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf

将开头的 key 覆盖到 /etc/rndc.conf

1
awk '/# Start of rndc.conf/,/# End of rndc.conf/' /etc/rndc > /etc/rndc.conf

修改 server IP

1
2
3
4
5
6
7
8
9
10
11
12
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "g7vCooMXxxyLTD92+C5bOg==";
};

options {
default-key "rndc-key";
default-server 192.168.127.123;
default-port 953;
};
# End of rndc.conf

# 开头的行写到 /etc/named.conf 文件中,并去掉部分注释。修改被控制机IP地址,以及allow,允许哪些IP来控制本机

1
2
3
4
5
6
7
8
9
10
11
# Use with the following in named.conf, adjusting the allow list as needed:
key "rndc-key" {
algorithm hmac-md5;
secret "je+uT0BxuoBgYVic//p6Rg==";
};

controls {
inet 192.168.127.123 port 953
allow { any; } keys { "rndc-key"; };
};
# End of named.conf

使用 rndc -c /etc/rndc.conf status 命令查看状态

1
2
3
4
5
6
7
8
9
10
11
12
13
version: 9.9.4-RedHat-9.9.4-73.el7_6 <id:8f9657aa>
CPUs found: 1
worker threads: 1
UDP listeners per interface: 1
number of zones: 103
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running

其他命令

1
2
3
rndc -c /etc/rndc.conf notify study.info   # 手动通知区域
rndc -c /etc/rndc.conf flush # 清空缓存
rndc -c /etc/rndc.conf stop # 停止 dns 服务

上面只是实现了本机 IP 控制本机,如果要使用其他主机来控制,需要拷贝 rndc 到控制机

1
2
scp -P 22 192.168.127.123:/etc/rndc.conf /root/
rndc -c /root/rndc.conf status

子域授权

子域授权,在原有的域上再划分出一个小的区域并指定新 DNS 服务器。在这个小的区域中如果有客户端请求解析,则只需要找新的子 DNS 服务器。这样的做的好处可以减轻主 DNS 的压力,也有利于管理。这里只做正向区域的子域授权。

以子域 m.study.co. 为例,主 DNS 服务器IP还是之前的 192.168.127.123,子域DNS服务器地址是 192.168.127.130

主 DNS 服务器的配置,要在 /var/named/zone.study.co 添加子域资源记录并修改序列号,重新加载进程完成主从同步

1
2
m       IN      NS      ns1.m.study.co.
ns1.m IN A 192.168.127.130

子域服务器的配置,需要在子域 m.netpas.co. 服务器进行相关配置,启动服务

1
2
3
yum -y install bind bind-utils
cp /etc/named.conf{,.bak}
scp -P 22 192.168.127.123:/etc/named.conf /etc/named.conf

修改 /etc/named.conf 并查看文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
options {
listen-on port 53 { 192.168.127.130; };
recursion yes;
max-cache-ttl 900;
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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { "any"; };

dnssec-enable yes;
dnssec-validation yes;

/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

zone "m.study.co" IN {
type master;
file "zone.m.study.co";
};

创建区域文件 /var/named/zone.m.study.co

1
2
3
touch  /var/named/zone.m.study.co
chown /var/named/zone.m.study.co --reference /etc/named.conf
chmod /var/named/zone.m.study.co --reference /etc/named.conf

写入内容

1
2
3
4
5
6
7
8
9
10
11
$TTL 600
@ IN SOA @ memory.study.co. (
2006103001; Serial at current time
1D ; Refresh after 1 day
1H ; Retry after 1 houre
1M ; Expire after 1 month
1W) ; Minimum TTL of 1 week

@ IN NS ns1
ns1 IN A 192.168.127.130
www IN A 192.168.127.130

启动服务

1
systemctl enable --now named

主 DNS 服务器测试

1
2
dig -t ns @192.168.127.123 m.study.co
dig @192.168.127.123 www.m.study.co

从 DNS 服务器测试

1
2
dig @192.168.127.124 -t ns m.study.co
dig @192.168.127.124 www.m.study.co

子域DNS测试

1
2
dig @192.168.127.130 www.study.co
# 无法获取正常结果,需要向父域转发DNS请求

转发器

在DNS服务器的配置中,如果采用默认的配置,其实效率是较低的,因为默认情况下,我们所有的非权威解析都会被发送到根服务器进行迭代查询。如果采用转发,如将我们的DNS解析请求转发到一些公共DNS服务器上,由于公共DNS服务器上缓存了大量的解析,因此比原始的迭代查询快。全局转发能够实现对非权威解析(已缓存的除外)都转发到特定DNS服务器。

需要用到 forward 配置参数

1
2
3
forward { only | first }
# only 先转发到转发器,如果得不到答案自己不会尝试解析
# first 先转发到转发器,如果得不到答案则向根发起请求

上面子域DNS服务器解析主域的域名无法获取正常结果,需做转发配置。在子域DNS服务器 /etc/named.conf 的全局配置 options 字段加入以下两行

1
2
forward only;
forwarders { 192.168.247.123;192.168.127.124; };

如果仅设置 forwarders,则在无法联系转发器时,就会尝试自己解析,即转发到根服务器迭代查询实现解析(如果配置有根zone)。

如果想服务器在联系不到转发器时不进行多余操作,则可以加上 forward only;;这样如果联系不上转发器时,服务器将只查询权威解析和本地缓存的解析。

区域转发:从BIND9.1开始,引入一个新特新:转发区(forward zone ),及允许查询特定区域时,将其转发到指定DNS服务器上。

子域DNS服务器在修改配置后重启服务,并测试验证

1
dig @192.168.127.130 www.study.co

DNS视图

ACL的应用与配置

/etc/named.conf 的全局配置中,有 allow-query { 192.168.8.0/24; }; 这样的一行定义允许为哪些些客户端进行递归查询。这里只允许了这一个IP段,如果是大型企业或者公网我们需要允许的客户端有上百个IP段时,这里会写很长而且如果在多个地方需要用到,则需写多次,配置麻烦且影响查看。因此引入ACL,可以实现集中定义,所有位置均可引用。ACL类似程序开发中的函数。例如:

1
2
3
4
5
6
7
8
9
10
acl trust {
172.16.100.0/24;
10.35.0.0/24;
192.168.0.0/24;
127.0.0.1;
};
options {
allow-query { trust; }; // 引用上面定义的ACL
……其他配置省略……
};`

视图 view
view 将不同IP地址段发来的查询响应到不同的DNS解析。例如需要对多个不同IP地址段进行配置,就需要明确这些IP地址段,这样View功能才会有效。注意一旦使用view,所有域都必须定义在 view。

智能DNS

智能DNS是域名服务在业界首创的智能解析服务。能自动判断访问者的IP地址并解析出对应的IP地址,使网通用户会访问到网通服务器,电信用户会访问到电信服务器。在 Bind 中可以使用 aclview 实现智能DNS

创建 tel_ip、cnc_ip、cm_ip、crc_ip、edu、other 6个访问控制列表表示不同来源(电信,联通,移动,铁通,教育,其他,默认),以区域 study.co 为例,实现智能DNS

由于IP地址段数量较大,因此在 /var/named/ 目录下创建目录 acl 存放不同来源的IP段。

1
2
3
4
5
6
mkdir -pv /var/named/acl
chown /var/named/acl/ --reference /var/named/
chmod /var/named/acl/ --reference /var/named/
touch /var/named/{tel,cnc,cm,crc,edu,other}_ip.acl
chown -R /var/named/acl/* --reference=/etc/named.conf
chmod -R /var/named/acl/* --reference=/etc/named.conf

/var/named/acl/tel_ip.acl 创建针对电信IP的 acl

1
2
3
4
5
acl tel_ip{
1.0.1.0/24;
1.0.2.0/23;
1.0.8.0/21;
};

/var/named/acl/cnc_ip.acl 创建针对网通IP的 acl

1
2
3
4
5
acl cnc_ip{
1.24.0.0/13;
1.56.0.0/13;
1.188.0.0/14;
};

由于IP量比较大,上面只写了几个地址段仅供参考。实际情况需要写上百条,每个地址段占用一行,以分号结尾

针对这种数量比较大的情况,我们可以在 /etc/named.conf 使用 include 来处理,并添加与之对应的视图配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
options {
listen-on port 53 { 192.168.127.123; };
allow-transfer {192.168.127.124; }; // 允许区域传送的IP地址
recursion yes;
notify yes; // 启用通知从服务器同步功能
max-cache-ttl 900;
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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { "any"; };

dnssec-enable yes;
dnssec-validation yes;

/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

view "tel" {
match-clients { tel_ip;};
zone "study.info" IN {
type master;
file "zone.study.info";
};
zone "study.co" IN {
type master;
file "zone.study.co";
};
zone "127.168.192.in-addr.arpa" IN {
type master;
file "zone.192.168.127";
};
};

view "cnc" {
match-clients { cnc_ip;};
zone "study.info" IN {
type master;
file "zone.study.info";
};
zone "study.co" IN {
type master;
file "zone.study.co";
};
zone "127.168.192.in-addr.arpa" IN {
type master;
file "zone.192.168.127";
};
};

# Use with the following in named.conf, adjusting the allow list as needed:
key "rndc-key" {
algorithm hmac-md5;
secret "je+uT0BxuoBgYVic//p6Rg==";
};

controls {
inet 192.168.127.123 port 953
allow { any; } keys { "rndc-key"; };
};
# End of named.conf

include "/var/named/acl/tel_ip.acl";
include "/var/named/acl/cnc_ip.acl";
include "/var/named/acl/cm_ip.acl";
include "/var/named/acl/crc_ip.acl";
include "/var/named/acl/edu_ip.acl";
include "/var/named/acl/other_ip.acl";

/var/named 下分别创建对应的区域文件(可拷贝),并将相关记录改成对应运营商的IP就完成了智能解析。

修改好配置重启服务后,使用 dig 命令在不同环境下进行测试,来验证效果。

当然,如果你的 zone 比较多的话,也可以像 acl 的处理方法一样分类并单独写一个文件,最后使用 include 配置在 /etc/named.conf 中即可

日志

Logging

bind中我们可以通过配置logging来记录日志信息,以便以后对服务器的分析及问题的跟踪。logging语句为域名服务器设定了一个多样性的logging选项。它的channel短语对应于输出方式、格式选项和分类级别,它的名称可以与category短语一起定义多样的日志信息。如果打开日志功能可能会降低dns的性能,因此不建议开启日志功能。

开启日志功能

只需要在option里面加入一个选项即可。man named.conf

1
2
3
4
5
options {

directory "/var/named";
querylog yes;
};

之后查看 /var/log/messages 就能看到日志信息;这样会浪费大量的空间。可以使用 catagory 日志系统,帮我们定制需要对哪些行为进行日志检测。

日志系统

bind的日志系统,提供了两个子系统,一个叫做channel,一个叫做category。

1
2
3
4
5
6
7
8
9
catagory: 日志源(指的是产生日志的日志源,比如说有的是跟查询有关的,有的是跟区域传送相关的。)所以catagory可以让我们定义日志来源。
查询
区域传送;
可以通过catagory自定义日志来源;
一个catagory,可以存放到多个位置;一个channel只能存放一个catagory。

channel: 定义日志的日志保存位置;
syslog:系统日志;使用日志级别的概念。/var/log/messages.
file: 自定义保存日志信息的文件。

默认channel,下面是named 提前定义的四个通道,用于指定缺省的日志。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
channel "default_syslog" {
syslog daemon; # 发送给syslog 的daemon facility
severity info; # 只发送此优先级和更高优先级的信息
};
channel "default_debug" {
file "named.run"; # 写入工作目录下的named.run 文件。注意:如果服务器用-f 参数启动,则"named.run"会被stderr 所替换。
severity dynamic; # 按照服务器当前的debug 级别记录日志
};
channel "default_stderr"{
stderr; # 写到stderr
severity info; # 只发送此优先级和更高优先级的信息
};
channel "null" {
null; # 丢弃所有发到此通道的信息
};

default_debug 通道有特殊的性质:只有当服务器的debug级别非0的时候,它才产生输出。一般来说,它会在服务器的工作目录中写入 named.run 文件。因为安全原因,当在命令行选项中使用了 -u 参数后,只有当 named 使用了新的UID后,named.run 文件才会产生,以 root 身份启动和运行的 named 所产生的 debug 信息将会被丢弃。如果用户需要得到这些输出,则必须使用 -g 参数运行服务器,并重新将标准错误定向到一个文件中去。
一旦定义好一个通道,它就不能被重新定义。这样就不能修改内置的通道,但是可以通过把分类指向你已经定义的通道,来修改默认的日志记录。

示例

1
2
3
4
5
6
7
8
9
10
11
logging {
file "log.msgs" version 3 size 10k; # 一旦达到10k,就开始滚动,日志是可以滚动的;
severity dynamic; # 定义日志级别;
};
channel my_syslog {
syslog local0; # 定义syslog里面local0的信息存放到哪里去;
severity info; # 定义local0里面的普通信息放到固定位置去。
};
category xfer-in { my_file; }; # 传入 #将传入日志保存到my_file里面去;
category update { my_syslog; }; # 更新信息
};

日志的设置和定义

1
2
3
4
5
6
7
8
9
10
channel通道:作用主要定义日志输出的方式;在定义通道的语句里有哪些子语句:
通道的名称,即自定义通道的名称,即是什么类别。
输出方式和路径;
输出日志的轮转;即日志1,日志2,日志3...;
输出日志的大小限制;
输出到syslog
定义消息的级别:severity critical |err |warning |notice |info |debug |dynamic
定义类别的输出:print-category yes or no
定义等级的输出:print-severity yes or no
定义时间的输出:print-time yes or no
1
2
3
4
5
6
7
8
9
10
11
category类别:定义了那些数据需要记录,即在日志里输出那些日志内容。哪一类的类别使用哪个或哪几个已经定义好的通道
类别的种类:
default,没有配置的分类使用default的分类日志配置。
general,许多没有分类的内容都在此分类;
database,named使用的,用来存储和缓存的内部数据库信息;
security,接受和拒绝的请求
config配置文件分析和处理
resolver DNA解析;
xfer-in:服务器收到的域传输;
xfer-out:服务器发送的域传输。
queries 请求。
有钱任性,请我吃包辣条
0%