Linux CentOS 8(DNS的配置与管理)



一、DNS相关知识

1.1 DNS简介

DNS
DNS域名系统(英文:Domain Name System)是一个域名系统,是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。DNS协议运行在UDP协议之上,使用端口号53。

域名
域名是一个网站的逻辑地址,比如www.baidu.com,相比IP地址更加方便人类记忆,所以被广泛使用。

域名管理机构
Internet 域名与地址管理机构(ICANN)是为承担域名系统管理,IP地址分配,协议参数配置,以及主服务器系统管理等职能而设立的非盈利机构.现由IANA和其他实体与美国政府约定进行管理。域名分国际域名和国内域名两种,对于国际域名而言,其命名规则是:域名可以由(a-z、A-Z大小写等价)26个英文字母、数字(0-9)以及连接符“-”组成,但是域名的首位必须是字母或数字。对于域名的长度也有一定的限制:国际通用顶级域名长度不得超过26个字符,中国国家顶级域名长度不得超过20个字符。

1.2 DNS的解析原理

目前,因特网的命名方法是层次树状结构的方法。采用这种命名方法,任何一个连接在因特网上的主机或设备,都有一个某一层次结构的名字,即域名(domain name)。域是名字空间中一个可被管理的划分。域可以继续按层次划分为子域,如二级域、三级域等等,如图1所示。

在这里插入图片描述

图1

1.3 DNS解析

递归解析
主机向本地域名服务器的解析,一般都是采用递归解析。如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文。

迭代解析
本地域名服务器向根域名服务器的查询,通常是采用迭代解析。当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询。

域名的解析也分为正向解析和反向解析。正向解析为:将域名解析为IP;反向解析为:将IP解析为域名。

二、DNS服务器部署

DNS服务是由bind程序提供的,所以要实现DNS服务就需要安装bind程序包。

[root@localhost ~]# yum install bind bind-chroot -y  

DNS主程序包
bind-chroot 是DNS的安全包,可以改变默认DNS根目录,将DNS运行在监牢模式。bind-chroot是 bind 的一个功能,使 bind 可以在一个chroot的模式下运行。也就是说,bind 运行时的/(根)目录,并不是系统真正的/(根)目录,只是系统中的一个子目录而已。这样做的目的是为了提高安全性。因为在 chroot 的模式下,bind 可以访问的范围仅限于这个子目录的范围里,无法进一步提升,进入到系统的其他目录中。bind 的默认启动方式就是 chroot 方式。Bind Chroot DNS 服务器的默认“监牢”为 /var/named/chroot

DNS的守护进程叫做named,DNS是以named用户身份来运行,named用户在安装包的时候会在系统中自动创建。

注:CentOS8 安装了 bind-chroot之后,若要使用 named-chroot.service,则需要关闭 named.service。两者只能运行一个。

2.1 不使用chroot模式启动DNS

[root@localhost ~]# systemctl enable --now named  \\启动服务并设置开机自启
[root@localhost ~]# lsof -i :53  \\启动验证

2.2 使用chroot模式DNS

[root@localhost ~]# cp -r /var/named/data /var/named/chroot/var/named/  \\复制对应的文件到chroot根目录
[root@localhost ~]# cp -r /var/named/dynamic /var/named/chroot/var/named/
[root@localhost ~]# cp -p /var/named/named.* /var/named/chroot/var/named/
[root@localhost named]# chown -R named.named *
[root@localhost ~]# systemctl enable --now named-chroot.service  \\启动服务并设置开机自启1

三、DNS配置文件详解

默认情况下,如果不安装bind-chroot这个包,配置文件的路径如下:
配置文件:/etc/named.conf
区域数据库文件:/var/named/
安装了bind-chroot这个用于改变默认DNS配置文件的路径的包,所以相对应的配置文件的路径也发生了变化。
变化如下:
配置文件:/var/named/chroot/etc/named.conf
区域数据库文件:/var/named/chroot/var/named/

3.1 主配文件详解

[root@localhost ~]# vim /var/named/chroot/etc/named.conf
options
{
    listen-on port 53    { 127.0.0.1; };  \\ IPv4监听端口为53,只允许本机连接
    listen-on-v6 port 53    { ::1; };  \\ IPv6监听端口为53,只允许本机连接
    directory         "/var/named";  \\定义工作目录
    dump-file         "data/cache_dump.db";  \\ CACHE文件路径,指定服务器在收到rndc dump命令时,转储数据到文件的路径。默认cache_dump.db
    statistics-file     "data/named_stats.txt";  \\静态文件路径,指定服务器在收到rndc stats命令时,追加统计数据的文件路径。默认named_stats.txt
    memstatistics-file     "data/named_mem_stats.txt";  \\内存静态文件路径,服务器在退出时,将内存统计写到文件的路径。默认named_mem_stats.txt
    secroots-file        "data/named.secroots";  \\在收到rndc secroots指令后,服务器转储安全根的目的文件的路径名。默认named.secroots
    recursing-file        "data/named.recursing";  \\指定服务器在通过rndc recursing命令指定转储当前递归请求到的文件路径。默认named.recursing
     allow-query        { localhost; };  \\指定哪些主机可以查询,可以是any/none
    allow-query-cache    { localhost; };  \\指定允许哪些主机可以对缓存的访问
    recursion yes;  \\开启递归
    dnssec-enable yes;  \\开启DNSSEC在权威或者递归服务器之间信任服务
    dnssec-validation yes;  \\开启DNSSEC验证在递归服务器
    managed-keys-directory "/var/named/dynamic";  \\指定目录,其中保存着跟踪被管理DNSSEC密钥文件。默认为工作目录。
    pid-file "/run/named/named.pid";  \\ PID文件路径
    session-keyfile "/run/named/session.key";  \\ session-keyfile文件路径
};
Logging  \\开启DNS日志记录
{
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "." IN {  \\定义一个根域
        type hint;  \\域类型为hint(根域),还有master(主要域)/slave(辅助域)/forward(转发域)等类型
        file "/var/named/named.ca";  \\区域数据库文件路径
    };
};
    include "/etc/named.rfc1912.zones";  \\包含两个子配置文件
    include "/etc/named.root.key";

3.2 区域数据库文件详解

正向解析

[root@localhost ~]# vim /var/named/named.localhost
$TTL 1D  \\缓存时间
	@         	IN 	  SOA        @ 			   rname.invalid. (
\\解析的域名   类型   授权域    授权域名服务器   管理员邮箱
                 0    ; serial  \\序列号,每次更新该文件系列号都应该变大
                 1D    ; refresh  \\刷新时间, 从域名服务器多长时间查询一个主服务器
                 1H    ; retry  \\重试时间,即当从服务试图在主服务器上查询更时,而连接失败了,则这个值规定了从服务多长时间后再试 
                 1W    ; expire  \\过期时间,从服务器在向主服务更新失败后多长时间后清除对应的记录
                 3H )    ; minimum  \\缓存服务器不能与主服务联系上后多长时间清除相应的记录 
    NS   				@  \\ NS 名称服务器,表示这个主机为域名服务器
    A    		127.0.0.1  \\主机头  	A记录   	IP
    AAAA    		::1  \\解析为IPV6地址

反向解析

[root@localhost ~]# vim /var/named/named.loopback
$TTL 1D
@    IN SOA    @ rname.invalid. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
    NS    		@
    PTR    		localhost  \\ IP   PTR(反向指针)     主机名

四、项目实施

4.1 主DNS

实验要求:
jan16.com域名做解析,解析要求如下:
www 解析为A记录 IP地址为 1.1.1.1,并设置反向解析
news 做别名解析CNAME 解析为 www

DNS服务器配置:

[root@localhost ~]# vim /var/named/chroot/etc/named.conf
options {
    listen-on port 53 { any; };
directory     "/var/named";
allow-query     { any; };
};

zone "jan16.com" IN {
    type master;
    file "jan16.com.zone";
};
zone "1.1.1.in-addr.arpa" IN {
        type master;
        file "1.1.1.zone";
        allow-update { none; };
};
[root@localhost named]# cp -p named.localhost  jan16.com.zone  \\保留源文件的权限和属主的属性复制
[root@localhost ~]# cd /var/named/chroot/var/named/
[root@localhost named]# vim jan16.com.zone
$TTL 1D
jan16.com.       IN SOA  ns1.jan16.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns1.jan16.com.
        A       127.0.0.1
        AAAA    ::1
ns1     A      192.168.159.138  \\此为DNS的IP地址,做正向解析
www     A      1.1.1.1
news    CNAME  www
[root@localhost named]# cp -p named.loopback 1.1.1.zone
[root@localhost named]# vim 1.1.1.zone
$TTL 1D
1.1.1.in-addr.arpa.       IN SOA  ns1.jan16.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns1.jan16.com.
1       PTR     www.jan16.com.

客户端验证:
host采用非交互式解析,
nslookup可以采用交互或非交互式解析
dig显示详细的解析流程,在dig解析中,后面跟上+trace来显示详细解析流程

[root@localhost named]# vim /etc/resolv.conf 
nameserver 192.168.159.138
[root@localhost named]# nslookup www.jan16.com
Server:		192.168.159.138
Address:	192.168.159.138#53
Name:	www.jan16.com
Address: 1.1.1.1
[root@localhost named]# nslookup 1.1.1.1
1.1.1.1.in-addr.arpa	name = www.jan16.com.

4.2 辅助DNS(DNS服务器冗余)

DNS服务器在网络中为全世界的服务器提供了域名解析服务,扮演着至关重要的角色。网络中的某台DNS一旦宕机,就会造成部分域名无法解析,用户无法顺利访问到对应的服务器。但是我们学习的过程中也发现了,我们的DNS部署在单台服务器上,如果出现单点故障,我们可以通过部署多台相同解析的DNS来解决单点故障,即辅助DNS。这样就算一台DNS服务器出现问题,也不会影响解析服务。

辅助DNS是从主DNS拉取区域数据库文件的,当主DNS解析的域名对应的区域数据库文件发生变化,辅助就会去找主DNS拉取新的区域数据库文件,保证和主的解析一致,而且是自动的不需要人为干预的,确保了主从DNS的区域数据库文件的一致性。

实验要求:
实现辅助DNS的搭建

DNS服务器配置:

[root@localhost ~]# vim /var/named/chroot/etc/named.conf
options {
    listen-on port 53 { any; };
directory     "/var/named";
allow-query     { any; };
};

zone "jan16.com" IN {
    type slave;  \\类型写slave  代表辅助
    file "jan16.com.zone";  
    masters { 192.168.159.138; };  \\设置主DNS IP地址,向该IP的主机去同步数据
};
zone "1.1.1.in-addr.arpa" IN {
    type slave;
    file "1.1.1.zone";
    masters { 192.168.159.138; };
};
[root@localhost ~]# systemctl restart named-chroot
[root@localhost ~]# ll /var/named/chroot/var/named/  \\可以看到复制过来的区域数据库配置文件
total 24
-rw-r--r--. 1 named named  232 Jun 15 09:31 1.1.1.zone
drwxr-x---. 2 named named   23 Jun 15 08:47 data
drwxr-x---. 2 named named   60 Jun 15 09:31 dynamic
-rw-r--r--. 1 named named  376 Jun 15 09:31 jan16.com.zone
-rw-r-----. 1 named named 2253 Jun 15 08:44 named.ca
-rw-r-----. 1 named named  152 May 27 16:49 named.empty
-rw-r-----. 1 named named  152 May 27 16:49 named.localhost
-rw-r-----. 1 named named  168 May 27 16:49 named.loopback
drwxr-x---. 2 root  root     6 Jun 15 09:25 slaves

客户端验证:

[root@localhost ~]# vim /etc/resolv.conf
nameserver 192.168.159.144
[root@localhost ~]# nslookup www.jan16.com
Server:		192.168.159.144
Address:	192.168.159.144#53
Name:	www.jan16.com
Address: 1.1.1.1
[root@localhost ~]# nslookup 1.1.1.1
1.1.1.1.in-addr.arpa	name = www.jan16.com.

4.3 转发DNS

在DNS客户端提交解析申请到转发DNS服务器的时候,该服务器会将请求转发至配置文件中指定的非根DNS服务器进行解析,然后将解析的结果发至客户端并缓存到本地,因此,转发DNS服务器在这种意义上也算一种缓存服务器。并且转发DNS服务器可以选择完全转发或条件转发两种转发方式:

完全转发:所有客户机请求都直接扔给指定的非根DNS服务器进行解析。
条件转发:将某个域的解析申请转发至指定的非根DNS服务器进行解析。

实验要求:
实现DNS完全转发的搭建

DNS服务器配置:

[root@localhost ~]# vim /var/named/chroot/etc/named.conf
options {
    listen-on port 53 { any; };
directory     "/var/named";
allow-query     { any; };
  forward only;  \\递归转发
forwarders { 192.168.159.138; };  \\转发到的DNS服务器IP
};
[root@localhost ~]# systemctl restart named-chroot

客户端验证:

[root@localhost ~]# vim /etc/resolv.conf
nameserver 192.168.159.144
[root@localhost ~]# nslookup www.jan16.com
Server:		192.168.159.144
Address:	192.168.159.144#53
Name:	www.jan16.com
Address: 1.1.1.1
[root@localhost ~]# nslookup 1.1.1.1
1.1.1.1.in-addr.arpa	name = www.jan16.com.

实验要求:
实现DNS条件转发的搭建

DNS服务器配置:

[root@localhost ~]# vim /var/named/chroot/etc/named.conf
options {
    listen-on port 53 { any; };
directory     "/var/named";
allow-query     { any; };
};
zone "jan16.com" IN {  \\需要转发的域
      type forward;
      forward only;
      forwarders { 192.168.159.138; };
};
zone "1.1.1.in-addr.arpa" IN {
        type forward;
        forward only;
        forwarders { 192.168.159.138; };
};
[root@localhost ~]# systemctl restart named-chroot

客户端验证:

[root@localhost ~]# vim /etc/resolv.conf
nameserver 192.168.159.144
[root@localhost ~]# nslookup www.jan16.com
Server:		192.168.159.144
Address:	192.168.159.144#53
Name:	www.jan16.com
Address: 1.1.1.1
[root@localhost ~]# nslookup 1.1.1.1
1.1.1.1.in-addr.arpa	name = www.jan16.com.

4.4 智能DNS

在我们访问WEB的时候,发现有的网站打开的速度非常快,有的网站打开的非常慢,这是为什么呢?原因就是很多公司为了提升用户的体验,在公司的网站上使用了CDN内容加速服务,使用户可以直接在本地城市的服务器上浏览数据。CDN我们可以暂且理解为本地缓存服务器即可,本章不作扩展。那用户是如何准确找到用户所在城市的本地缓存服务器的呢?原因在于很多CDN公司的DNS服务使用了智能解析功能,可以根据用户的源IP判断是属于哪个城市,然后再把本地的缓存服务器解析给用户,用户便可以在本城市的服务器上获取数据了。

智能解析原理:在DNS中植入全世界的IP库以及IP对应的地域,当用户来请求解析时,DNS会根据其源IP来定位他属于哪个区域,然后去找这个区域的 view 视图查询对应的域名的区域数据库文件做解析。从而使得不同地域的用户解析不同。

实验要求:
jan16.com域名做智能解析:
广州的用户解析IP为 1.1.1.1
北京的用户解析IP为 2.2.2.2
其他用户解析为 3.3.3.3

DNS服务器配置:

[root@localhost ~]# vim /var/named/chroot/etc/named.conf
options {
    listen-on port 53 { any; };
directory     "/var/named";
allow-query     { any; };
};
acl gz { 192.168.159.138; };  \\定义IP库,DNS根据IP库判断源IP属于哪个区域
acl bj { 192.168.159.144; };
view gz {  \\根据地域定义视图,将该区域的客户端的解析请求都由该视图中的zone来解析
        match-clients { gz; };
zone "jan16.com" IN {
        type master;
        file "jan16.com.gz.zone";
};
};

view bj {
        match-clients { bj; };
zone "jan16.com" IN {
        type master;
        file "jan16.com.bj.zone";
};
};

view other {
        match-clients { any; };
zone "jan16.com" IN {
        type master;
        file "jan16.com.any.zone";
};
};
/*  \\使用view需要把所有zone都放在view中,所以将其他涉及到zone的都注释
Zone “.” IN {
   Type hint;
File “named.ca”;
};
*/
#include "/etc/named.rfc1912.zones";
[root@localhost named]# cp -p jan16.com.bj jan16.com.gz.zone
[root@localhost named]# cp -p jan16.com.bj jan16.com.bj.zone
[root@localhost named]# cp -p jan16.com.bj jan16.com.any.zone
[root@localhost named]# vim jan16.com.gz.zone
$TTL 1D
jan16.com.       IN SOA  ns1.jan16.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns1.jan16.com.
        A       127.0.0.1
        AAAA    ::1
ns1     A      192.168.159.138
www     A      1.1.1.1
news    CNAME  www
[root@localhost named]# vim jan16.com.bj.zone
$TTL 1D
jan16.com.       IN SOA  ns1.jan16.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns1.jan16.com.
        A       127.0.0.1
        AAAA    ::1
ns1     A      192.168.159.138
www     A      2.2.2.2
news    CNAME  www
[root@localhost named]# vim jan16.com.any.zone
$TTL 1D
jan16.com.       IN SOA  ns1.jan16.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns1.jan16.com.
        A       127.0.0.1
        AAAA    ::1
ns1     A      192.168.159.138
www     A      3.3.3.3
news    CNAME  www

客户端验证:
在IP为192.168.159.138的客户机验证:

[root@localhost ~]# nslookup www.jan16.com
Server:		192.168.159.138
Address:	192.168.159.138#53
Name:	www.jan16.com
Address: 1.1.1.1

在IP为192.168.159.144的客户机验证:

[root@localhost ~]# nslookup www.jan16.com
Server:		192.168.159.138
Address:	192.168.159.138#53
Name:	www.jan16.com
Address: 2.2.2.2

制作成员: 泽明
排版: 裕新
初审: 杨佳佳
复审: 五廿八

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐