DNS服务

DNS服务工作原理

递归查询

是指DNS服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果,如果DNS服务器本地没有存储与之对应的信息,
则该服务器需要询问其他服务器,并将返回的查询结果提交给用户

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

递归算法:客户端向LocalDNS发起域名查询-->localDNS不知道域名对应的IP-->
但它知道谁知道->他代为帮客户端去查找-->最后再返回最终结果

迭代查询

是指DNS服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台DNS服务器的
地址,用户再向这台DNS服务器提交请求,这样依次反复,直到返回查询结果

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

迭代算法︰客户端向LocalDNS发起域名查询-->localDNS不知道域名对应的IP-->但它知道谁知道并
推荐客户端应该找谁-->客户端自己去找它

DNS 缓存

DNS缓存是将解析数据存储在靠近发起请求的客户端的位置,也可以说DNS数据是可以缓存在任意
位置,最终目的是以此减少递归查询过程,可以更快的让用户获得请求结果。

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

client-->hosts--->client DNS service local cache-->DNS server(recursion)->DNS server cache --> DNS iteration ---> root ---> 顶级域名 ---> 二级域名DNS....

解析类型

FQDN --> IP正向解析
IP ---> FQDN 反向解析

DNS概念

DNS服务器类型

区域传输

传输解析库

解析答案

各种资源记录

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

资源记录定义

name [TTL]  IN  rr_type  value 

区域名字,不写可以从上一个记录继承  time to live 生存值  资源记录类型  值
TTL 可以全局继承
@符合可以引用当前区域的域名
同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应
. 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进行定义;此仅表示通过多个不同的名字可以找到同一个主机

区域解析库示例,假定域名example.com

$TTL 86400    ; 默认的TTL值(1天)
;@   IN  SOA  ns1.example.com. admin.example.com.
;此区域名 IN  SOA  负责此解析库的主机,简写ns1也是可以的  管理员邮箱.代替@
@   IN  SOA  ns1.example.com. admin.example.com. (
            2024053101 ; 序列号
            3600       ; 刷新时间(1小时)
            900        ; 重试时间(15分钟)
            604800     ; 过期时间(1周)
            86400      ; 最小TTL(1天)
            )
        IN  NS      ns1.example.com.    ;省略name从上面继承
        IN  NS      ns2.example.com.    ;指定NS,即此name由哪个主机负责解析

; A 记录
@       IN  A       192.0.2.1
www     IN  A       192.0.2.2

; AAAA 记录
@       IN  AAAA    2001:db8::1
www     IN  AAAA    2001:db8::2

; PTR 记录(假设反向域名为1.2.0.192.in-addr.arpa和1.db8.0.2001.ip6.arpa)
1.2.0.192.in-addr.arpa.  IN  PTR example.com.
2.2.0.192.in-addr.arpa.  IN  PTR www.example.com.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. IN PTR example.com.
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. IN PTR www.example.com.

; NS 记录
ns1     IN  A       192.0.2.1
ns2     IN  A       192.0.2.2

; CNAME 记录
alias   IN  CNAME   www.example.com.

; MX 记录
@       IN  MX 10   mail.example.com.
mail    IN  A       192.0.2.3

; TXT 记录
@       IN  TXT     "v=spf1 include:example.com ~all"

DNS软件bind

bind:服务器
bind-utils: 客户端
bind-libs:相关库,依赖关系自动安装
bind-chroot: 安全包,将dns相关文件放至 /var/named/chroot/

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
注意:
(1) 一台物理服务器可同时为多个区域提供解析
(2) 必须要有根区域文件;named.ca
(3) 应该有两个(如果包括ipv6的,应该更多)实现localhost和本地回环地址的解析库

主配置文件


#需要注释的行
// listen-on port 53 { 127.0.0.1; };
// allow-query     { localhost; };


#需要修改的行,改为no
dnssec-enable no;             
dnssec-validation no;

#需要添加的行

做master,允许区域传输
allow-transfer { 从服务器IP;}; 

做slave,不允许区域传输
allow-transfer { none;}; 

#最小化回答
minimal-responses yes;

各种DNS服务的解析库和对应的配置文件配置

zone 后面的名字 可以不和 file 后面的名字相同
1. DNS正向解析
#配置文件
zone "wang.org" IN {
   type master;
   file  "wang.org.zone";
};
#保留文件属性设置
cp -p /var/named/named.localhost /var/named/wang.org.zone
$TTL 1D
@ IN SOA master admin.wang.org. (
            2019042210 ; serial  #如果想从服务器能更新,每次修改完主的配置,此数字要增加
            1D ; refresh
            1H ; retry
            1W ; expire
            3H ) ; minimum
       NS master
master     A    10.0.0.8         
www     A    10.0.0.7

named-checkconf #检查配置文件语法
named-checkzone wang.org /var/named/wang.org.zone  #检查区域和区域对应的解析库文件是否正确
systemctl start named         


2.实现主从DNS服务器
主:
allow-transfer { 从服务器IP;}; 
zone "wang.org" {
   type master;
   file  "wang.org.zone";
};

$TTL 1D
@ IN SOA master admin.wang.org. (
                1 ; serial
                1D ; refresh
                1H ; retry
                1W ; expire
                3H ) ; minimum
           NS master
           NS slave
master     A    10.0.0.8
slave       A    10.0.0.18

从:
allow-transfer { none;};  #写在主配置的options中
zone "wang.org" {
   type slave;
   masters { 主服务器IP;}; 
   file "slaves/wang.org.slave";
};
区域配置文件不需要写,会自动生成


3.实现子域
父DNS 中指明 子的 
域名子  NS   主机名
主机名  A   IP


在子DNS中
正常配置就行,使用父指定的子域



4.DNS 转发(缓存)服务器
    转发的DNS服务器会缓存DNS查询
1.全局转发
    对非本机所负责解析区域的请求,全转发给指定的服务器
    在全局配置块中实现
    only:转发的服务器没查到,就不查了,
    first:转的服务器没查到,向root查询,然后进行迭代查询进行查找
    Options {
   forward first|only;  
   forwarders { ip;};
 };

 2 特定区域转发
仅转发对特定的区域的请求,比全局转发优先级高
zone "ZONE_NAME" IN {
 type forward;
 forward first|only;
 forwarders { ip;};
};

客户端DNS缓存

红帽系:默认没有, 安装nscd
yum -y install nscd
systemctl enable --now nscd
nscd -g  #查看缓存信息
nscd -i hosts  #清除DNS客户端缓存

Ubuntu 启用DNS客户端缓存
ubuntu 默认会启用DNS客户端缓存
systemctl status systemd-resolved.service
systemd-resolve --statistics
systemd-resolve --flush-caches
systemd-resolve --statistics

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. 请求结果发给用户

DNS排错

DNS 服务常见故障如下
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策略导致

常用命令

whois baidu.com #查询域名归属
named-checkconf   #检查配置文件是否正确
named-checkzone "wang.org" /var/named/wang.org.zone #解析库文件语法检查
dig www.baidu.com @114.114.114.114  #指定dns服务器查询对应的域名
dig -x 114.114.114.114  #反向DNS

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