Drollery Medieval drollery of a knight on a horse

🏆 欢迎来到本站: https://xuchangwei.com/希望这里有你感兴趣的内容

flowery border with man falling
flowery border with man falling

Linux: 域名系统 DNS 服务

域名系统DNS服务

内容概述

  • 名字解析介绍
  • DNS服务工作原理
  • 实现主服务器
  • 实现反向解析区域
  • 实现从服务器
  • 实现子域
  • 实现转发
  • 实现智能DNS
  • DNS排错
  • 实现Internet 的DNS构架

名字解析介绍和DNS

当前TCP/IP网络中的设备之间进行通信,是利用和依赖于IP地址实现的。但数字 形式的IP地址是很难记忆的。当网络设备众多,想要记住每个设备的IP地址,可 以说是“不可能完成的任务”。那么如何解决这一难题呢?我们可以给每个网络 设备起一个友好的名称,如:www.aulii.com,这种由文字组成的名称,显而易 见要更容易记忆。但是计算机不会理解这种名称的,我们可以利用一种名字解析 服务将名称转化成(解析)成IP地址。从而我们就可以利用名称来直接访问网络 中设备了。除此之外还有一个重要功能,利用名称解析服务可以实现主机和IP的 解耦,即:当主机IP变化时,只需要修改名称服务即可,用户仍可以通过原有的 名称进行访问而不受影响。

实现此服务的方法是多样的。如下面所述:

本地名称解析配置文件:hosts

Linux: /etc/hosts
windows: %WINDIR%/system32/drivers/etc/hosts

122.10.117.2 www.me.org
93.46.8.89 www.google.com

DNS:Domain Name System域名系统,应用层协议,是互联网的一项服务。它作为 将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网基 于C/S架构,服务器端:53/udp, 53/tcp BIND:Bekerley Internet Name Domain,由 ISC (www.isc.org)提供的DNS软件实现DNS域名结构

image-20210122170934638.png
image-20210422120743632.png

FQDN是指主机名加上全路径,全路径中列出了序列中所有域成员。全域名可以从 逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名的一种完全表示 形式。从全域名中包含的信息可以看出主机在域名树中的位置

www.abc.com.

FQDN 全称域名 = 主机名(www)+域名(abc.com) 
域名 = 子域名(abc) + 父域名(com =子域名(com)+父域名(.))
  • 根域
  • 一级域名:Top Level Domain: tld com, edu, mil, gov, net, org, int,arpa

    三类:组织域、国家域\(.cn, .ca, .hk, .tw\)、反向域

    国家都按照ISO3166国家代码分配

  • 二级域名:me.com
  • 三级域名:study.me.com
  • 最多可达到127级域名

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

DNS服务工作原理

image-20210122171002396.png
image-20210423172139508.png

DNS代理解析服务器:值缓存服务器,没有缓存记录会去问根服务器它的下级域 名服务器在哪,收到地址后再去询问直到找到域名对应的地址,本地缓存返回给 用户。

DNS查询类型

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

    一般客户机和本地DNS服务器之间属于递归查询,即当客户机向DNS服务器发出 请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求, 得到最终的肯定或否定的结果后转交给客户机。此查询的源和目标保持不变, 为了查询结果只需要发起一次查询

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

    一般情况下(有例外)本地的DNS服务器向其它DNS服务器的查询属于迭代查询, 如:若对方不能返回权威的结果,则它会向下一个DNS服务器(参考前一个DNS 服务器返回的结果)再次发起进行查询,直到返回查询的结果为止。此查询的 源不变,但查询的目标不断变化,为查询结果一般需要发起多次查询

范例: whois 查询域名信息

yum install -y whois

# whois xuchangwei.com
   Domain Name: XUCHANGWEI.COM
   Registry Domain ID: 2586961341_DOMAIN_COM-VRSN
   Registrar WHOIS Server: grs-whois.hichina.com
   Registrar URL: http://www.net.cn
   Updated Date: 2021-01-26T08:40:52Z
   Creation Date: 2021-01-25T13:38:08Z
... ...

名称服务器

Name Server,域内负责解析本域内的名称的DNS服务器

IPv4的根名称服务器:全球共13个负责解析根域的DNS服务器,美国10个,荷兰1,瑞典1,日本1

IPv6的根名称服务器:全球共25个,中国1主3从,美国1主2从

解析类型

  • FQDN –> IP 正向解析
  • IP –> FQDN 反向解析

    注意:正反向解析是两个不同的名称空间,是两棵不同的解析树

完整的查询请求经过的流程

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

范例:

D:\download\>ipconfig/displaydns | findstr  redhat

D:\download\>ping www.redhat.com

正在 Ping e3396.ca2.s.tl88.net [223.111.109.110] 具有 32 字节的数据:
来自 223.111.109.110 的回复: 字节=32 时间=38ms TTL=54
来自 223.111.109.110 的回复: 字节=32 时间=38ms TTL=54
来自 223.111.109.110 的回复: 字节=32 时间=38ms TTL=54
来自 223.111.109.110 的回复: 字节=32 时间=38ms TTL=54

223.111.109.110 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 38ms,最长 = 38ms,平均 = 38ms

D:\download\>ipconfig/displaydns | findstr  redhat
    www.redhat.com
    记录名称. . . . . . . : www.redhat.com
    CNAME 记录  . . . . . : ds-www.redhat.com.edgekey.net
    记录名称. . . . . . . : ds-www.redhat.com.edgekey.net
    CNAME 记录  . . . . . : ds-www.redhat.com.edgekey.net.globalredir.akadns.net
    记录名称. . . . . . . : ds-www.redhat.com.edgekey.net.globalredir.akadns.net

# 刷新 dns 缓存
D:\download\>ipconfig/flushdns

Windows IP 配置

已成功刷新 DNS 解析缓存。

D:\download\>ipconfig/displaydns | findstr  redhat

D:\download\>

nsswitch网路名称服务解析

1.nsswitch:network/name service switch网路名称服务解析

nsswitch是通用框架,与各种类型存储进行交互的公共模块化实现;

实现: /usr/lib64/libnss*, /lib64/libnss*

框架:libnss

驱动: libnss_files-
[root@node1 lib]# ls /usr/lib64/ | grep nss
libnss_dns-2.17.so
libnss_dns.so.2
libnss_files-2.17.so
libnss_files.so.2
libnss_hesiod-2.17.so
libnss_hesiod.so.2
libnss_myhostname.so.2
libnss_nis-2.17.so

2.配置文件:/etc/nsswitch.conf

(1)格式 解析库: store1 store2

为每一种用到解析库的应用通过配置文件定义其位置:

例如:

passwd: files ldap      # 密码通过文件解析
hosts: files  dns       # DNS的优先级。通过文件解析,若没有再通过dns解析。 files=/etc/hosts dns=/etc/resolv.conf

(2)解析库: 文件、关系型数据管理系统(MySQL)、LDAP、NIS、DNS

(3)每种存储中的查找结果状态:

STATSU => success | notfound | unavail | tryagain

success: 服务正常
NOTFOUND: 服务正常,但没有对应条目
UNAVAIL:服务不可用
TRYAGAIN:服务有临时性故障
    默认在SUCCESS后就 return了,

(4)对应于每种状态结果的行为:

return(返回) | continue (继续)

例子:

hosts: files  nis [NOTFOUND=return]  dns 
    找hosts时第一次file中找,找不到去Nis中找,nis服务正常,但没有对应条目就返回,nis服务不可用时去dns中找

3.getent命令:get entries,从管理库中获取指定条目

getent  DATABASE  [key]

范例

[root@node1 lib]# getent hosts  获取对应库内容
127.0.0.1       localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1       localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@node1 lib]# getent passwd root   获取库中指定条目
root:x:0:0:root:/root:/bin/bash
[root@middle-ware ~]# getent shadow root
root:$6$G7pLVnKe4xdwkUQ6$oL0Z2gOtb7ssPatwwUKBhhAuft.cJHkt7MO.FXw0ZxzIS0BX0R4A1o85bVrPEeiDZOdAhP9ffI725jtrfx/kP.::0:99999:7:::

[root@node1 lib]# getent hosts xuchangwei.com   file中没得,通过dns 172.16.0.1 解析
182.92.4.110    xuchangwei.com

[root@node1 lib]# cat /etc/resolv.conf 
# Generated by NetworkManager
search xuchangwei.com
nameserver 223.5.5.5
nameserver 223.6.6.6

IPv4地址:
223.5.5.5
223.6.6.6

IPv6地址:
2400:3200::1
2400:3200:baba::1

resolv.conf

参考:http://man7.org/linux/man-pages/man5/resolv.conf.5.html

options rotate timeout:1 attempts:3 single-request-reopen
#释义: 循环查询 超时时间 重试次数 只收到一个IPV4应答或者只收到一个IPV6应答,重新开一个socket查询

配置说明:
nameserver :表明DNS服务器的IP地址。可以有很多行的nameserver,每一个带一个IP地址。在查询时就按nameserver在本文件中的顺序进行,且只有当第一个nameserver没有反应时才查询下面的nameserver。
domain     :声明主机的域名。很多程序用到它,如邮件系统;当为没有域名的主机进行DNS查询时,也要用到。如果没有域名,主机名将被使用,删除所有在第一个点( .)前面的内容。
search     :它的多个参数指明域名查询顺序。当要查询没有域名的主机,主机将在由search声明的域中分别查找。domain和search不能共存;如果同时存在,后面出现的将会被使用。
sortlist   :允许将得到域名结果进行特定的排序。它的参数为网络/掩码对,允许任意的排列顺序。
options    :用于配置resolver的内置变量,不是resolv.conf的常见配置。

* 注意事项
(1)search 和 domain 不能共存,如果同时存在,以最后出现的为准。
(2)分号(;)或井号(#)开头的行为注释行;
(3)每一个配置项必须单独成行,且以关键词开头,空格分隔配置值。

options取值:
ndots:[n]            :设置调用res_query()解析域名时域名至少包含的点的数量
timeout:[n]          :设置等待dns服务器返回的超时时间,单位秒。默认值RES_TIMEOUT=5,参见<resolv.h>
attempts:[n]         :设置resolver向DNS服务器发起域名解析的请求次数。默认值RES_DFLRETRY=2,参见<resolv.h>
rotate               :在_res.options中设置RES_ROTATE,采用轮询方式访问nameserver,实现负载均衡
no-check-names       :在_res.options中设置RES_NOCHECKNAME,禁止对传入的主机名和邮件地址进行无效字符检查,比如下划线(_),非ASCII字符或控制字符
use-vc               :强制 glibc 使用 TCP 协议发送 DNS query
single-request       : 用来指定分别执行A和AAAA解析;即,收到A记录解析的结果后在发送AAAA记录解析请求; 默认情况下,同时在一个连接上发送A和AAAA的解析,这样效率会高一倍;然而,有些dns server不能很好地处理这种请求方式,很可能不能正确地返回AAAA的响应,以至于请求会超时
single-request-reopen:强制A和AAAA的解析在两个连接中处理(主要体现在连接的源端口不同)

范例:DNS解析缓慢

原因是CentOS 6/REHL 6总是需要等待AAAA(IPv6)的结果,即使IPv6已在网络 设置中禁用

你没法通过options来禁用ipv6解析

# 在/etc/resolv.conf文件添加下面一行:
vim /etc/resolv.conf
options single-request-reopen
nameserver 192.168.18.77

# 修改/etc/sysctl.conf文件:
vim /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

# 使之生效
sysctl -p 

DNS 服务相关概念和技术

DNS服务器的类型

  • 主DNS服务器
  • 从DNS服务器
  • 缓存DNS服务器(转发器)

主DNS服务器

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

从DNS服务器

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

  • 序列号:解析库版本号,主服务器解析库变化时,其序列递增
  • 刷新时间间隔:从服务器从主服务器请求同步解析的时间间隔
  • 重试时间间隔:从服务器请求同步失败时,再次尝试时间间隔
  • 过期时长:从服务器联系不到主服务器时,多久后停止服务
  • 通知机制:主服务器解析库发生变化时,会主动通知从服务器

区域传输

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

解析形式

  • 正向:FQDN( Fully Qualified Domain Name) –> IP
  • 反向: IP –> FQDN

负责本地域名的正向和反向解析库

  • 正向区域
  • 反向区域

解析答案

  • 肯定答案:存在对应的查询结果
  • 否定答案:请求的条目不存在等原因导致无法返回结果
  • 权威答案:直接由存有此查询结果的DNS服务器(权威服务器)返回的答案
  • 非权威答案:由其它非权威服务器返回的查询答案

各种资源记录

区域解析库:由众多资源记录RR(Resource Record)组成。

记录类型:A, AAAA, PTR, SOA, NS, CNAME, MX

可查询的类型有如下

  • SOA :Start Of Authority,起始授权记录;一个区域解析库有且仅能有一个 SOA记录,必须位于解析库的第一条记录
  • A :internet Address,地址记录,作用FQDN –> IP ,即名称解析成IP
  • AAAA :地址记录,FQDN –> IPv6
  • AFSDB :Andrew文件系统数据库服务器记录
  • ATMA :ATM地址记录
  • CNAME :Canonical Name别名记录
  • HINFO :硬件配置记录,包括CPU、操作系统信息
  • ISDN :域名对应的ISDN号码
  • MB :存放指定邮箱的服务器
  • MG :邮件组记录
  • MINFO :邮件组和邮箱的信息记录
  • MR :改名的邮箱记录
  • MX :Mail eXchanger邮件服务器记录
  • NS :Name Server名字服务器记录,专用于标明当前区域的DNS服务器
  • PTR :PoinTeR反向记录,IP –> FQDN
  • RP :负责人记录
  • RT :路由穿透记录
  • SRV :TCP服务器信息记录。主机记录: 格式为 服务的名字.协议的类型;例如: _sip._tcp
  • X25 :域名对应的X.25地址记录
  • TXT :域名对应的文本信息;对域名进行标识和说明的一种方式,一般做验证 记录时会使用此项,如:SPF(反垃圾邮件)记录,https验证等,如下示 例:

    _dnsauth TXT 2012011200000051qgs69bwoh4h6nht4n1h0lr038x
    

范例:nslookup使用详解

# 直接查询某域名的IP,默认使用系统的dns服务器来查询
nslookup www.baidu.com

# 指定dns服务器查询某域名,指定使用114.114.114.114dns服务器来查询域名
nslookup www.baidu.com 114.114.114.114

# 指定查询某域名的记录类型,默认查询的是A记录
nslookup -qt=MX mail.163.com
资源记录定义的格式
name(名称)    [TTL](缓存时长)   IN      rr_type(记录类型)     value(值,可以包含多段组成)

注意:

  1. TTL可从全局继承
  2. 使用 "@" 符号可用于引用当前区域的名字
  3. 同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应
  4. 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值 进行定义;此仅表示通过多个不同的名字可以找到同一个主机

面试题:

  1. 我的网站域名需要更改,如何使其更快的生效?
  2. 更改TTL值为多少比较合适呢?是如何生效的?
SOA记录

起始授权记录,描述了当前数据库的信息

name: 当前区域的名字,例如“me.org.” 或者 "@"

value: 有多部分组成

注意:

  1. 当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字
  2. 当前区域管理员的邮箱地址;但地址中不能使用@符号,一般用.替换 例如:admin.me.org
  3. 主从服务区域传输相关定义以及否定的答案的统一的TTL。时间单位:M(分), H(时),D(天),W(天),M(月)

范例:

//@   86400   IN  SOA       ns1.me.org.(当前的dns服务器主服务器)   nsadmin.me.org.(当前dns服务器的管理员)   (属性,可定义在一行或多行中)
//当前的dns服务器可能A记录解析 ns.me.org. IN A 10.0.0.8

me.org.   86400   IN  SOA       ns1.me.org.   nsadmin.me.org.   (
        2015042201  ;序列号,手动设置。如果主服务器版本号比从服务器版本号大就认为是更新了,主服务器记录就同步到从服务器。长最多十位数字组成
        2H          ;刷新时间,从服务器2个小时做一个拉操作
        10M         ;重试时间,从服务器拉操作失败多长时间重试
        1W          ;过期时间,从服务器总同步失败,定义从服务器记录的失效时间
        1D          ;否定答案的TTL值,不存在记录缓存时间,不用用户查数据库
        )
NS记录

name: 当前区域的名字

value:当前区域的某DNS服务器的名字,从dns服务器地址,例如ns.me.org.

注意:

  1. 相邻的两个资源记录的name相同时,后续的可省略
  2. 对NS记录而言,任何一个ns记录后面的服务器名字,都应该在后续有一个A记录
  3. 一个区域可以有多个NS记录

范例:

@ IN NS ns1
@ IN NS ns2

#
me.org. IN NS ns1.me.org.
me.org. IN NS ns2.me.org.
MX记录

name: 当前区域的名字

value: 当前区域的某邮件服务器(smtp服务器)的主机名

注意:

  1. 一个区域内,MX记录可有多个;但每个记录的value之前应该有一个数字 (0-99),表示此服务器的优先级;数字越小优先级越高
  2. 对MX记录而言,任何一个MX记录后面的服务器名字,都应该在后续有一个A记录

范例:

me.org. IN      MX  10  mx1.me.org.
        IN      MX  20  mx2.me.org.
A记录

name: 某主机的FQDN,例如:www.me.org. 或者只写www会自动补全www.me.org.

value: 主机名对应主机的IP地址

避免用户写错名称时给错误答案,可通过泛域名解析进行解析至某特定地址

范例:

www.me.org.         IN      A   1.1.1.1
www.me.org.         IN      A   2.2.2.2
mx1.me.org.         IN      A   3.3.3.3
mx2.me.org.         IN      A   4.4.4.4
$GENERATE 1-254 HOST$   IN      A   1.2.3.$  # 生成254条件记录 相当于HOST1 IN A 1.2.3.1 到 HOST254 IN A 1.2.3.254
*.me.org.           IN      A   5.5.5.5      # * 泛域名解析
me.org.             IN      A   6.6.6.6      # 或者写成@ 域名解析

范例:阿里云

主机记录就是域名前缀,常见用法有:
www:解析后的域名为www.aliyun.com。
@:直接解析主域名 aliyun.com。
*:泛解析,匹配其他所有域名 *.aliyun.com。
mail:将域名解析为mail.aliyun.com,通常用于解析邮箱服务器。
二级域名:如:abc.aliyun.com,填写abc。
手机网站:如:m.aliyun.com,填写m。
显性URL:不支持泛解析(泛解析:将所有子域名解析到同一地址)
AAAA记录

name: FQDN

value: IPv6

PTR记录

name: IP,有特定格式,把IP地址反过来写,1.2.3.4,要写作4.3.2.1;而有特 定后缀:inaddr.arpa.,所以完整写法为:4.3.2.1.in-addr.arpa.

value: FQDN

注意:网络地址及后缀可省略;主机地址依然需要反着写

例如:

4.3.2.1.in-addr.arpa. IN PTR www.me.org.
#如1.2.3为网络地址,可简写成:
4   IN   PTR   www.me.org.
CNAME别名记录

name: 别名的FQDN

value: 真正名字的FQDN

例如:

www.me.org. IN CNAME websrv.me.org.

子域授权

每个域的名称服务器,都是通过其上级名称服务器在解析库进行授权,类似根域授权tld

glue record:粘合记录,父域授权子域的记录

范例:

.com.       IN      NS      ns1.com.
.com.       IN      NS      ns2.com.
ns1.com.    IN      A       2.2.2.1
ns2.com.    IN      A       2.2.2.2
#me.org. 在.com的名称服务器上,解析库中添加资源记录
me.org.         IN  NS  ns1.me.org.
me.org.         IN  NS  ns2.me.org.
me.org.         IN  NS  ns3.me.org.
ns1.me.org.     IN  A   3.3.3.1
ns2.me.org.     IN  A   3.3.3.2
ns3.me.org.     IN  A   3.3.3.3

互联网域名

  1. 域名注册

    代理商:万网, 新网, godaddy

  2. 注册完成以后,想自己用专用服务来解析

管理后台:把NS记录指向的服务器名称,和A记录指向的服务器地址

范例:阿里云DNS管理后台界面

image-20210423173105410.png

DNS软件bind

DNS服务器软件:bind,powerdns(基于php管理界面),unbound,coredns

BIND相关程序包

官方地址:https://www.isc.org/bind/

yum list all bind*
  • bind:服务器
  • bind-libs:相关库
  • bind-utils: 客户端
  • bind-chroot: 安全包,将dns相关文件放至 var/named/chroot

范例:安装bind软件

[root@centos8 ~]#dnf -y install bind bind-utils
[root@centos8 ~]#systemctl enable --now named
# tcp udp 53端口, 953管理端口

BIND包相关文件

  • BIND主程序:/usr/sbin/named
  • 服务脚本和Unit名称:/etc/rc.d/init.d/named,/usr/lib/systemd/system/named.service
  • 主配置文件:/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

    • 正向模板:/var/named/named.localhost
    • 反向模板:/var/named/named.loopback

    注意:

    (1) 一台物理服务器可同时为多个区域提供解析

    (2) 必须要有根区域文件;/var/named/named.ca 保存了所有根服务器地址

    (3) 应该有两个(如果包括ipv6的,应该更多)实现localhost和本地回环地址的解析库

主配置文件

  • 全局配置:options {};
  • 日志子系统配置:logging {};
  • 区域定义:本机能够为哪些zone进行解析,就要定义哪些zone

    zone "ZONE_NAME" IN {};

注意:

  • 任何服务程序如果期望其能够通过网络被其它主机访问,至少应该监听在一个能与外部主机通信的IP地址上
  • 缓存名称服务器的配置:监听外部地址即可
  • dnssec: 建议关闭dnssec,设为no

实现主DNS服务器

主DNS服务器配置

  1. 在主配置文件中定义区域

    vim /etc/named.conf
    #注释掉下面两行
    //  listen-on port 53 { 127.0.0.1; };   注释或者换成localhost可以是监听所有地址;多个地址用;分号分隔
    //  allow-query         { localhost; }; 注释后允许所有主机查询,换成any;也是允许所有
    directory       "/var/named"; // 数据库文件存放位置
    
    zone "ZONE_NAME" IN {                 // 区域名称,这里要写域名
        type {master|slave|hint|forward}; // 区域类型master|slave|hint|forward
        file "ZONE_NAME.zone";            // 区域数据库文件
    };
    
  2. 定义区域解析库文件

    出现的内容

    • 宏定义
    • 资源记录

    范例:区域数据库

    vim /etc/named.rfc1912.zones
    #加上下面内容
    zone "me.org" IN {
        type master;
        file "me.org.zone";
    };
    
    cp -p /var/named/named.localhost /var/named/me.org.zon # 复制模板,-p保本文件属性
    
    vim /var/named/me.org.zone
    $TTL 86400
    $ORIGIN me.org.
    @   IN  SOA ns1.me.org. admin.me.org (
            2015042201
            1H
            5M
            7D
            1D )
        IN  NS ns1
        IN  NS ns2
        IN  MX 10 mx1
        IN  MX 20 mx2
    ns1 IN  A 172.16.100.11
    ns2 IN  A 172.16.100.12
    mx1 IN  A 172.16.100.13
    mx2 IN  A 172.16.100.14
    ,*       A 172.16.100.11
    
    websrv  IN A 172.16.100.11
    websrv  IN A 172.16.100.12
    www IN  CNAME websrv
    

范例:抓包观察查询过程

[root@centos8 ~]#tcpdump -i eth0 udp port 53 -nn  # 有请求过来没有回应
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:37:38.458363 IP 10.0.0.7.42201 > 10.0.0.8.53: 44928+ A? www.baidu.com. (31)
11:37:38.458896 IP 10.0.0.7.54285 > 10.0.0.8.53: 44928+ A? www.baidu.com. (31)
11:37:38.460038 IP 10.0.0.7.42053 > 10.0.0.8.53: 30536+ A?
www.baidu.com.zcici.com. (48)
11:37:38.460884 IP 10.0.0.7.37739 > 10.0.0.8.53: 30536+ A?
www.baidu.com.zcici.com. (48)

# 53端口是否通过。tcp 53端口报错
[root@centos7 ~]#telnet 10.0.0.8 53
Trying 10.0.0.8...
telnet: connect to address 10.0.0.8: Connection refused

主配置文件语法检查

named-checkconf

解析库文件语法检查

named-checkzone "me.org" /var/named/me.org.zone

配置生效

三种方式:

rndc reload
systemctl reload named
service named reload

测试和管理工具

dig 命令

dig只用于测试dns系统,不会查询hosts文件进行解析

命令格式:

dig [-t type] name [@SERVER] [query options]

-t:指明资源类型
name:资源记录对应的值
@SERVER :以指定服务器做测试
query options:
    +[no]trace:跟踪解析过程 : dig +trace me.org  
    +[no]recurse:进行递归解析


+[no]all:不显示所有结果或显示所有结果
+[no]answer:显示答案。 如显示答案段 dig +noall +answer mail.163.com any

范例:

#查看邮件服务器
dig -t mx me.org

#测试反向解析
dig -x IP = dig –t ptr reverseip.in-addr.arpa
dig -x 10.0.0.100 @10.0.0.8
dig -t ptr 100.0.0.10.in-addr.arpa. @10.0.0.8

#查看 dns 服务器域名并查到对应 bind 版本
dig -t ns me.org
dig +noall +answer txt chaos VERSION.BIND @ns3.dnsv4.com

#模拟区域传送
dig -t axfr ZONE_NAME @SERVER
dig -t axfr me.org @10.10.10.11  # 抓取dns服务器所有解析记录
dig –t axfr 100.1.10.in-addr.arpa @172.16.1.1
dig -t NS . @114.114.114.114
dig -t NS . @a.root-servers.net

范例:

# dig www.me.org @10.0.0.116
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> www.me.org @10.0.0.116
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42051
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2 
# aa 代表从权威服务器得到的结果,10.0.0.116是真正配置dns记录的服务器

[root@centos7 ~]# dig -t A www.bamaface.com @172.16.0.1
; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7 <<>> -t A www.bamaface.com @172.16.0.1
;; global options: +cmd  全局属性
;; Got answer:  获得答案
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30624
;; flags(标志位): qr(查询请求) rd ra(答案); QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:假选项段;没有意义,忽略; 
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION: 问题段
;www.bamaface.com.          IN     A

;; ANSWER SECTION: 答案段
www.bamaface.com.     3600     IN     CNAME     host.bamaface.com.
host.bamaface.com.     3600     IN     A     198.145.20.140

;; AUTHORITY SECTION:权威段,谁来负责解析的,可以看到有2个dns服务器;
bamaface.com.          172799     IN     NS     ns10.domaincontrol.com.
bamaface.com.          172799     IN     NS     ns09.domaincontrol.com.

;; ADDITIONAL SECTION:权威段解析
ns09.domaincontrol.com.     170957     IN     A     216.69.185.5
ns10.domaincontrol.com.     170957     IN     A     208.109.255.5

;; Query time: 758 msec  查询时长
;; SERVER: 172.16.0.1#53(172.16.0.1)  由哪个IP主机进行操作
;; WHEN: 二 1月 12 10:35:35 CST 2016  时间
;; MSG SIZE  rcvd: 164


#跟踪+trace,显示其解析过程,基于迭代方式解析;注意网络不好会解析很慢,阻塞
[root@centos7 ~]# dig +trace -t A www.bamaface.com @172.16.0.1

; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7 <<>> +trace -t A www.bamaface.com @172.16.0.1
;; global options: +cmd
.               517866     IN     NS     d.root-servers.net.
.               517866     IN     NS     b.root-servers.net.
host命令

命令格式:

host [-t type] name [SERVER]

范例

host -t NS me.org 172.16.0.1
host -t soa me.org
host -t mx me.org
host -t axfr me.org
host 1.2.3.4
#区域传输
host -T -l sina.com 8.8.8.8
nslookup命令

nslookup 可以支持交互和非交互式两种方式执行

window, linux都支持的命令

全令格式:

nslookup [-option] [name | -] [server]

交互式模式:

nslookup>
server IP: 指明使用哪个DNS server进行查询
set q=RR_TYPE: 指明查询的资源记录类型
NAME: 要查询的名称

# 直接查询某域名的IP,默认使用系统的dns服务器来查询
nslookup www.baidu.com
# 指定dns服务器查询某域名,指定使用114.114.114.114dns服务器来查询域名
nslookup www.baidu.com 114.114.114.114
# 指定查询某域名的记录类型,默认查询的是A记录
nslookup -qt=MX mail.163.com
rndc 命令

利用rndc工具可以实现管理DNS功能

rndc 监听端口: 953/tcp

命令格式:

rndc COMMAND
COMMAND:
    status: 查看状态
    stop  :停止服务
    reload: 重载主配置文件和区域解析库文件
    reload zonename: 重载区域解析库文件
    retransfer zonename: 手动启动区域传送,而不管序列号是否增加
    notify zonename: 重新对区域传送发通知
    reconfig: 重载主配置文件
    querylog: 开启或关闭查询日志文件/var/log/message
    trace: 递增debug一个级别
    trace LEVEL: 指定使用的级别
    notrace:将调试级别设置为 0
    flush:清空DNS服务器的所有缓存记录

范例:

[root@centos7 ~]# rndc status
version: 9.9.4-RedHat-9.9.4-18.el7 <id:8f9657aa>
CPUs found: 2                                #CPU数量
worker threads: 2                            #工作线程
UDP listeners per interface: 2               #UDP在接口的监听百分比
number of zones: 101                         #区域的数量
debug level: 0                               #调错等级
xfers running: 0                             #运行中的xfers
xfers deferred: 0                            #延迟的xfers
soa queries in progress: 0                   #正在进行的SOA查询有多少个
query logging is OFF                         #查询日志功能是关闭的
recursive clients: 0/0/1000                  #递归查询的客户端有多少个,最多允许1000个
tcp clients: 0/100                           #tcp客户端有多少个,最多允许100个
server is up and running                     #服务器处于正常的启动状

允许动态更新

动态更新:可以通过远程更新区域数据库的资源记录

实现动态更新,需要在指定的zone语句块中:

Allow-update {any;};

范例:

chmod 770 /var/named
setsebool -P named_write_master_zones on
nsupdate
>server 127.0.0.1
>zone me.org
>update add ftp.me.org 88888 IN A 8.8.8.8
>send
>update delete www.me.org A
>send
#测试
dig ftp.me.org @127.0.0.1
ls -l /var/named/me.org.zone.jnl
cat /var/named/me.org.zone

实战案例:实现DNS正向主服务器

实验目的

搭建DNS正向主服务器,实现web服务器基于FQDN的访问

环境要求

需要三台主机
DNS服务端:10.0.0.8
web服务器:10.0.0.7
DNS客户端:10.0.0.6

前提准备

  • 关闭SElinux
  • 关闭防火墙
  • 时间同步
实现步骤

在DNS服务端安装bind

yum install bind -y

修改bind 配置文件

vim /etc/named.conf
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };

vim /etc/named.rfc1912.zones
#加上下面内容
zone "me.org" IN {
    type master;
    file "me.org.zone";
};

DNS区域数据库文件

cp -p /var/named/named.localhost /var/named/me.org.zone
#如果没有加-p选项,需要修改所有者或权限。chgrp named me.org.zone

vim /var/named/me.org.zone
$TTL 1D
@ IN SOA master admin.me.org. (
                2019042210 ; serial
                1D ; refresh
                1H ; retry
                1W ; expire
                3H ) ; minimum
@        NS master
master  A 192.168.8.8
*       A 192.168.8.7

www     CNAME websrv
websrv  A 192.168.8.7               

检查配置文件和数据库文件格式,并启动服务

named-checkconf
named-checkzone me.org /var/named/me.org.zone

systemctl start named     #第一次启动服务
rndc reload             #不是第一次启动服务

实现WEB服务

#安装http服务
yum install httpd
#配置主页面
echo www.me.org > /var/www/html/index.html
#启动服务
systemctl start httpd

在客户端实现测试

vim /etc/sysconfig/network-scripts/ifcfg-eth0
DNS1=192.168.8.8
#centos7 以上版执行现下面命令生效
nmcli con reload
nmcli con up eth0
#centos 6 执行下面命令生效
service network restart
#有以下记录,算是成功
cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.8.8

#测试网页,能显示就是成功
curl www.me.org
www.me.org

实现反向解析区域

反向解析配置

反向区域:即将IP反向解析为FQDN

区域名称:网络地址反写.in-addr.arpa.

示例:

172.16.100. --> 100.16.172.in-addr.arpa. #从小往大写

(1) 定义区域

zone "ZONE_NAME" IN {  // 反着写,如0.0.10.in-addr.arpa
    type {master|slave|forward};
    file "网络地址.zone"  // 数据库文件
};

(2) 定义区域解析库文件

注意:不需要MX,以PTR记录为主

范例:

$TTL 86400
$ORIGIN 8.168.192.in-addr.arpa.
@ IN SOA ns1.me.org. admin.me.org. (
                2015042201
                1H
                5M
                7D
                1D )
   IN NS ns1.me.org.
11 IN PTR ns1.me.org.
11 IN PTR www.me.org.
12 IN PTR mx1.me.org.
12 IN PTR www.me.org.
13 IN PTR mx2.me.org.

实战案例: 反向解析

[root@centos8 ~]#cat /etc/named.conf
options {
    ......
    listen-on port 53 { localhost; };
    ......
    allow-query   { any; };
    ......
}

[root@centos8 ~]#vim /etc/named.rfc1912.zones
zone "0.0.10.in-addr.arpa" {   // 反着写
 type master;
 file "10.0.0.zone";
};
[root@centos8 ~]#cd /var/named
[root@centos8 named]#cp -p named.loopback 10.0.0.zone
[root@centos8 named]#cat 10.0.0.zone
$TTL 1D
@ IN SOA ns1 admin.me.org. (
    0 ; serial
    1D ; refresh
    1H ; retry
    1W ; expire
    3H ) ; minimum
    NS  ns1.me.org.
100 PTR www.me.org.
200 PTR app.wange.org.

[root@centos8 named]#named-checkzone 0.0.10.in-addr.arpa 10.0.0.zone
zone 0.0.10.in-addr.arpa/IN: loaded serial 0
OK

[root@centos8 named]#systemctl restart named

# dig 检查反向解析域名
[root@centos6 ~]#dig -t ptr 100.0.0.10.in-addr.arpa. @10.0.0.8

100.0.0.10.in-addr.arpa. 86400 IN PTR www.me.org.
;; AUTHORITY SECTION:
0.0.10.in-addr.arpa. 86400 IN NS ns1.me.org.
;; ADDITIONAL SECTION:
ns1.me.org. 86400 IN A 10.0.0.7
;; Query time: 0 msec
;; SERVER: 10.0.0.8#53(10.0.0.8)
;; WHEN: Sat Jul 25 09:29:23 CST 2020
;; MSG SIZE rcvd: 142

[root@centos6 ~]#dig -x 10.0.0.100 @10.0.0.8
;; ANSWER SECTION:
100.0.0.10.in-addr.arpa. 86400 IN PTR www.me.org.
;; AUTHORITY SECTION:
0.0.10.in-addr.arpa. 86400 IN NS ns1.me.org.
;; ADDITIONAL SECTION:
ns1.me.org. 86400 IN A 10.0.0.7
;; Query time: 1 msec
;; SERVER: 10.0.0.8#53(10.0.0.8)
;; WHEN: Sat Jul 25 09:30:46 2020
;; MSG SIZE rcvd: 103

[root@centos6 ~]#host 10.0.0.100
100.0.0.10.in-addr.arpa domain name pointer www.me.org.
[root@centos6 ~]#nslookup 10.0.0.200
Server: 10.0.0.8
Address: 10.0.0.8#53

200.0.0.10.in-addr.arpa name = app.wange.org.
[root@centos6 ~]#nslookup
> 10.0.0.100
Server: 10.0.0.8
Address: 10.0.0.8#53
100.0.0.10.in-addr.arpa name = www.me.org.
> exit
C:\Users\wang>ping -a 10.0.0.100
正在 Ping www.me.org [10.0.0.100] 具有 32 字节的数据:
请求超时。
10.0.0.100 的 Ping 统计信息:
 数据包: 已发送 = 1,已接收 = 0,丢失 = 1 (100% 丢失),
Control-C
^C
C:\Users\wang>ping -a 10.0.0.200
正在 Ping app.wange.org [10.0.0.200] 具有 32 字节的数据:

实现从服务器

只有一台主DNS服务器,存在单点失败的问题,可以建立主DNS服务器的备份服务器,即从服务器来实现DNS服务的容错机制。从服务器可以自动和主服务器进行单向的数据同步,从而和主DNS服务器一样,也可以对外提供查询服务,但从服务器不提供数据更新服务。

DNS从服务器

  1. 应该为一台独立的名称服务器
  2. 主服务器的区域解析库文件中必须有一条NS记录指向从服务器
  3. 从服务器只需要定义区域,而无须提供解析库文件;解析库文件应该放置于/var/named/slaves/目录中
  4. 主服务器得允许从服务器作区域传送
  5. 主从服务器时间应该同步,可通过ntp进行
  6. bind程序的版本应该保持一致;否则,应该从高,主低
  7. 通过SOA的序列号实现从服务的同步,同步方式:推(主服务数据库添加从服 务器的NS记录),拉(从服务器定时更新1D ; refresh)

定义从区域

格式:

zone "ZONE_NAME" IN {
    type slave; 
    masters { MASTER_IP; };        // 指定主服务器地址
    file "slaves/ZONE_NAME.zone";  // 只须定义就行,同步时会自动创建
};

区域传输控制

vim /etc/named.conf

allow-transfer { none;};       // 从节点配置
allow-transfer { 从服务器IP;};  // 主节点配置,没有这个配置,dns记录可被其他人获取

范例:没有区域传输控制配置,抓取dns所有解析记录

dig -t axfr me.org @10.10.10.11  # 抓取dns服务器所有解析记录
dig –t axfr 100.1.10.in-addr.arpa @172.16.1.1

# dig -t axfr me.org @10.0.0.116
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.4 <<>> -t axfr me.org @10.0.0.116
;; global options: +cmd
me.org.            86400    IN    SOA    ns1.me.org. admin.me.org. 20210422 86400 3600 604800 10800
me.org.            86400    IN    NS    ns1.me.org.
ns1.me.org.        86400    IN    A    10.0.0.116
websrv.me.org.        86400    IN    A    10.0.0.117
www.me.org.        86400    IN    CNAME    websrv.me.org.
me.org.            86400    IN    SOA    ns1.me.org. admin.me.org. 20210422 86400 3600 604800 10800
;; Query time: 0 msec
;; SERVER: 10.0.0.116#53(10.0.0.116)
;; WHEN: Fri Apr 23 01:41:09 CST 2021
;; XFR size: 6 records (messages 1, bytes 188)

实战案例:实现DNS从服务器

实验目的

搭建DNS主从服务器架构,实现DNS服务冗余

环境要求

需要四台主机
DNS主服务器:192.168.8.8
DNS从服务器:192.168.8.18
web服务器:192.168.8.7
DNS客户端:192.168.8.6

前提准备

关闭SElinux
关闭防火墙
时间同步
实现步骤

主DNS服务端配置(参看前面案例)

yum install bind -y

vim /etc/named.conf
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };

#只允许从服务器进行区域传输
allow-transfer { 从服务器IP;};

vim /etc/named.rfc1912.zones
#加上这段
zone "me.org" {
  type master;
  file "me.org.zone";
};

cp -p /var/named/named.localhost /var/named/me.org.zone
#如果没有-p,需要改权限。chgrp named me.org.zone

vim /var/named/me.org.zone
$TTL 1D
@ IN SOA master admin.me.org. (
        1 ; serial
        1D ; refresh
        1H ; retry
        1W ; expire
        3H ) ; minimum
      NS master
      NS slave
master    A 192.168.8.8
slave     A 192.168.8.18  // 从服务器记录,主服务配置发生变化才会主动推送配置

systemctl start named   #第一次启动服务
rndc reload       #不是第一次启动服务

从DNS服务器配置

yum install bind -y

vim /etc/named.conf
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };

#不允许其它主机进行区域传输
allow-transfer { none;};

vim /etc/named.rfc1912.zones
zone "me.org" {
  type slave;
  masters { 主服务器IP;};
  file "slaves/me.org.slave";
};

systemctl start named   #第一次启动服务
rndc reload             #不是第一次启动服务
ls /var/named/slaves/me.org.slave #查看区域数据库文件是否生成

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

vim /etc/sysconfig/network-scripts/ifcfg-eth0
DNS1=主服务器
DNS2=从服务器

#验证从DNS服务器是否可以查询
dig www.me.org
curl www.me.org

#在主服务器上停止DNS服务
systemctl stop named

#验证从DNS服务器仍然可以查询
dig www.me.org
curl www.me.org

实现子域

子域委派授权

将子域委派给其它主机管理,实现分布式DNS数据库

正向解析区域子域方法

范例:定义两个子域区域

shanghai.me.org.        IN NS ns1.ops.me.org.
shanghai.me.org.        IN NS ns2.ops.me.org.
shenzhen.me.org.        IN NS ns1.shenzhen.me.org.
shenzhen.me.org.        IN NS ns2.shenzhen.me.org.
ns1.shanghai.me.org.    IN A 1.1.1.1
ns2.shanghai.me.org.    IN A 1.1.1.2
ns1.shenzhen.me.org.    IN A 1.1.1.3
ns2.shenzhen.me.org.    IN A 1.1.1.4

范例:实现DNS父域和子域服务

实验目的

image-20210423105256222.png

搭建DNS父域和子域服务器

环境要求

需要五台主机
DNS父域服务器:192.168.8.8
DNS子域服务器:192.168.8.18
父域的web服务器:192.168.8.7,www.me.org
子域的web服务器:192.168.8.17,www.shanghai.me.org
DNS客户端:192.168.8.6

前提准备

关闭SElinux
关闭防火墙
时间同步
实现步骤

在父域DNS服务器上实现主me.org域的主DNS服务

yum install bind -y

vim /etc/named.conf
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };

#只允许从服务器进行区域传输
allow-transfer { 从服务器IP;};
dnssec-enable no;
dnssec-validation no;

vim /etc/named.rfc1912.zones
#加上这段
zone "me.org" {
    type master;
    file "me.org.zone";
};

cp -p /var/named/named.localhost /var/named/me.org.zone
#如果没有-p,需要改权限。chgrp named me.org.zone

vim /var/named/me.org.zone
$TTL 1D
@ IN SOA master admin.me.org. (
                1 ; serial
                1D ; refresh
                1H ; retry
                1W ; expire
                3H ) ; minimum
            NS master
shanghai    NS shanghains  //子域

master      A 192.168.8.8
shanghains  A 192.168.8.18

websrv      A 192.168.8.7
www         CNAME websrv

systemctl start named #第一次启动服务
rndc reload           #不是第一次启动服务

实现子域的DNS服务器

yum install bind -y

# 子域名配置
vim /etc/named.conf
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
allow-transfer { none;};


vim /etc/named.rfc1912.zones
zone "shanghai.me.org" {
    type master;
    file "shanghai.me.org.zone";
};

cp -p /var/named/named.localhost /var/named/shanghai.me.org.zone
#如果没有-p,需要改权限。chgrp named me.org.zone

# 子域数据库
vim /var/named/shanghai.me.org.zone
$TTL 1D
@ IN SOA master admin.me.org. (
                2019042214 ; serial
                1D ; refresh
                1H ; retry
                1W ; expire
                3H ) ; minimum
            NS master
master      A  192.168.8.18
websrv      A  192.168.8.7
www         CNAME websrv

systemctl start named   #第一次启动服务
rndc reload             #不是第一次启动服务

在父域和子域的web服务器上安装httpd服务

#父域的web服务器利用上面案例(略)
#在子域的web服务器上安装http服务
yum install httpd
#配置主页面
echo www.shanghai.me.org > /var/www/html/index.html
#启动服务
systemctl start httpd

7.2.3.4 客户端测试

dig www.shanghai.me.org
www.shanghai.me.org

实现DNS转发(缓存)服务器

DNS转发

利用DNS转发,可以将用户的DNS请求,转发至指定的DNS服务,而非默认的根DNS服务器,并将指定服务器查询的返回结果进行缓存,提高效率。

注意:

  1. 被转发的服务器需要能够为请求者做递归,否则转发请求不予进行
  2. 在全局配置块中,关闭dnssec功能
#全局配置 关闭dnssec功能
dnssec-enable no;
dnssec-validation no;

转发方式

全局转发:

对非本机所负责解析区域的请求,全转发给指定的服务器

在全局配置块中实现:

Options {
        forward first|only;  // first先转发到目标主机,目标主机没有则转发互联网IP查询;only找不到了就算了
        forwarders { ip;};
};
特定区域转发

仅转发对特定的区域的请求,比全局转发优先级高。用的不多

zone "ZONE_NAME" IN {
    type forward;
    forward first|only;
    forwarders { ip;};
};

*first*:先转发至指定DNS服务器,如果无法解析查询请求,则本服务器再去根服务器查询

only:先转发至指定DNS服务器,如果无法解析查询请求,则本服务器将不再去 根服务器查询

实战案例:实现DNS forward(缓存)服务器

实验目的

搭建DNS转发(缓存)服务器

环境要求

需要四台主机
DNS只缓存服务器:192.168.8.8
DNS主服务器:192.168.8.18
web服务器:192.168.8.7
DNS客户端:192.168.8.6

前提准备

关闭SElinux
关闭防火墙
时间同步
实现步骤

实现转发(只缓存)DNS服务器

yum install bind -y

vim /etc/named.conf
#注释掉两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };

forward first; // first先转发到目标主机,目标主机没有则转发互联网IP查询
forwarders { 10.0.0.18;};

#关闭dnsec功能
dnssec-enable no;
dnssec-validation no;

systemctl start named   #第一次启动服务
rndc reload             #不是第一次启动服务

实现主DNS服务器

yum install bind -y

vim /etc/named.conf
#注释掉两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };

vim /etc/named.rfc1912.zones
#加上下面这段
zone "me.org" {
  type master;
  file "me.org.zone";
};

cp -p /var/named/named.localhost /var/named/me.org.zone
#如果没有-p,需要改权限。chgrp named me.org.zone

vim /var/named/me.org.zone

$TTL 1D
@ IN SOA master admin.me.org. (
        2019042214 ; serial
        1D ; refresh
        1H ; retry
        1W ; expire
        3H ) ; minimum
      NS master
master    A  10.0.0.18
websrv    A  10.0.0.7
www     CNAME websrv

systemctl start named #第一次启动服务
rndc reload           #不是第一次启动服务

web服务器配置

#安装http服务
yum install httpd
#配置主页面
echo www.me.org > /var/www/html/index.html
#启动服务
systemctl start httpd

在客户端测试

#客户端配置(参看前面案例,略)
dig www.me.org
curl www.me.org

实现智能DNS

image-20210122175455082.png

GSLB

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

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

GSLB主要的目的是在整个网络范围内将用户的请求定向到最近的节点(或者区域),就近CDN节点再访求缓存源站数据。

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

范例:查询VIP使用网宿的CDN服务

[root@centos6 ~]#dig www.vip.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6 <<>> www.vip.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44153
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 5, ADDITIONAL: 0

;; QUESTION SECTION:
;www.vip.com. IN A

;; ANSWER SECTION:
www.vip.com. 180 IN CNAME www.vip.com.wscdns.com.#wscdn 网宿服务商
www.vip.com.wscdns.com. 60 IN A 111.206.176.92

;; AUTHORITY SECTION:
wscdns.com. 172800 IN NS dns2.wscdns.info.
wscdns.com. 172800 IN NS dns3.wscdns.org.
wscdns.com. 172800 IN NS dns4.wscdns.info.
wscdns.com. 172800 IN NS dns5.cdn30.org.
wscdns.com. 172800 IN NS dns1.wscdns.org.

;; Query time: 1290 msec
;; SERVER: 10.0.0.18#53(10.0.0.18)
;; WHEN: Wed Feb 12 18:05:17 2020
;; MSG SIZE rcvd: 200

CDN (Content Delivery Network)内容分发网络

image-20210122175519053.png
CDN工作原理
  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. 请求结果发给用户

范例: CDN工作原理就近返回服务器地址

[root@centos6 ~]#cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 54.252.183.4
[root@centos6 ~]#ping www.jd.com -c1
PING jd-abroad.cdn20.com (163.171.197.13) 56(84) bytes of data.
64 bytes from 163.171.197.13: icmp_seq=1 ttl=128 time=266 ms
--- jd-abroad.cdn20.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 739ms
rtt min/avg/max/mdev = 266.711/266.711/266.711/0.000 ms
[root@centos6 ~]#cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 223.6.6.6
nameserver 180.76.76.76
[root@centos6 ~]#ping www.jd.com -c1
PING img2x-v6-sched.jcloudedge.com (123.6.29.3) 56(84) bytes of data.
64 bytes from hn.kd.ny.adsl (123.6.29.3): icmp_seq=1 ttl=128 time=3.04 ms
--- img2x-v6-sched.jcloudedge.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 22ms
rtt min/avg/max/mdev = 3.044/3.044/3.044/0.000 ms
[root@centos6 ~]#
CDN服务商
  • 服务商:阿里,腾讯,蓝汛,网宿,帝联等
  • 智能DNS: dnspod dns.la

智能DNS相关技术

bind中ACL

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

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

格式:

acl acl_name {
    ip;
    net/prelen;
    ……
};

范例:

# 把北京市所有IP归一个集合
acl beijingnet {
    172.16.0.0/16;
    10.10.10.10;
};
bind有四个内置的acl
  • none 没有一个主机
  • any 任意主机
  • localhost 本机
  • localnet 本机的IP同掩码运算后得到的网络地址
*访问控制的指令*:
  • allow-query {}: 允许查询的主机;白名单
  • allow-transfer {}:允许区域传送的主机;白名单
  • allow-recursion {}: 允许递归的主机,建议全局使用
  • allow-update {}: 允许更新区域数据库中的内容
view 视图

View:视图,将ACL和区域数据库实现对应关系,以实现智能DNS

  • 一个bind服务器可定义多个view,每个view中可定义一个或多个zone
  • 每个view用来匹配一组客户端
  • 多个view内可能需要对同一个区域进行解析,但使用不同的区域解析库文件

注意:

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

view 格式

view VIEW_NAME {
        match-clients { beijingnet; }; // 匹配ACL配置
        zone “me.org” {                // 匹配到ACL配置返回对应区数据库文件
            type master;
            file “me.org.zone.bj”;
        };
        include “/etc/named.rfc1912.zones”;
};

view VIEW_NAME {
        match-clients { shanghainet; };
        zone “me.org” {
            type master;
            file “me.org.zone.sh”;
        };
        include “/etc/named.rfc1912.zones”;
};

实战案例:利用view实现智能DNS

实验目的

搭建DNS主从服务器架构,实现DNS服务冗余

环境要求

需要3台主机
DNS主服务器和web服务器1:192.168.8.8/24,10.0.0.8/16
web服务器2:10.0.0.7/24     北京 172.16.0.7/16   上海
DNS客户端1:10.0.0.6/24     北京 172.16.0.6/16   上海

前提准备

关闭SElinux
关闭防火墙
时间同步
实现步骤

DNS 服务器的网卡配置

#配置两个IP地址
#eth0:10.0.0.8/24
#eth1: 172.16.0.8/16
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group
default qlen 1000
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
  inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group
default qlen 1000
  link/ether 00:0c:29:f9:8d:90 brd ff:ff:ff:ff:ff:ff
  inet 10.0.0.8/24 brd 192.168.8.255 scope global noprefixroute eth0
    valid_lft forever preferred_lft forever
  inet6 fe80::20c:29ff:fef9:8d90/64 scope link
    valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group
default qlen 1000
  link/ether 00:0c:29:f9:8d:11 brd ff:ff:ff:ff:ff:ff
  inet 172.16.0.8/16 brd 172.16.0.255 scope global noprefixroute eth1
    valid_lft forever preferred_lft forever
  inet6 fe80::20c:29ff:fe11:8d90/64 scope link
    valid_lft forever preferred_lft forever

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

yum install bind -y

vim /etc/named.conf
#在文件最前面加下面行
acl beijingnet {
  10.0.0.0/24;
};
acl shanghainet {
  172.16.0.0/16;
};
acl othernet {
  any;  // 其它IP
};

#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };

# 主配置不保留根配置,要放到named.rfc1912.zones文件中
// zone "." IN {
//  type hint;  // 根解析得有
//  file "named.ca";
//};

#其它略

# 创建view
view beijingview {
  match-clients { beijingnet;};
  include "/etc/named.rfc1912.zones.bj";
};
view shanghaiview {
  match-clients { shanghainet;};
  include "/etc/named.rfc1912.zones.sh";
};
view otherview {
  match-clients { othernet;};
  include "/etc/named.rfc1912.zones.other";
};
// include "/etc/named.rfc1912.zones"; 删除这个配置
include "/etc/named.root.key";

实现区域配置文件

vim /etc/named.rfc1912.zones.bj
zone "." IN {
  type hint;  // 根解析得有
  file "named.ca";
};
zone "me.org" {
  type master;
  file "me.org.zone.bj";
};

vim /etc/named.rfc1912.zones.sh
zone "." IN {
  type hint;
  file "named.ca";
};
zone "me.org" {
  type master;
  file "me.org.zone.sh";
};

vim /etc/named.rfc1912.zones.other
zone "." IN {
  type hint;
  file "named.ca";
};
zone "me.org" {
  type master;
  file "me.org.zone.other";
};

# 修改限制
chgrp named /etc/named.rfc1912.zones.bj
chgrp named /etc/named.rfc1912.zones.sh
chgrp named /etc/named.rfc1912.zones.other

创建区域数据库文件

vim /var/named/me.org.zone.bj
$TTL 1D
@ IN SOA master admin.me.org. (
        2019042214 ; serial
        1D ; refresh
        1H ; retry
        1W ; expire
        3H ) ; minimum
      NS  master
master    A   10.0.0.8
websrv    A   10.0.0.7
www     CNAME websrv

vim /var/named/me.org.zone.sh
$TTL 1D
@ IN SOA master admin.me.org. (
        2019042214 ; serial
        1D ; refresh
        1H ; retry
        1W ; expire
        3H ) ; minimum
      NS master
master    A 10.0.0.8
websrv    A 172.16.0.7
www     CNAME websrv

vim /var/named/me.org.zone.other
$TTL 1D
@ IN SOA master admin.me.org. (
        2019042214 ; serial
        1D ; refresh
        1H ; retry
        1W ; expire
        3H ) ; minimum
      NS master
master    A 10.0.0.8
websrv    A 127.0.0.1
www CNAME websrv

chgrp named /var/named/me.org.zone.bj
chgrp named /var/named/me.org.zone.sh
chgrp named /var/named/me.org.zone.other

systemctl start named #第一次启动服务
rndc reload #不是第一次启动服务

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

#分别在三台主机上安装http服务
#在web服务器1:10.0.0.8/24实现
yum install httpd
echo www.me.org in Other > /var/www/html/index.html
systemctl start httpd
#在web服务器2:10.0.0.7/16
echo www.me.org in Beijing > /var/www/html/index.html
systemctl start httpd
#在web服务器3:172.16.0.7/16
yum install httpd
echo www.me.org in Shanghai > /var/www/html/index.html
systemctl start httpd

客户端测试

#分别在三台主机上访问
#DNS客户端1:10.0.0.6/24 实现,确保DNS指向10.0.0.8
curl www.me.org
www.me.org in Beijing
#DNS客户端2:172.16.0.6/16 实现,确保DNS指向172.16.0.8
curl www.me.org
www.me.org in Shanghai
#DNS客户端3:10.0.0.8 实现,,确保DNS指向127.0.0.1
curl www.me.org
www.me.org in Other

DNS排错

范例:

dig A example.com

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> A example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30523
...

SERVFAIL:The nameserver encountered a problem while processing the query.

可使用dig +trace排错,可能是网络和防火墙导致

NXDOMAIN:The queried name does not exist in the zone.

可能是CNAME对应的A记录不存在导致

REFUSED:The nameserver refused the client's DNS request due to policy restrictions.

可能是DNS策略导致

实战案例

实战案例:综合案例,实现Internet 的DNS 服务架构

1 实验目的

image-20210422044142685.png
搭建DNS实现internet dns架构

2 环境要求

需要8台主机
DNS客户端:10.0.0.7/24
本地DNS服务器(只缓存):10.0.0.8/24
转发目标DNS服务器:10.0.0.18/24
根DNS服务器:10.0.0.28/24
org域DNS服务器:10.0.0.38/24
me.org域主DNS服务器:10.0.0.48/24
me.org域从DNS服务器:10.0.0.58/24
www.me.org的WEB服务器:10.0.0.68/24

3 前提准备

关闭SElinux
关闭防火墙
时间同步
实现步骤

各种主机的网络配置

#在客户端配置DNS服务器地址
vim /etc/sysconfig/network-scripts/ifcfg-eth0
NAME=eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=10.0.0.7
NETMASK=255.255.255.0
DNS1=10.0.0.8
ONBOOT=yes

service network restart

实现WEB服务

#在web服务器10.0.0.68/24上实现
yum install httpd
echo www.me.org > /var/www/html/index.html
systemctl start httpd

实现me.org域的主DNS服务器

#在me.org域主DNS服务器10.0.0.48/24上实现
yum install bind -y

vim /etc/named.conf
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
#语法检查
named-checkconf 

#只允许从服务器进行区域传输
allow-transfer { 从服务器IP;};

vim /etc/named.rfc1912.zones
#加上这段
zone "me.org" {
  type master;
  file "me.org.zone";
};

vim /var/named/me.org.zone
$TTL 1D
@ IN SOA master admin.me.org. (
        1 ; serial
        1D ; refresh
        1H ; retry
        1W ; expire
        3H ) ; minimum
    NS  master
    NS  slave
master  A   10.0.0.48
slave   A   10.0.0.58
www   A   10.0.0.68

chgrp named /var/named/me.org.zone

systemctl start named #第一次启动服务
rndc reload           #不是第一次启动服务

实现me.org域的从DNS服务器配置

#在me.org域从DNS服务器10.0.0.58/24上实现
yum install bind -y

vim /etc/named.conf
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
#不允许其它主机进行区域传输
allow-transfer { none;};

vim /etc/named.rfc1912.zones
zone "me.org" {
  type slave;
  masters { 主服务器IP;};
  file "slaves/me.org.slave";
};

systemctl start named   #第一次启动服务
rndc reload             #不是第一次启动服务
ls /var/named/slaves/me.org.slave #查看区域数据库文件是否生成

实现org域的主DNS服务器

#在org域的主DNS服务器10.0.0.38/24上实现
yum install bind -y

vim /etc/named.conf
#注释掉两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };

vim /etc/named.rfc1912.zones
#加上这段
zone "org" {
  type master;
  file "org.zone";
};

vim /var/named/org.zone
$TTL 1D
@ IN SOA master admin.me.org. ( 1 1D 1H 1W 3D )
     NS master
me   NS mens1
me   NS mens2
master   A  10.0.0.38
mens1    A 10.0.0.48
mens2    A 10.0.0.58

chgrp named /var/named/org.zone

systemctl start named   #第一次启动服务
rndc reload             #不是第一次启动服务

实现根域的主DNS服务器

#在根域的主DNS服务器10.0.0.28/24上实现
yum install bind -y
vim /etc/named.conf
#注释掉两行,第13行和第21行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
#将下面行改为:
zone "." IN {
  type master;
  file "root.zone";
};

# 其它dns服务器做委派
vim /var/named/root.zone
$TTL 1D
@ IN SOA master admin.me.org. ( 1 1D 1H 1W 3D )
     NS   master
org    NS   orgns
master   A 10.0.0.28
orgns    A 10.0.0.38

#安全加固
chgrp named /var/named/root.zone
chmod 640 /var/named/root.zone

systemctl start named   #第一次启动
rndc reload             #不是第一次启动

4.7 实现转发目标的DNS服务器

#在转发目标的DNS服务器10.0.0.18/24上实现
yum install bind -y

vim /etc/named.conf
#注释掉两行,第13行和第21行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
// 关闭dnssec功能,跟安全加密有关
dnssec-enable no;
dnssec-validation no

# 数据库只保留自定义根域名服务器地址
vim /var/named/named.ca
.             518400  IN   NS   a.root-servers.net.
a.root-servers.net.   3600000 IN   A    10.0.0.28

systemctl start named #第一次启动
rndc reload           #不是第一次启动

实现本地只缓存DNS服务器

实现转发功能

#在转发目标的DNS服务器10.0.0.8/24上实现
yum install bind -y

vim /etc/named.conf
#注释掉两行,第13行和第21行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };

forward only;
forwarders { 10.0.0.18;};

dnssec-enable no;
dnssec-validation no

systemctl start named   #第一次启动
rndc reload             #不是第一次启动

客户端测试

cat /etc/resolv.conf
nameserver 10.0.0.8

dig www.me.org

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.3 <<>> www.me.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4873
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.me.org.      IN  A

;; ANSWER SECTION:
www.me.org.   86400 IN  A 10.0.0.68

;; AUTHORITY SECTION:
me.org. 86181 IN NS ns2.me.org.
me.org. 86181 IN NS ns1.me.org.

;; ADDITIONAL SECTION:
ns2.me.org. 86181 IN A 10.0.0.48
ns1.me.org. 86181 IN A 10.0.0.58

;; Query time: 8 msec
;; SERVER: 10.0.0.8#53(10.0.0.8)
;; WHEN: Sun May 31 08:47:45 CST 2020
;; MSG SIZE  rcvd: 59     成功

curl www.me.org
www.me.org

范例:自建dns服务器,数据库绑定MySQL

#1. 初始化和安装bind9
#挂载:
parted /dev/vdb print
parted /dev/vdb mklabel gpt
parted /dev/vdb help mkpart
parted /dev/vdb mkpart primary xfs 0G 107G
parted /dev/vdb print
mkfs.xfs /dev/vdb1
mkdir /data
blkid
vim /etc/fstab

#基础依赖包
yum install -y gcc*  openssl-devel  ncurses-devel
#安装mysql
./configure --prefix=/usr/local/mysql && make && make install

#连接lib库文件
ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.15 /lib64/libmysqlclient.so.15

#安装DNS服务
./configure  --prefix=/data/named --with-dlz-mysql=/usr/local/mysql --enable-threads=no --disable-openssl-version-check && make && make install

#启动DNS服务
cp named.conf  到 /data/named/etc 下
修改host,user,pass 为当前数据库的对应信息key 信息
cp rndc.key /data/named/etc/

nohup /data/named/sbin/named -gc /data/named/etc/named.conf >>/tmp/dns.log&

chmod +x  /etc/rc.d/rc.local
echo 'nohup /data/named/sbin/named -gc /data/named/etc/named.conf >>/tmp/dns.log&' >>/etc/rc.d/rc.local

测试:
/data/named/bin/dig -t A baidu.com @127.0.0.1

#2.配置
cat >>/data/named/etc/named.conf<<\EOF
options {
    recursion  yes;
    recursive-clients 100;
    directory "/data/named/etc"; #zone文件存放目录
    pid-file "named.pid";
    Forwarders {
        #219.141.136.10;             #将dns中配置的域名以外的域,转发到8.8.8.8, 202.106.196.115进行解析。
        #219.141.140.10;};
        8.8.8.8;
        100.100.2.138;
        100.100.2.136;};   # aliyun dns

        #114.114.114.114;};
        #219.141.136.10;             #将dns中配置的域名以外的域,转发到8.8.8.8, 202.106.196.115进行解析。
                #8.8.8.8;};
        Allow-query {any;};
        Dump-file "/data/named/cache_dump.db";
        Statistics-file "/data/named/named_stats.txt";
        version "TUANP BIND V9"; #为了安全起见,修改dns的版本号。
        listen-on port 53 {any;};
};
key "rndc-key" {
    algorithm hmac-md5;
    secret "xYbShtvVJ2W/1ZUB7H5AXw==";
};

controls {
        inet 127.0.0.1 port 953
                allow { 127.0.0.1; } keys { "rndc-key"; };
};

dlz "Mysql zone" {
database "mysql
{host=hb2-yu-dns-dbm-local.mysql.rds.aliyuncs.com dbname=dns_db ssl=false port=3306 user=mdns pass=DmUO4A33}
{select zone from dns_dns where zone = '$zone$' and status = 'online'}
{select ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"')
        when lower(type) = 'soa' then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum)
        else data end from dns_dns where zone = '$zone$' and host = '$record$' and status = 'online'}";
};
EOF

cat >>/data/named/etc/rndc.key<<EOF
key "rndc-key" {
    algorithm hmac-md5;
    secret "xYbShtvVJ2W/1ZUB7H5AXw==";
};
EOF

#3.安装检查脚本
python 安装
./configure --prefix=/usr/local/python3 && make && make install
/usr/local/python3/bin/pip3 install requests
ln -sv /usr/local/python3/bin/python3 /usr/bin/python3
ln -sv /usr/local/python3/bin/pip3 /usr/bin/pip3
crontab -l
*/1 * * * * /usr/bin/python3 /data/work/open-falcon/script/dns_qps_check.py

mkdir -pv /data/work/open-falcon/script/
cat >/data/work/open-falcon/script/check_dns.sh<<\EOF
#!/bin/bash
timestamp=`date +%s`
host_name=`hostname`
### check dns ###
num=`ps -ef | grep "named" | grep -v grep | wc -l`
curl -X POST -d '[{"metric": "dns.daemon_status", "endpoint": "'$host_name'", "timestamp": '$timestamp', "step": 60,"value": '$num',"counterType": "GAUGE","tags": ""}]' http://127.0.0.1:1988/v1/push
EOF

#---
cat >/data/work/open-falcon/script/dns_dig_check.py<< \EOF
# !/usr/bin/env python
# -*- coding:utf-8 -*-
#脚本执行前 在各个机房二级域名中加入testmonitor ip指定1.1.1.1
import dns.resolver
import time
import json
import socket
import requests

ts = int(time.time())
hostname = socket.gethostname()
hlg_domain = ['testmonitor.xi','testmonitor.jmww.me']
hb2yxh_domain = ['testmonitor.zo.yu','testmonitor.yu','testmonitor.xi','testmonitor.me']
hd_domain = ['testmonitor.yun','testmonitor.xiyun','testmonitor.zys.me']
hb2sc_domain = ['testmonitor.yun','yunzongnet.antcloud']
#wl_domain = ['testmonitor.yun','testmonitor.yun.me']
wl_domain = ['testmonitor.yun']
domain = "testmonitor.yun"
for domain in hlg_domain:
    try:
        A = dns.resolver.query(domain,"A")
        for i in A.response.answer:
            for k in i.items:
                ip = k.address
                if ip == "1.1.1.1":
                    metricname = "%s_dnscheck" % domain
                    payload = [{"endpoint": hostname,"metric": metricname,"timestamp": ts,"step": 60,\
                                "value": 1,"counterType": "GAUGE","tages": ""}]
                    r = requests.post("http://127.0.0.1:1988/v1/push", data=json.dumps(payload))
                else:
                    payload = [{"endpoint": hostname,"metric": metricname,"timestamp": ts,"step": 60,\
                            "value": 0,"counterType": "GAUGE","tages": ""}]
                    r = requests.post("http://127.0.0.1:1988/v1/push", data=json.dumps(payload))
    except:
        payload = [{"endpoint": hostname,"metric": metricname,"timestamp": ts,"step": 60,\
                    "value": 0,"counterType": "GAUGE","tages": ""}]
        r = requests.post("http://127.0.0.1:1988/v1/push", data=json.dumps(payload))
EOF

#----------------------------
cat >/data/work/open-falcon/script/dns_qps_check.py<<\EOF
import subprocess
import os

import time
import json
import socket
import requests
ts = int(time.time())
hostname = socket.gethostname()
os.system("> /data/named/named_stats.txt")
os.system("/data/named/sbin/rndc stats")
dns_query = subprocess.getoutput("cat /data/named/named_stats.txt|grep QUERY")
first_query = dns_query.replace("QUERY","").replace(" ","").strip("\n")
time.sleep(1)
os.system("> /data/named/named_stats.txt")
os.system("/data/named/sbin/rndc stats")
dns_query = subprocess.getoutput("cat /data/named/named_stats.txt|grep QUERY")
second_query = dns_query.replace("QUERY","").replace(" ","").strip("\n")
qps_monitor_res = int(second_query) - int(first_query)
print (qps_monitor_res)
EOF