DNS服务

基础理论

背景

我们每天都要在网上访问大量的网站。浏览器上方有导航栏,在里面会有网站的域名以及文件路径。我们去访问一个网站只需要输入域名就可以访问,比如www.baidu.com,而在域名后面跟的是这个服务器下的文件路径,我们访问网站实际是在访问服务器。

现实中我们一般不是访问的一台物理服务器,而是一台虚拟的服务器,这一台虚拟服务器下面有许多的物理服务器作为它的支持,而文件则是存放在多台服务器上。这样可以提高网站的可靠性和安全性,即使有一台物理服务器宕机了我们的网站也不会因此受到影响。

计算机不能直接识别域名,计算机它只认IP地址。每个网站下的服务器都有一个IP地址用来通信。但是世界上的网站那么多,如果我们没有域名全靠输入IP地址去访问,我们哪能记住那么多的网站。于是我们为了方便我们记忆和使用,创造了DNS。

实现

DNS 是 Domain Name System 的缩写,即域名系统。DNS做的工作是把IP和域名的映射关系存起来。当我们去解析域名的时候DNS服务器会告诉我们这个域名对应的IP是什么。当然也有反向的域名解析,把IP解析为域名。

在整个互联网世界中,域名的数量相当庞大。靠一台域名服务器无法完成这个互联网上所有主机的映射。在实际中,DNS使用了大量的域名服务器,所有这些服务器形成了一个有层次结构的分布式数据库。这也是分布式数据库在实际应用中的一个精彩范例。

DNS的查询方式

本地查询

在本地主机上查询DNS记录。

递归查询

主机向DNS服务器发送查询请求,DNS服务器收到请求后如果本地没有该DNS记录则DNS服务器会向上一级DNS服务器发送查询请求以此类推,直到查询到一个准确的结果,这时主机第一次访问的DNS服务器会回复主机结果。

迭代查询

主机向DNS服务器发送查询请求,DNS服务器收到请求后如果本地没有该DNS记录则DNS服务器会回复主机上一级服务器的IP地址,由主机自己去找上一级服务器查询。直到主机查询到一个准确的结果为止。

递归查询+迭代查询

使用递归查询时,主机只需要发送一个请求,其他的事全部交给服务器来完成。速度快,但对服务器有负担。

使用迭代查询时,主机会向每一个查询的服务器发送请求。速度慢,但对服务器负担低。

现实中我们使用的查询方式是递归查询+迭代查询,在本地查询时使用递归查询,主机向本地DNS服务器发送请求。本地DNS服务器向根域名服务器进行迭代查询,最后由本地DNS服务器回复主机。

DNS端口

正向解析:通过域名解析IP地址

反向解析:通过IP地址查找对应的域名

TCP的53端口用于连接DNS服务器

UDP的53端口用于解析DNS

CentOS7.6配置DNS服务

基础DNS配置

下载bind服务

1
2
3
4
5
6
7
[root@appsrv ~]# yum install -y bind bind-chroot

bind是DNS服务的软件包
bind-chroot是bind的一个功能,chroot的意思是监狱,会让bind运行时的/(根)目录
不是系统的/(根)目录,只是系统的一个子目录;
限制bind的访问权限只在这个子目录下,去不了其他的系统目录,从而保证系统安全;
bind的默认启动方式就是bind-chroot模式;

进入bind配置文件进行修改

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
[root@appsrv ~]# vim /etc/named.conf 

options {
listen-on port 53 { any; }; //监听端口
listen-on-v6 port 53 { ::1; }; //ipv6监听端口
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; }; //允许查询的主机
recursion yes;
forwarders { 81.6.63.100; }; //配置区域转发
version "[unknow]"; //配置bind版本不可见

dnssec-enable yes;
dnssec-validation yes;

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

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

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

logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};

#zone "." IN { //正向查找区域".",这里面放的是根域服务器的解析
# type hint;
# file "named.ca";
#};

//根域查询影响实验,所以注释掉了;


#include "/etc/named.rfc1912.zones"; //默认区域块文件
#include "/etc/named.root.key";
include "/etc/named.chinaskills.cn.zones"; //自己写一个区域块文件

//如果是第一次写推荐先去看看默认区域块文件,里面有配置案例;

进入区域块配置文件配置区域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@appsrv ~]# vim /etc/named.chinaskills.cn.zones

zone "chinaskills.cn" IN { //正向区域配置
type master; //区域类型
file "chinaskills.cn"; //区域配置文件路径
//(默认放/var/named/下,/etc/named.conf文件可修改路径)
allow-update { none; }; //允许更新,默认none(无)
//静态DNS服务器的话可以不用写这句了;
};

zone "100.168.192.in-addr.arpa" IN { //反向区域配置
type master;
file "192.168.100.arpa";
allow-update { none; };
};

接下来去配置区域文件

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
[root@appsrv ~]# cd /var/named/
[root@appsrv named]# ls
chroot data dynamic named.ca named.empty named.localhost named.loopback slaves

//里面有许多默认的配置文件,一般我们只关注named.localhost和named.loopback就好了
//named.localhost是正向区域的配置模板
//named.loopback是正向区域的配置模板

[root@appsrv named]# cp -a named.localhost chinaskills.cn
[root@appsrv named]# cp -a named.loopback 192.168.100.arpa
//-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。
//这里在拷贝时加-a参数是必须的,原因如下:
[root@appsrv named]# ll
total 24
-rw-r-----. 1 root named 168 Dec 15 2009 192.168.100.arpa
-rw-r-----. 1 root named 152 Jun 21 2007 chinaskills.cn
drwxr-x---. 7 root named 61 Dec 28 11:24 chroot
drwxrwx---. 2 named named 6 Oct 13 2020 data
drwxrwx---. 2 named named 6 Oct 13 2020 dynamic
-rw-r-----. 1 root named 2253 Apr 5 2018 named.ca
-rw-r-----. 1 root named 152 Dec 15 2009 named.empty
-rw-r-----. 1 root named 152 Jun 21 2007 named.localhost
-rw-r-----. 1 root named 168 Dec 15 2009 named.loopback
drwxrwx---. 2 named named 6 Oct 13 2020 slaves

//可以看到named.localhost和named.loopback的所属组为named且具有读权限,
//如果没有这个属性,named服务将无法启动

进入配置文件

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
[root@appsrv named]# vim chinaskills.cn

$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
//////////////////////////////////////////////////////////////////

@ 表示区域块文件中的"chinaskills.cn"表示域名

NS 解析服务器记录。用来表明由哪台服务器对该域名进行解析。
这里的NS记录只对子域名生效。
例如用户希望由12.34.56.78这台服务器解析news.mydomain.com,
则需要设置news.mydomain.com的NS记录。
“优先级”中的数字越小表示级别越高;

A (Address) 记录是用来指定主机名(或域名)对应的IP地址记录。
又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,
从而实现通过域名找到服务器。

MX ( Mail exchanger )邮件路由记录。
用于将以该域名为结尾的电子邮件指向对应的邮件服务器以进行处理。
如:用户所用的邮件是以域名mydomain.com为结尾的,
则需要在管理界面中添加该域名的MX记录来处理所有以@mydomain.com结尾的邮件

MX记录可以通过设置优先级实现主辅服务器设置,
“优先级”中的数字越小表示级别越高。
也可以使用相同优先级达到负载均衡的目的

了解更多的DNS记录,可以看这篇文章,写得很详细

[DNS域名解析,以及A、AAAA、CNAME、MX、NS、TXT、SRV、SOA、PTR说明_dns soa-CSDN博客](https://blog.csdn.net/zzhongcy/article/details/130644687?ops_request_misc=%7B%22request%5Fid%22%3A%22170373884716800180681789%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=170373884716800180681789&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-130644687-null-null.142^v99^pc_search_result_base7&utm_term=dns NS&spm=1018.2226.3001.4187)

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
[root@appsrv named]# vim chinaskills.cn
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 192.168.100.100
www A 192.168.100.100
download A 192.168.100.100
mail A 192.168.100.100
@ MX 10 mail

[root@appsrv named]# vim 192.168.100.arpa
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 192.168.100.100
100 PTR www.chinaskills.cn.
100 PTR download.chinaskills.cn.
100 PTR mail.chinaskills.cn.

接下来验证一下,重启bind服务,关闭防火墙和selinux。

1
2
3
4
5
6
7
[root@appsrv ~]# systemctl restart named
[root@appsrv ~]# nslookup chinaskills.cn
Server: 192.168.100.100
Address: 192.168.100.100#53

Name: chinaskills.cn
Address: 192.168.100.100

DNS配置分离解析

DNS分离解析,分离解析的意思是,解析域名时根据不同主机会解析出不通的IP地址来实现分离的功能。比如内网用户解析chinaskills.cn是内网IP,外网用户解析chinaskills.cn是公网IP,这个公网IP可以映射到内网的NS服务器上,从而完成对外网用户的服务器隐藏。

我们要在DNS服务器上实现这个功能也非常的简单,下面是配置。我们要先去区域块文件中进行配置。

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
[root@appsrv ~]# vim /etc/named.chinaskills.cn.zones 

zone "chinaskills.cn" IN {
# type master;
# file "chinaskills.cn";
#};


#zone "100.168.192.in-addr.arpa" IN {
# type master;
# file "192.168.100.arpa";
#};

//这些是之前写的,注释掉

view "lan" { //定义一个分离区域"lan"
match-clients { 192.168.0.0/16; }; //匹配解析这个区域的主机

zone "chinaskills.cn" IN {
type master;
file "chinaskills.cn.lan";
};


zone "100.168.192.in-addr.arpa" IN {
type master;
file "192.168.100.arpa.lan";
};

};

view "wan" { //定义一个分离区域"wan"
match-clients { 81.6.63.0/24; };

zone "chinaskills.cn" IN {
type master;
file "chinaskills.cn.wan";
};


zone "100.168.192.in-addr.arpa" IN {
type master;
file "192.168.100.arpa.wan";
};

};

接下来去配置区域文件

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
[root@appsrv ~]# cd /var/named/
[root@appsrv named]# cp -a chinaskills.cn chinaskills.cn.lan
[root@appsrv named]# cp -a chinaskills.cn chinaskills.cn.wan
[root@appsrv named]# cp -a 192.168.100.arpa 192.168.100.arpa.lan
[root@appsrv named]# cp -a 192.168.100.arpa 192.168.100.arpa.wan

//这里由于源文件内配置的就是内网DNS配置,就不再去配置了
//接下来就去改外网DNS配置文件

[root@appsrv named]# vim chinaskills.cn.wan
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 81.6.63.254
www A 81.6.63.254
download A 81.6.63.254
mail A 81.6.63.254
@ MX 10 mail

[root@appsrv named]# vim 192.168.100.arpa.wan
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS chinaskills.cn.
A 81.6.63.254
254 PTR www.chinaskills.cn.
254 PTR download.chinaskills.cn.
254 PTR mail.chinaskills.cn.

接下来验证一下,重启bind服务,关闭防火墙和selinux。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@insidecli ~]# host -t MX chinaskills.cn 192.168.100.100
Using domain server:
Name: 192.168.100.100
Address: 192.168.100.100#53
Aliases:

chinaskills.cn mail is handled by 10 mail.chinaskills.cn.

[root@insidecli ~]# nslookup -q=txt -class=CHAOS version.bind 192.168.100.100
Server: 192.168.100.100
Address: 192.168.100.100#53

version.bind text = "[unknow]"