首页 > 技术文章 > 16.DNS服务

bestvae 2021-05-11 17:03 原文

1 名字解析介绍和DNS

1.1 DNS是什么

DNS:Domain Name System 域名系统,应用层协议,是互联网的一项服务。主要作用是根据域名查出IP地址,当然也可以通过IP地址查询域名。

1.2 DNS域名层次结构

对于域名其层级结构如下

主机名.次级域名.顶级域.根域名

例如:www.example.com[.root](注意这里最后还有一个.root,它代表根域名,由于.root对于所有域名都一样,所以平时一般会省略),其中com为顶级域名,example为二级域名,www为三级域名。

根域名服务器(Root DNS Server):管理顶级域名服务器返回顶级域名服务器IP,如com、cn

顶级域名服务器:返回二级域IP

1.3 DNS查询过程

DNS查询类型

  • 递归查询:最终结果,负责到底

  • 迭代查询:最好结果,不负责到底

DNS请求过程

Client -->hosts文件 --> Client DNS Service Local Cache --> DNS Server (recursion
递归) --> DNS Server Cache -->DNS iteration(迭代) --> 根--> 顶级域名DNS-->二级域名
DNS… 

这里假设访问www.qq.com

  • 首先会在本地查找host文件中查找,若没有则会去本地DNS缓存中去查找
  • 接着DNS客户端设置使用的DNS服务器,它负责全权处理客户端的DNS查询请求,直到返回最终结果。
  • DNS服务器首先检查自身缓存,如果存在记录则直接返回结果。
  • 如果记录老化或不存在,DNS服务器向根域名服务器发送查询报文"query www.qq.com",根域名服务器返回顶级域.com的顶级域名服务器地址。
  • DNS服务器向 .com域的顶级域名服务器发送查询报文"query www.qq.com",得到二级域qq.com
  • DNS服务器向 .qq.com 域的权威域名服务器发送查询报文"query www.qq.com",得到主机www的A记录,A是address的缩写。存入自身缓存并返回给客户端

1.4 DNS的记录类型

域名与IP之间的对应关系,称为”记录”(record)。根据使用场景,”记录”可以分成不同的类型(type)

常见的DNS记录类型如下:

  • A:IPV4地址记录,传回一个32位的IPv4地址,最常用于映射主机名称到IP地址
  • AAAA:IPV6地址记录,传回一个128位的IPv6地址,最常用于映射主机名称到IP地址
  • SOA:权威记录的起始,指定有关DNS区域的权威性信息,包含主要名称服务器、域名管理员的电邮地址、域名的流水式编号、和几个有关刷新区域的定时器
  • PTR:逆向查询记录(Pointer Record),只用于从IP地址查询域名
  • NS:Name Server,专用于标明当前区域的DNS服务器
  • MX:Mail eXchanger,邮件交换器
  • CNAME :规范名称记录, 一个主机名字的别名:域名系统将会继续尝试查找新的名字。

更多对应列表参看:https://zh.wikipedia.org/wiki/DNS记录类型列表

2 DNS软件bind

DNS服务器软件包括:bind,powerdns,unbound,coredns,其中最为广泛使用的就是bind

官方文档页:https://bind9.readthedocs.io/en/latest/introduction.html

文件定义参照标准:https://tools.ietf.org/html/rfc1035.html

红帽官方配置参考:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/ch-DNS_Servers#s2-dns-introduction-zones

2.1 BIND相关程序包

bind:服务器

bind-utils: 客户端

bind-libs:相关库

bind-chroot: 安全包,将dns相关文件放至 /var/named/chroot/

2.2 BIND包相关文件

使用yum -y install bind查看bind相关文件,这里介绍几个主要文件

[root@centos8 yum.repos.d]# rpm -ql bind
/usr/sbin/named	#BIND主程序
/etc/rc.d/init.d/named	#服务脚本
/usr/lib/systemd/system/named.service	#Unit名称
/etc/named.conf	#主配置文件
/etc/named.rfc1912.zones	#主配置文件
/etc/rndc.key	#主配置文件
/usr/sbin/rndc	#remote name domain controller,默认与bind安装在同一主机,且只能通过127.0.0.1连接named进程,提供辅助性的管理功能;953/tcp
/var/named/ZONE_NAME.ZONE	#解析库文件
注意:
 (1) 一台物理服务器可同时为多个区域提供解析
 (2) 必须要有根区域文件;named.ca
 (3) 应该有两个(如果包括ipv6的,应该更多)实现localhost和本地回环地址的解析库

2.3 配置文件

2.3.1 主配置文件/etc/named.conf

#服务端一般会对option中监听地址进行配置,注释掉listen-on port默认监听所有地址,该文件格式支持C和C++注释风格,所以可以使用//进行注释
[root@centos8 yum.repos.d]#vim /usr/share/doc/bind/sample/etc/named.conf
options
{
        // Put files that named is allowed to write in the data/ directory:
        directory               "/var/named";           // "Working" directory
        dump-file               "data/cache_dump.db";
        statistics-file         "data/named_stats.txt";
        memstatistics-file      "data/named_mem_stats.txt";
        secroots-file           "data/named.secroots";
        recursing-file          "data/named.recursing";


        /*
          Specify listenning interfaces. You can use list of addresses (';' is
          delimiter) or keywords "any"/"none"
        */
        //listen-on port 53     { any; };		允许哪些主机访问
        //	allow-query     { localhost; };	允许哪些主机查询
......

2.3.2 区域声明文件/etc/named.rfc1912.zones

#声明区域zone,也可以在/etc/named.conf中声明。如果安装了 caching-nameserver包,则该文件是默认的配置文件
[root@centos8 yum.repos.d]# vim /usr/share/doc/bind/sample/etc/named.rfc1912.zones
zone "localhost.localdomain" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};

zone "localhost" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};

2.3.3 区域数据库/var/named

#DNS服务器工作目录,可以将区域数据库文件存放于此文件夹中
[root@centos8 yum.repos.d]# ll /var/named/
total 16
drwxrwx---. 2 named named    6 Mar  1 23:20 data
drwxrwx---. 2 named named    6 Mar  1 23:20 dynamic
-rw-r-----. 1 root  named 2253 Mar  1 23:21 named.ca
-rw-r-----. 1 root  named  152 Mar  1 23:21 named.empty
-rw-r-----. 1 root  named  152 Mar  1 23:21 named.localhost	#数据库配置范例文件
-rw-r-----. 1 root  named  168 Mar  1 23:21 named.loopback
drwxrwx---. 2 named named    6 Mar  1 23:20 slaves

#数据库配置文件范例
[root@centos8 yum.repos.d]# vim /usr/share/doc/bind/sample/var/named/named.localhost
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                      0       ; serial   #版本号,从服务器更新时会对比版本号
                                      1D      ; refresh	#从服务器多久同步一次数据
                                      1H      ; retry		#同步失败后多久再次进行同步
                                  1W      ; expire	#从服务器多久无法与主服务器同步后,停止对外提供服务
                                      3H )    ; minimum	#BIND9中代表未查询到结果的域名缓存时间
        NS      @
        A       127.0.0.1
        AAAA    ::1

3 实现主从DNS服务器

3 .1 实验准备

实验前提

关闭SElinux
关闭防火墙
时间同步

环境准备

需要四台主机
DNS主服务器:10.0.0.5
DNS从服务器:10.0.0.4
web服务器:10.0.0.5
DNS客户端:10.0.0.2

3.2 实验步骤

3.2.1 主DNS服务器配置

安装服务端和客户端软件

#bind-utils是DNS客户端工具,这里主要用来检查区域文件语法
[root@centos8 ~]# yum -y install bind bind-utils	

修改配置文件

#主配置文件中只需修改下面两行,以确保监听的不仅仅是本地端口
[root@centos8 ~]# grep -e "listen-on port" -e "allow-query" /etc/named.conf 
//	listen-on port 53 { 127.0.0.1; };
//	allow-query     { localhost; };

#为了保证安全还需设置只允许从服务器进行区域传输
[root@centos8 ~]# grep "allow-transfer" /etc/named.conf 
	allow-transfer { 10.0.0.4;};
	
#在区域配置文件添加区域文件信息
[root@centos8 ~]# vim /etc/named.rfc1912.zones
zone "linux.org" {
   type master;
   file  "linux.org.zone";
};

#接着拷贝模板,编写区域文件信息
注意:要保证named账户对其有读权限,否则服务将无法启动
[root@centos8 ~]# cp -p /var/named/named.localhost /var/named/linux.org.zone
[root@centos8 ~]# cat /var/named/linux.org.zone 
$TTL 1D
@	IN SOA	master rname.invalid. (
					0	; serial
					1D	; refresh
					1H	; retry
					1W	; expire
					3H )	; minimum
	NS	master
	NS	slave
master	A	10.0.0.5
slave	A	10.0.0.4
www     A       10.0.0.3

#检查语法是否正确
[root@centos8 ~]# named-checkconf
[root@centos8 ~]# named-checkzone linux.org /var/named/linux.org.zone
zone linux.org/IN: loaded serial 0
OK

#启动服务
[root@centos8 ~]# systemctl start named

#如果服务已经启动,使用下面命令重新加载配置
[root@centos8 ~]# rndc reload 

3.2.2 从DNS服务器配置

配置方式与主服务器大同小异,只需修改部分配置

安装服务端软件

[root@centos8 ~]# yum -y install bind 

编辑配置文件

[root@centos8 ~]# vim /etc/named.conf
//      listen-on port 53 { 127.0.0.1; };
//      allow-query     { localhost; };
		  allow-transfer { none;};

[root@centos8 ~]# vim /etc/named.rfc1912.zones
zone "linux.org" {
   type slave;
   masters {10.0.0.5;};   
         
   file "slaves/linux.org.slave";
};

#启动服务
[root@centos8 ~]# systemctl start named

#检查是否生成区域数据库文件
[root@centos8 ~]# ls /var/named/slaves/
linux.org.slave

3.2.3 客户端测试主从DNS服务架构

#添加DNS服务器
[root@centos8 ~]# grep "DNS" /etc/sysconfig/network-scripts/ifcfg-ens160 
DNS1=10.0.0.5
DNS2=10.0.0.4

#重新加载网络服务
[root@centos8 ~]# nmcli con reload
[root@centos8 ~]# nmcli con up ens160

#查看是否生效
[root@centos8 ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 10.0.0.5
nameserver 10.0.0.4

#安装DNS客户端
[root@centos8 ~]# yum -y install bind-utils

#使用dig命令测试主从DNS服务器
[root@centos8 ~]# dig www.linux.org 

; <<>> DiG 9.11.20-RedHat-9.11.20-5.el8_3.1 <<>> www.linux.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17919
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: f5289e5596176f597dfd6808609961ab4d370bc53826662a (good)
;; QUESTION SECTION:
;www.linux.org.			IN	A

;; ANSWER SECTION:
www.linux.org.		86400	IN	A	10.0.0.3

;; AUTHORITY SECTION:
linux.org.		86400	IN	NS	master.linux.org.
linux.org.		86400	IN	NS	slave.linux.org.

;; ADDITIONAL SECTION:
master.linux.org.	86400	IN	A	10.0.0.5
slave.linux.org.	86400	IN	A	10.0.0.4

;; Query time: 0 msec
;; SERVER: 10.0.0.5#53(10.0.0.5)
;; WHEN: Mon May 10 16:39:07 CST 2021
;; MSG SIZE  rcvd: 159

#ping命令测试
[root@centos8 ~]# ping www.linux.org
PING www.linux.org (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3 (10.0.0.3): icmp_seq=1 ttl=64 time=0.233 ms
64 bytes from 10.0.0.3 (10.0.0.3): icmp_seq=2 ttl=64 time=0.176 ms
64 bytes from 10.0.0.3 (10.0.0.3): icmp_seq=3 ttl=64 time=0.174 ms

4 智能DNS

4.1 GSLB和CDN

4.1.1 GSLB

GSLB:Global Server Load Balance全局负载均衡

GSLB是对服务器和链路进行综合判断来决定由哪个地点的服务器来提供服务,实现异地服务器群服务 质量的保证

GSLB主要的目的是在整个网络范围内将用户的请求定向到最近的节点(或者区域)

GSLB分为基于DNS实现、基于重定向实现、基于路由协议实现,其中最通用的是基于DNS解析方式

4.2.1 CDN

内容分发网络(英语:Content Delivery Network或Content Distribution Network,缩写:CDN)是指一种透过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。

CDN网络结合了GSLB与缓存技术

工作原理:

  1. 用户向浏览器输入www.a.com这个域名,浏览器第一次发现本地没有dns缓存,则向网站的DNS 服务器请求
  2. 网站的DNS域名解析器设置了CNAME,指向了www.a.tbcdn.com,请求指向了CDN网络中的智能 DNS负载均衡系统
  3. 智能DNS负载均衡系统解析域名,把对用户响应速度最快的IP节点返回给用户;
  4. 用户向该IP节点(CDN服务器)发出请求
  5. 由于是第一次访问,CDN服务器会通过Cache内部专用DNS解析得到此域名的原web站点IP,向原 站点服务器发起请求,并在CDN服务器上缓存内容
  6. 请求结果发给用户

4.2 智能DNS相关技术

4.2.1 bind中ACL

ACL:把一个或多个地址归并为一个集合,并通过一个统一的名称调用

注意:只能先定义后使用;因此一般定义在配置文件中,处于options的前面

范例:

acl beijingnet {
 172.16.0.0/16;
 10.10.10.10;
};

4.3 利用view实现智能DNS

4.3.1 实验准备

实验前提

关闭SElinux
关闭防火墙
时间同步

环境要求:

需要五台主机
DNS主服务器和web服务器1:10.0.0.5/24,172.16.0.8/16
web服务器2:10.0.0.3/24
web服务器3:172.16.0.7/16
DNS客户端1:10.0.0.2/24
DNS客户端2:172.16.0.6/16

4.3.2 实验步骤

1)DNS 服务器的网卡配置

#配置DNS服务器IP地址
[root@centos8 ~]# ip a
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:7f:44:8b brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global dynamic noprefixroute ens160
       valid_lft 1663sec preferred_lft 1663sec
4: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:7f:44:95 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.8/16 brd 172.16.255.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe7f:4495/64 scope link tentative 
       valid_lft forever preferred_lft forever

2)主DNS服务端配置文件实现view

#安装服务端软件包
[root@centos8 ~]# yum -y install bind
#在最前面加入下面内容
acl chongqing {
        10.0.0.0/24
};
acl hunan {
        172.16.0.0/16
};
acl othernet {
        any
};
options {
//      listen-on port 53 { 127.0.0.1; };
//      allow-query     { localhost; };
};

#创建view来响应不同DNS查询请求
view chongqingview {
	match-clients {chongqing;};
	 zone "linux.org" {
        type master;
        file "linux.org.zone.cq";
      };

};
view hunanview {
        match-clients {hunan;};
        zone "linux.org" {
        type master;
        file "linux.org.zone.hn";
      };
	zone "." IN {
        type hint;
        file "named.ca";
      };

};
view otherview {
        match-clients {other;};
        zone "linux.org" {
        type master;
        file "linux.org.zone.other";
      };
	zone "." IN {
        type hint;
        file "named.ca";
      };
};

include "/etc/named.root.key";

#检查语法
[root@centos8 ~]# named-checkconf

3)创建区域数据库文件

[root@centos8 ~]# cat /var/named/linux.org.zone.cq 
$TTL 1D
@   IN SOA master admin.linux.org. (
                   0 ; serial
                   1D ; refresh
                   1H ; retry
                   1W ; expire
                   3H )   ; minimum
           NS   master
master     A   10.0.0.5
websrv     A   10.0.0.3                       
www       CNAME websrv

[root@centos8 ~]# cat /var/named/linux.org.zone.hn 
$TTL 1D
@   IN SOA master admin.linux.org. (
                   0 ; serial
                   1D ; refresh
                   1H ; retry
                   1W ; expire
                   3H )   ; minimum
           NS   master
master     A   10.0.0.5
websrv     A   172.16.0.7                       
www       CNAME websrv

[root@centos8 ~]# cat /var/named/linux.org.zone.other 
$TTL 1D
@   IN SOA master admin.linux.org. (
                   0 ; serial
                   1D ; refresh
                   1H ; retry
                   1W ; expire
                   3H )   ; minimum
           NS   master
master     A   10.0.0.5
websrv     A   127.0.0.1
www       CNAME websrv

#修改所属组
[root@centos8 ~]# chgrp named /var/named/linux.org.zone.cq 
[root@centos8 ~]# chgrp named /var/named/linux.org.zone.hn
[root@centos8 ~]# chgrp named /var/named/linux.org.zone.other

#启动服务
[root@centos8 ~]# systemctl start named

4)实现位于不同区域的三个WEB服务器

#在web服务器1:10.0.0.5/24实现http服务
[root@centos8 ~]# yum -y install httpd
[root@centos8 ~]# echo www.linux.org in Other > /var/www/html/index.html
[root@centos8 ~]# systemctl start httpd
[root@centos8 ~]# curl 10.0.0.5
www.linux.org in Other

#在web服务器2:10.0.0.3/24实现http服务
[root@centos8 yum.repos.d]# yum -y install httpd
[root@centos8 yum.repos.d]# echo www.linux.org in chongqing > /var/www/html/index.html
[root@centos8 yum.repos.d]# systemctl start httpd
[root@centos8 yum.repos.d]# curl 10.0.0.3
www.linux.org in chongqing

#在web服务器3:172.16.0.7/24实现http服务
[root@centos8 yum.repos.d]# yum -y install httpd
[root@centos8 yum.repos.d]# echo www.linux.org in chongqing > /var/www/html/index.html
[root@centos8 yum.repos.d]# systemctl start httpd
[root@centos8 yum.repos.d]# curl 172.16.0.7
www.linux.org in hunan

5) 客户端测试

注意:在测试前需确保DNS指向的是正确的服务器

#DNS客户端1:172.16.0.6/16
[root@centos8 ~]# hostname -I
172.16.0.6
[root@centos8 ~]# curl www.linux.org
www.linux.org in hunan

#DNS客户端2:10.0.0.2/24
[root@centos8 ~]# hostname -I
10.0.0.2 
[root@centos8 ~]# curl www.linux.org
www.linux.org in chongqing

#DNS客户端3:172.16.0.6/16
[root@centos8 ~]# curl www.linux.org
www.linux.org in Other
[root@centos8 ~]# hostname -I
10.0.0.5 172.16.0.8 

推荐阅读