名字解析/DNS服务

DNS服务

为什么要使用DNS服务?DNS服务是什么?
DNS服务的工作原理
DNS服务的实现
实验1:主DNS
实验2:从DNS
实验3:反向区域服务器
实验4:子域的服务器
实验5:转发服务器
实验6:智能DNS
实验7:综合实验1,2,3,4,5,6一起实现
DNS故障排除
DNS相关的命令

(壹)DNS服务简介

(一)为什么使用DNS服务器?

如需要访问一台主机,在知道对方的ip地址时可以直接对其主机进行访问(只涉及DNS忽略网络),但是由于通过ip地址访问,互联网或局域网主机众多,对于人类来说记忆对应主机的ip地址,应该是相当头疼的一件事。为方便我们记忆,就给服务器赋予一些便于记忆的名字。这些名称就是平时访问的例如:www.baidu.com称为FQDN。FQDN便于我们记忆,但是计算机网络通信则必须将FQDN转换为对应的ip地址才能在网络中通信。而将FQDN解析成IP地址的过程依靠于名字解析,名字解析就是将FQDN解析为IP地址。反向解析则为将IP地址解析为FQDN。

上面其中涉及的专业术语

  • FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。(通过符号".")
  示例:主机名为:server,域名为:company.com  
==> FQDN= server.company.com 
==> FQDN= 主机名 + 域名 (或者更多的时候主机名是个别名)
==> FQDN: 全称域名是主机名的一种完全形式。
    ====> 域:一般代表的是一个组织或者一个公司....
          在同一组织下域后缀是相同的。
    ====> 主机名:是用来区分同一组织的不同主机的。

(二)名字解析的具体实现

1)最简单的实现名字解析的方式:在文本文件中手工的将IP地址和对应的FQDN输入。eg:/etc/hosts文件

   文件格式: IP FQDN(FQDN可以为多个)
=  ~]# cat /etc/hosts
=  127.0.0.1   localhost...

其中/etc/hosts文件主要是修改方便,但是不便于管理众多的主机。/etc/hosts文件适用于测试环境或者主机数目较少的环境。

2)名字解析的实现方式2:DNS(Domain Name System,域名系统)域名和IP地址相互映射的一个分布式数据库

  在linux主机上hosts和DNS名字解析的优先级:
=   /etc/nsswitch.conf文件中的下面这一行定义了名字解析的顺序
=   hosts:      files dns myhostname(一般不会修改)
=       files表示/etc/hosts文件  dns... 
=       在前面优先级高

(贰)DNS服务的工作原理

FQDN的分层结构

基于FQDN的分层结构实现DNS。
名字解析/DNS服务_第1张图片

  • 根服务器:13个ip地址,一个ip地址还可以有多个server,保障根服务器。

  • (ipv4)根服务器分布:10个ip在美国,2个ip在欧洲(荷兰和瑞典),1个ip在亚洲(日本)。

  • (ipv6)25个根服务器ip

  • 所有的dns默认均知道根 dns 服务器,因为首次dns解析过程一般都经过根。

  • 一级域名:Top Level Domain: tld
    三类:组织域、国家域(.cn, .ca, .hk, .tw)、反向域

  • 二级域名,三级域名,最多127级域名。

  • ICANN(The Internet Corporation for Assigned Names and Numbers) 互联网名称与数字地址分配机构,负责在全球范围内对互联网通用顶级域名(gTLD)以及国家和地区顶级域名(ccTLD)系统的管理、以及根服务器系统 的管理

DNS域名解析过程

名字解析/DNS服务_第2张图片

  • 递归查询:返回的最终结果ip查询。

  • 迭代查询:返回的不是最终结果的ip,返回的是让你问别的dns服务器。

企业内部需要搭建DNS服务器的原因

(1)作为局域网访问外网的dns出口,一定程度上可节约网络带宽。

(2)企业内部主机众多(局域网主机),通过ip地址访问也一样难以记忆。

(3)注意企业内部dns服务器的资源记录比较重要。涉及到企业内部主机的搭建的结构。

(4)涉及到主机ip地址改变时,但是访问是通过FQDN访问的,因此不会有影响。即ip地址规划不受影响。

DNS解析涉及的概念

(1)DNS查询类型:

  • 递归查询
  • 迭代查询

(2)名称服务器:域内负责解析本域内的名称的主机

  • 根服务器:13组服务器

(3)解析类型:

  • FQDN --> IP 正向解析
  • IP --> FQDN 反向解析
  • 注意正反向解析是两个不同的名称空间,是两棵不同的解析树
  • 根域下具有独立的反向域。

DNS服务器类型

(1)主DNS服务器

  • 管理和维护所负责解析的域内解析库的服务器

(2)从DNS服务器

  • 从主服务器或从服务器“复制”(区域传输)解析库副本

  • 序列号(serial):解析库版本号,主服务器解析库变化时,其序列递增

  • 刷新时间间隔(refresh):从服务器从主服务器请求同步解析的时间间隔

  • 重试时间间隔(retry):从服务器请求同步失败时,再次尝试时间间隔

  • 过期时长(expire):从服务器联系不到主服务器时,多久后停止服务

  • “通知”机制:主服务器解析库发生变化时,会主动通知从服务器

(2-1)区域传输:

  • 完全传输:传送整个解析库
  • 增量传输:传递解析库变化的那部分内容

(3)缓存DNS服务器(转发器)

资源记录

(1)资源记录定义的格式:

  • 语法:name [TTL] IN rr_type value
(1)name
定义哪个域,哪个名称等等
    例如:XXX.net. 域
      www.XXX.net. 主机
    注意:如果写完整格式必须.结尾,否则会自动在其后补充@内容
    @表示当前定义的域。 在zone " " 中定义的当前定义的区域。

(2)TTL
TTL 此处的TTL表示缓存时长 <==> dns server 对于查询结果的缓存时长
  TTL默认以秒为单位
  定义默认值:
  $TTL 1D

(3)IN <相当于固定值>
IN:表示internet 指明dns用来做名字解析
    当SOA记录中写明IN时,后续记录可以省略IN不写,表示承前
      在资源记录中不写时表示承前即与前面对应的项内容相同

(4)rr_type
A,SOA,AAA,NS,PTR,CNAME......

(5)value
rr_type  对应的值

  • TTL可从全局继承 (因为每行均写TTL,可以在开始定义一个默认TTL)

  • @可用于引用当前区域的名字

  • IN 在SOA中写完之后,后面的记录也可省略不写

  • DNS轮询:同一个名字对应多个记录定义不同的ip

  • 同一个ip也可以定义多个不同的名称,然后通过不同的名字可以访问至同一主机

(2)区域解析库:由众多RR组成

  • 资源记录:Resource Record, RR
  • 记录类型:A, AAAA, PTR, SOA, NS, CNAME, MX

(2-1)SOA:起始授权记录

  • SOA:Start Of Authority
  • 一个区域解析库有且仅有一个SOA记录
  • 必须位于解析库的第一条记录
SOA 记录:
  SOA value: 有多部分组成
    (1) 当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字;
    (2) 当前区域管理员的邮箱地址;但地址中不能使用@符号,一般用.替换
    (3) 主从服务区域传输相关定义以及否定的答案的统一的TTL

例如:
# cat named.localhost  (/var/named/named.localhost)
$TTL 1D
@	IN SOA	@ rname.invalid. (
					0	; serial (版本号==主服务器数据库变化的唯一标志10位限制)
					1D	; refresh  (数据库同步时间间隔)
					1H	; retry    (同步失败时重试同步时间))
					1W	; expire   (过期时间:表示若从不能与主同步时,多长时间就停止对外提供服务)
					3H )	; minimum(错误记录的缓存时长)
@ 表示此资源记录管理的哪个域 ==> 即当前域或者说本域
; 表示注释

  SOA记录value的组成:
    ①dns的名称
    ②当前域管理员的邮箱
    ③复制相关的信息==>上面示例中()中的值==>详细介绍在示例

(2-2)A:IPv4地址

  • A:internet Address
  • 一个名称至少对应一个A记录
  • 作用:FQDN -->Ip
  • 避免用户写错名称时给错误答案,可通过泛域名解析进行解析至某特定地址
* IN A ipaddr

(2-3)AAAA:IPv6地址

  • 作用:FQDN -->Ip

(2-4)PTR:

  • PoinTeR,IP --> FQDN
  • name: IP,有特定格式,
    ①把IP地址反过来写,1.2.3.4,要写作4.3.2.1
    ②有特定后缀:in-addr.arpa.
    ==> 所以完整写法为:4.3.2.1.in-addr.arpa.

(2-5)NS:专用于标明当前区域的DNS服务器

  • NS:Name Server
  • 注意:一个区域可以有多个NS记录
  • 对NS记录而言,任何一个ns记录后面的服务器名字,都应该在后续有一个A记录

(2-6)CNAME:别名记录

  • CNAME : Canonical Name
  • name: 别名的FQDN
  • value: 真正名字的FQDN
  • 别名记录很常见,可以使得多个名称访问同一主机

(2-7)MX:邮件交换器

  • MX:Mail eXchanger
  • 对MX记录而言,任何一个MX记录后面的服务器名字,都应该在后续有一个A记录
  • 描述当前域谁是邮件服务器
  例如:
     (10表示邮件服务器的优先级,值越小优先级越高)
@    MX 10 mailserver1
     MX 20 mailserver2

mailserver1 A 192.168.38.101
mailserver2 A 192.168.38.102
      ;对域发送邮件怎么收?查询MX记录,发送至对应的邮件服务器

(2-8)TXT:对域名进行标识和说明的一种方式,一般做验证记录时会使用此项

例如:SPF(反垃圾邮件)记录,https验证等使用TXT

DNS的实现

(1)DNS服务器软件

  • bind:
  • powerdns: web界面 (依赖httpd php MySQL)
  • unbound

(2)BIND 此处主要介绍

  • bind:软件包bind
  • bind-libs:相关库
  • bind-utils:客户端
  • bind-chroot:/var/named/chroot/
  • bind的程序名:named

(3)bind包解析

  bind包解析

# rpm -ql bind
  /usr/sbin/named bind主程序
      主程序启动监听端口:tcp/53与udp/53
  /etc/named.conf  主要配置文件
  /var/named  数据库文件,存放ip和名称对应关系
  /var/named/slaves 从服务器同步主服务器的数据库文件存放路径
      centos7开始,同步的数据库文件为二进制文件,不是文本文件
  /etc/named.rfc1912.zones  --
  /usr/lib/systemd/system/named.service  sever文件,启动服务 

1)安装后dns功能简介:
# systemctl start named  启动服务

# ss -tnul 53端口处于监听状态
    但是默认未做配置时,监听的是127.0.0.1(本机)的53端口

# lsof -i :53 查看53端口由谁监听

启动服务之后:
# cat /etc/resolv.conf 查看当前的dns服务
  ameserver 180.76.76.76 (目前本机是DNS服务器,可以考虑将dns指向本机)

# cat /etc/resolv.conf 更改之后
  nameserver 127.0.0.1

# ping www.baidu.com  (是否能将此解析为ip?)
  所有DNS服务默认均知道根服务器在哪

# cat /var/named/named.ca 根记录的数据库文件 
    a.root-servers.net.	3600000	IN	A	198.41.0.4
    abcdefghijklm .....

==> 因此默认安装bind后,此主机可访问互联网
2)进程分析
# systemctl start named  启动服务
# ps aux
  named .... /usr/sbin/named -u named -c /etc/named.conf

发现named进程是以named用户的身份运行的

# pstree -p | grep name  进程树查看 
           |-named(7440)-+-{named}(7441)
           |             |-{named}(7442)
           |             |-{named}(7443)
           |             `-{named}(7444)
  named进程以多线程的方式提供服务

# 查看named的账户 
#  getent passwd named
  named:x:25:25:Named:/var/named:/bin/false
    /bin/false可理解为/bin/nologin (服务账户的bash类型都行)

# rpm -q --scripts bind  (named账户是安装bind程序时创建的)
    preinstall scriptlet (using /bin/sh):(安装前脚本)
    ....
    意味着编译安装bind时,首先需要创建named用户!!!
3)/etc/named.conf  主要配置文件的结构介绍
配置文件帮助:
# man  [5] named.conf

  options{   }; 选项信息语句块
  logging {  }; 日志信息语句块
  zone "." IN { }; 区域信息/区域信息就是将数据库文件关联至named程序上

  include "/etc/named.rfc1912.zones"; 专门存放区域信息块的文件
    因为主配置文件中定义有其他信息,如果区域数据块信息较多,考虑单独文件存放

注意:/etc/named.conf 文件中每语句均以分号结尾; (与c语言语法相似)

options语句块:
  listen-on port 53 { 127.0.0.1; }; 
      //监听的主机和端口

  allow-query     { localhost; }; 
    允许查询的主机

  allow-transfer { [slave-ip|none];}; 安全策略
    允许谁从当前dns server抓取数据库信息,主只允许从,从谁也不能允许

allow-query {}: 允许查询的主机;白名单 
allow-transfer {}:允许区域传送的主机;白名单 
allow-recursion {}: 允许递归的主机,建议全局使用 
allow-update {}: 允许更新区域数据库中的内容

zone语句块:
  allow-update { none; }; 
       是否允许别的主机更改区域库文件,一般和默认都是不要允许。
  如果允许:如:allow-update { 192.168.38.66; };
      则192.168.38.66主机可以使用nsupdate远程向区域库文件中加管理资源记录。

(叁)实验1:主DNS

(1)实现的结构框图:
名字解析/DNS服务_第3张图片

(2)实现步骤:

  • 第一步:首先在192.168.38.17(A主机)上配置dns server
1)
# yum install bind
# systemctl start named
2)配置dns server的数据库文件

  存放目录/var/named/ 创建文件时注意文件属性
# ll named.localhost 
-rw-r----- 1 root named 152 Jun 21  2007 named.localhost
     
  可以选择保存权限复制:然后在文件上进行相应的修改
# cp -p named.localhost XXX.net.zone

  然后创建相应的资源记录
# vim XXX.net.zone

$TTL 1D
XXX.net.  IN SOA    ns1 admin.XXX.net. (
             20190910   ; serial  
                    1D  ; refresh
                    1H  ; retry
                    1W  ; expire
                    3H     ; minimum
)
    NS  ns1
ns1 A 192.168.38.17

websrv A 2.2.2.2 <测试使用,使其能返回对应IP即可>
www CNAME websr  <定义一个www的别名> 
    最终在client ==> dig www.XXX.net 会返回2.2.2.2这个ip
一个相对更齐全一点的资源记录:
$TTL 1D

XXX.net. IN SOA  ns1 admin.magedu.net. (
              20190910  ; serial
                    1D  ; refresh
                    1H  ; retry
                    1W  ; expire
                    3H  ; minimum
)
    NS  ns1
    NS  ns2

ns1 A 192.168.38.17
ns2 A 192.168.38.27

webserver A 192.168.38.16
webserver A 192.168.38.37
    ;dns 实现负载均衡
    ;一个webserver对应多个ip

@   A 192.168.38.17   ;当用户直接键入域名时,dns给予解析
    A 192.168.38.27
*   A 192.168.38.17   ;当用户域名前面键入任意,域名对,给予解析

www CNAME webserver

@    MX 10 mailserver1
     MX 20 mailserver2

mailserver1 A 192.168.38.101
mailserver2 A 192.168.38.102
3)修改配置文件

# 修改/etc/named.conf 配置文件
    //  listen-on port 53 { 127.0.0.1; };
    //  allow-query     { localhost; };
    将监听端口的地址打开和允许其他主机咨询  ==> 即对外提供服务

# 在/etc/named.rfc1912.zones文件中添加区域信息(刚才配置的数据库)
    将上面的区域库文文件和dns server关联起来,使用zone定义
    zone "XXX.net" IN {
    type master;
    file "XXX.net.zone";
    };
4) 重启服务生效
  • 第二步:将192.168.38.16(B主机)主机的dns指向192.168.38.17
#cat /etc/resolv.conf
  nameserver 192.168.38.17
  • dns只复制名字解析

  • eg:ping www.baidu.com dns只是将www.baidu.com解析为对应的ip,ping 的是dns解析的ip但是至于能否ping通,不归dns管理。

  • 第三步:在192.168.38.16(B主机)测试

1)在B主机测试:返回的答案是否是权威答案?

#nslookup www.XXX.com
  Non-authoritative answer: (非权威的答案)
    说明当前指向的dns服务器返回的结果是通过询问别的dns得到的
    即当前指向的dns不是查询主机的权威dns服务器

    ===> 权威答案时没有Non-authoritative answer: 这样的提示
  Address:	140.205.81.11#53  

#dig www.XXX.com
  flags: qr rd ra; (flags中没有aa说明非权威答案)
  ===> flags: qr aa rd; (flags中有aa权威答案)
2)测试dns server提供服务时使用的是udp/53?还是tcp/53?
    使用iptables -A INPUT -p udp --dport 53 -j REJECT 禁用udp/53
    此时B主机进行名字解析失败

    使用iptables -A INPUT -p tcp --dport 53 -j REJECT 禁用udp/53
    此时B主机仍能进行名字解析

==>说明dns server提供名字解析时,使用的是udp/53
3) 在B主机上测试自己刚建立的记录是否有效:
#dig www.XXX.net
  当前指向的dns server中是www.XXX.net的权威服务器,flags中有aa标志

#host www.XXX.net
  www.XXX.net is an alias for websrv.XXX.net.
  websrv.XXX.net has address 2.2.2.2
配置成功,dns server可以提供解析 

(肆)实验2:从DNS

(1) 主从同步:
名字解析/DNS服务_第4张图片

从 DNS server 避免 DNS server出现单点失败,导致访问故障。
  • 注意:主从同步时既使用了53/tcp 又使用了53/udp

(2)从服务器实现步骤

  • 第一步:dns slave server(主机B:192.168.38.27)的配置
1)安装bind 服务

2)在slave server上需要指明:
      指明为slave ;
      指明谁是masters;
      创建哪个域的slave;
      同步的数据放哪。
slave server数据库文件一般放置/var/named/slaves/目录下
centos7上开始从服务器的数据库为二进制文件,不是文本
  因为从服务器的数据是不可更改的,是同步过来的。

# vim /etc/named.rfc1912.zones
zone "XXX.net" IN {
        type slave;
        masters { 192.168.38.17; };
        file "slaves/XXX.net.slaves.zone";
};
      !!! 注意末尾的分号和masters

#  named-checkconf ==> 检查配置文件是否有误

3)编辑slave server的主配置文件 
# vim /etc/named.conf
    //      listen-on port 53 { 127.0.0.1; };
    //      allow-query     { localhost; };
==> 允许对外提供服务

若第二步不设置:slave server只能自己去从master server拉数据
    即重启systemctl restart named / rndc reload 
    然后数据进行同步。
  • 第二步:dns master server(主机A:192.168.38.17)的配置
dns master server上需要指明谁是它的slave server
    因为要实现master上数据发生变化,需要往它的slave主机推送数据
1)修改自己主机上的区域数据库文件
vim  /var/named/XXX.net.zone
    NS  ns2
ns2 A 192.168.38.27
  增加一个ns2服务器,增加一个A记录即可
  • 测试A主机发生数据更新时,B主机能否自动同步
vim  /var/named/XXX.net.zone
    20190911    ; serial 
        只要主的版本号大于从,默认就数据更新
          环境好如果数据更改,但是版本号未修改,从认为数据未修改。
  ftpserver A 1.1.1.1 增加一个A记录

然后在slave主机查看文件时间如下:
27 ~]# ll /var/named/slaves/
-rw-r--r-- 1 named named 279 Sep 10 18:06 XXX.net.slaves.zone
27 ~]# ll /var/named/slaves/
-rw-r--r-- 1 named named 378 Sep 10 18:17 XXX.net.slaves.zone
  
  文件时间更新,说明slave主机数据已同步,

或者在dns client(C主机)尝试使用 dns slave server解析
# dig ftpserver.XXX.net
# dig ftpserver.XXX.net @192.168.38.27
  解析成功:说明数据同步 
  说明master数据发生更新,slave自动同步,主从dns服务器配置成功

(3)以下场景:
名字解析/DNS服务_第5张图片

(4)安全隐患:

    目前好像搭建dns slave server不需要 dns master server的同意可以直
接将数据同步。

     甚至互联网的任何主机可以使用dig命令将dns master server的整个数据
库的数据全部抓来。
# dig -t axfr XXX.net @192.168.38.17 

造成以上这种现象的原因:dns server上没有做任何关于数据库记录的防护策略。

解决办法:
在dns服务器的主配置文件中/etc/named.conf中options语句块添加一行:
    allow-transfer { [slave-ip|none];};
      master 写 slave的ip地址,只允许dns slave server 抓取数据
      slave 写 none

dns server需要做安全策略。查询时只能知道名字才能查询。

(伍)实验3:反向区域服务器

(1)反向dns解析
名字解析/DNS服务_第6张图片

(2)反向dns解析的实现步骤:

  • 目标:将192.168.38.0/24这个网段中的某些主机做反向解析
    名字解析/DNS服务_第7张图片

  • 第一步:配置dns server

1) 创建区域模块:/etc/named.rfc1912.zones
# vim /etc/named.rfc1912.zones
zone "38.168.192.in-addr.arpa" IN {
	type master;
	file "192.168.38.zone";
};

# named-checkconf

2) 创建192.168.38.zone 文件 ==>创建时需要注意文件属性
# chgrp named /var/named/192.168.38.zone
# chmod 640 /var/named/192.168.38.zone
# cp -p named.localhost 192.168.38.zone
# vim /var/named/192.168.38.zone
    $TTL 1D
    @	IN SOA	  ns1 admin.XXX.net. ( 0 1D 1H 1W 3H )	
      NS ns1
    ns1 A 192.168.38.17

    17.38.168.192.in-addr.arpa. PTR ns1.XXX.net. ;末尾的.必须写
    100	PTR www.XXX.net.  ;末尾的.不写会加域后缀

3)rndc reload (注:每次改完配置文件需要named重新加载配置文件)
  上面实验这个步骤忘记写啦~~。
  • 第二步:在B主机上测试:
# dig -x 192.168.38.100
# dig -t ptr 100.38.168.192.in-addr.arpa
上面两个命令等价:--#

解析出来:反向解析成功=====

(陆)实验4:子域的服务器

(1)子域的实现:FQDN的框架就是根据子域的方式实现的。

(2)企业内部可能涉及子域的情况如下:
名字解析/DNS服务_第8张图片

(3)子域实现:

  • 第一步:在其父域委派:==>修改对应的区域库文件
# vim /var/named/XXX.net.zone
  beijing NS ns3
ns3 A 192.168.38.27
  ;192.168.38.27 为beijing的子域的dns服务器

# rndc reload 
  • 第二步:在子域的dns服务器上则可以进行配置啦~~与建主DNS差不多
1) 建资源记录库
  ....
2)建zone语句块文件
# vim /etc/named.rfc1912.zones
添加zone 语句块:  
  zone "beijing.XXX.net" IN {
	type master;
	file "beijing.XXX.net.zone";
};

3)启动服务
  • 在dns server向父域发起解析子域FQDN的请求
#dig www.beijing.XXX.net @192.168.38.17

(柒)实验5:转发服务器

(1)转发dns服务器
名字解析/DNS服务_第9张图片

(2)转发服务器的实现:

  • 框图:
    名字解析/DNS服务_第10张图片

  • 第一步:在host B上配置:

options 语句块中:
options {
    注释//==>向外提供服务
=============
    forward  only;
    forwarders {192.168.38.17;};
==============
    将和安全相关的两项设置改为no
    dnssec-enable no;
    dnssec-validation no;
};
  • 第二步:在host C主机上测试:
# dig www.XXX.net @192.168.38.27
# host www.XXX.net 192.168.38.27

(捌)实验6:智能DNS

智能DNS介绍

智能DNS:让客户离访问的服务器距离user更近。

eg: user  --> FQDN (http://www.XXX.net) 访问此网页时
  (1)首先要将FQDN解析为==>ip地址,智能DNS就是在解析时做手脚
  (2)将解析的ip地址是距离user访问的物理距离最近的服务器ip返回给user
        或者根据负载情况返回相应物理距离比较近的server ip 给user
  (3)这样就能极大的加快user访问 http://www.XXX.net 网页的速度

名字解析/DNS服务_第11张图片

智能DNS实现==>GSLB和CDN

(1)GSLB

  • GSLB:Global Server Load Balance全局负载均衡
  • GSLB是对服务器和链路进行综合判断来决定由哪个地点的服务器来提供服务, 实现异地服务器群服务质量的保证
  • GSLB主要的目的是在整个网络范围内将用户的请求定向到最近的节点(或者区 域)
  • GSLB分为基于DNS实现、基于重定向实现、基于路由协议实现,其中最通用的 是GSLB基于DNS解析方式实现

(2)CDN(Content Delivery Network)

  • GSLB基于DNS解析方式时需要配合CDN实现
  • CND:利用全局负载均衡技术将用户的访问指向离用户最近的工作正常的流媒体服务器上,由流媒体服务器直接响应用户的请求。
  • CDN是一种服务,服务商:蓝汛,网宿,帝联等
    名字解析/DNS服务_第12张图片

模拟CDN的实现

  • 模拟CDN的实现:即不同的ip地址访问www.XXX.net时,返回不同的ip地址
    名字解析/DNS服务_第13张图片

  • 要实现以上功能,需要使用bind中的ACL和view

(1)bind中的ACL

  • bind中有四个内置的acl:
    none:没有一个主机
    any:任意主机
    localhost:本机
    localnet:本机的ip同掩码运算后得到的网段(与本机ip处于相同网段)

  • bind中基础的安全相关的配置:
    acl: 把一个或多个地址归并为一个集合,并通过一个统一的名称调用

  • ACL 的格式:
    acl acl_name {
      ip;
      net/prelen;

    };

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

(2)bind中view

  • 一个bind服务器可定义多个view,每个view中可定义一个或多个zone

  • 每个view用来匹配一组客户端

  • 多个view内可能需要对同一个区域进行解析,但使用不同的区域解析库文件

  • 注意:
    (1) 一旦启用了view,所有的zone都只能定义在view中
    (2) 仅在允许递归请求的客户端所在view中定义根区域
    (3) 客户端请求到达时,是自上而下检查每个view所服务的客户端列表

  • bind view格式:
    view VIEW_NAME {
      match-clients { testacl; };
      zone “magedu.com” {
    type master;
    file “magedu.com.zone”;
    };
    include “/etc/named.rfc1912.zones”;
    };

实验步骤:

(1)在hostA主机定义acl

此处定义了三个acl如下:
注意1:ACL需要先定义,后使用,因此定义在options语句块之前
注意2:由于最后一个ACL是any,因此必须写在最后,大范围需在小范围后面。

vim /etc/named.conf
    acl eastnet {
        192.168.38.0/24;
        192.168.66.0/24;(此处可以添加多个地址的)
    };
    acl weatnet {
        172.18.0.0/16;
    };
    acl othertnet {
        any;
    };

    options {....};

(2)怎么保证三套不同地址?==>在hostA主机定义建立三个数据库文件。

# ll /var/named/xxx.net.zone.*
-rw-r----- 1 root named 142 Sep 11 20:11 xxx.net.zone.east
-rw-r----- 1 root named 142 Sep 11 20:11 xxx.net.zone.other
-rw-r----- 1 root named 142 Sep 11 20:11 xxx.net.zone.weat

# vim /var/named/xxx.net.zone.weat  
    @   IN SOA  dns1 admin.xxx.net. ( 20190911 1D 1H 1W 3H )
            NS  dns1
    dns1    A   192.168.38.17
    webserver A 172.18.0.6
    www     CNAME webserver
省略其余两个文件的数据库文件.....

(3)在hostA主机将对应的数据库与对应的ACL结合:view

一旦启用view,所有zone只能放置view中。

==>  ①将 zone "." {}; 转移至对应的/etc/named.rfc1912.zones文件中
==>  ②为方便管理,将/etc/named.rfc1912.zones文件与数据库成套对应
===>  
# cp -p /etc/named.rfc1912.zones /etc/named.rfc1912.zones.weat
# ll /etc/named.rfc1912.zones.*
-rw-r----- 1 root named 979 Sep 11 20:26 /etc/named.rfc1912.zones.east
-rw-r----- 1 root named 979 Sep 11 20:26 /etc/named.rfc1912.zones.other
-rw-r----- 1 root named 979 Sep 11 20:26 /etc/named.rfc1912.zones.weat

然后其中包括的zone 信息与之对应即可
    例:vim /etc/named.rfc1912.zones.east
      zone "XXX.net" {
        type master;
        file "xxx.net.zone.east";
      };

然后使用view将其关联:vim /etc/named.conf 定义view
  view weatview {
    match-clients {weatnet;};
    include "/etc/named.rfc1912.zones.weat";
};

view eastview {
    match-clients {eastnet;};
    include "/etc/named.rfc1912.zones.east";
};

view otherview {
    match-clients {othernet;};
    include "/etc/named.rfc1912.zones.other";
};

(4)测试:直接在本机测试:

1)首先:# cat /etc/resolv.con
nameserver 192.168.38.17  ==>将dns指向本机
2)查看本机ip:
# ip a
  eth0:192.168.38.17/24
  eth1:172.18.146.227/16
3)测试:
  host www.XXX.net 172.18.146.227
    ...webserver.XXX.net has address 172.18.0.6
  # host www.XXX.net 192.168.38.17
    ....webserver.XXX.net has address 192.168.38.6
  # host www.XXX.net 127.0.0.1
    ...webserver.XXX.net has address 10.10.10.66
可见解析成功,由于不同的网段,经过dns解析为不同的ip地址

(玖)实验7:综合实验1,2,3,4,5一起实现

名字解析/DNS服务_第14张图片

  • 注意:
    type hint; 其余的dns上 zone “.” (根区域)的type类型均为:hint
zone "." IN {
    type hint;
    file "named.ca";
};

(拾)DNS故障排除

(1)dns server只监听本地53端口时,客户端主机配置dns指向dns server时。

#host www.XXX.com
  connection timed out; no servers could be reached

dns server主机不可达:
  ①可能当前主机不能ping通dns server的ip
  ②可能是dns server 未对当前client提供dns服务

(2)REFUSED ==>dig www.XXX.com出现refuse关键字时

#host www.XXX.com
  Host www.XXX.com not found: 5(REFUSED)

故障原因:allow-query     { localhost; };
  dns server 只允许本机查询

(3) 2(SERVFAIL) servfail出现此故障时

# host www.XXX.com
  Host www.XXX.com not found: 2(SERVFAIL)

dns server 不能解析名称
  ① 名称没有对应的主机
  ②dns server 本身没有对应记录也不能访问互联网

(佰)DNS相关的命令

rndc命令

rndc 专门管理named程序的工具
  • rndc:rndc --> rndc (953/tcp)

  • USAGE:rndc COMMAND

  • rndc reload: 重载主配置文件和区域解析库文件

  • rndc reload zonename: 重载区域解析库文件

  • rndc retransfer zonename: 手动启动区域传送,而不管序列号是否增加

  • rndc notify zonename: 重新对区域传送发通知

  • rndc reconfig: 重载主配置文件

  • rndc querylog: 开启或关闭查询日志文件/var/log/message
    默认情况下不纪录至/var/log/message
        测试情况下有时可能会使用,测试是否收到了一个查询请求过来

  • rndc trace: 递增debug一个级别
    跟踪日记纪录的详细程度

  • rndc trace LEVEL: 指定使用的级别
    数字越大,纪录的信息详细

  • rndc notrace:将调试级别设置为 0

  • rndc flush:清空DNS服务器的所有缓存记录

dig命令

  • USAGE:dig [-t type] name [@SERVER] [query options]
    dig只用于测试dns系统,不会查询hosts文件进行解析

  • dig 命令来源于bind-utils包

# rpm -qf `which dig`
  bind-utils-9.9.4-72.el7.x86_64

# rpm -ql bind-utils
    /usr/bin/dig
    /usr/bin/host
    /usr/bin/nslookup
    ===>dns测试命令dig、host、nslookup 工具均由bind-utils包提供
  • 查询选项:
    +[no]trace:跟踪解析过程 : dig +trace magedu.com
    +[no]recurse:进行递归解析


    测试反向解析:
      dig -x IP = dig –t ptr reverseip.in-addr.arpa


    模拟区域传送:
      dig -t axfr ZONE_NAME @SERVER

host 命令

  • host [-t type] name [SERVER]

nslookup命令

  • nslookup [-option] [name | -] [server]
  • 交互式模式:
    server IP: 指明使用哪个DNS server进行查询
    set q=RR_TYPE: 指明查询的资源记录类型
    NAME: 要查询的名称

清理缓存

windows 清理缓存:flushdns  

linux dns server 清理缓存:rndc flush
    

你可能感兴趣的:(DNS,DNS,bind,dig)