一、DNS
域名服务器,实现IP和域名的转换
 
 DNS 
 协议运行在 
 UDP 
 协议之上,使用端口号 
 53 
 
2.结构

 
 DNS 
 的命名空间的结构如下: 
 
 
 1.  
 根域名( 
 Root Domain 
 ):  
 根域名位于 
  DNS  
 命名空间的顶部,它表示空字符串( 
 "" 
 ),通常以  
 
 
 一个点号( 
 . 
 )表示。根域名下面直接连接着顶级域名( 
 TLD 
 )。  
 
 
 2.  
 顶级域名( 
 Top-Level Domain 
 , 
 TLD 
 ):  
 顶级域名是根域名的直接子节点,例如  
 
 
 ".com" 
 、 
 ".net" 
 、 
 ".org" 
 、 
 ".gov" 
 、 
 ".edu"  
 等。顶级域名用于表示域名的类型或所属组织类型。  
 
 
 3.  
 二级域名( 
 Second-Level Domain 
 , 
 SLD 
 ):  
 二级域名是位于顶级域名之下的域名部分,例如  
 
 
 ".example" 
 。二级域名通常用于表示特定的组织、公司或网站。  
 
 
 4.  
 子域名( 
 Subdomain 
 ):  
 子域名是位于二级域名之下的域名部分,例如 
  " 
 www.example.com 
 "  
 
 
 中的 
  "www"  
 就是一个子域名。子域名通常用于区分不同的服务、部门或功能。 
 
 
 example是权威域名,权威域名是递归访问 
 
 
 
二、DNS报文结构
 
 有任何网络通信协议一样, 
 DNS  
 请求报文和应答报文均需要满足一定的格式,才能被通信双方所理解。这就是 
  DNS  
 协议负责的范畴,它位于传输层之上,属于  
 应用层  
 协议。 
 
 
 
  DNS  
  报文分为  
  请求  
  和  
  应答  
  两种,结构是类似的,大致分为五部分:  
 
 
  
  头部(  
  header  
  ),描述报文类型,以及其下 
   4  
  个小节的情况;  
 
 
  
  问题节(  
  question  
  ),保存查询问题;  
 
 
  
  答案节(  
  answer  
  ),保存问题答案,也就是查询结果;  
 
 
  
  授权信息节(  
  authority  
  ),保存授权信息;  
 
 
  
  附加信息节(  
  additional  
  ),保存附加信息; 
 
 

问题记录

 
   一个问题记录由 
    3  
   个字段组成:  
  
 
  - 待查询域名( Name ),这个字段长度不固定,由具体域名决定;
- 查询类型 :
 
           ( Type ),域名除了关联 IP 地址,还可以关联其他信息,常见类型包括(下节详细介                       绍):  
  
 
  1 表示 A 记录,即 IP 地址;
28 表示 AAAA 记录,即 IPv6 地址;
etc
- 类 ( Class )通常为 1 ,表示互联网地址;
 
   域名字段,它的长度是不固定的。域名按  
   .  
   切分成若干部分,再依次保存。每个部分由一个前导计数字节开头,记录当前部分的字符数。  
  
 
 
    常用DNS解析的类型 
 
 
 
 
资源记录
 
   服务端处理查询请求后,需要向客户端发送应答报文; 
   域名查询结果 
   作为 
   资源记录 
   ,保存在答案以及其后两节中。 
  
 
   
 
   
    答案节、授权信息节和附加信息节均由一条或多条资源记录组成,记录数目保存在头部中的对应字段,不再赘述。  
   
 
    
 
   
     答应报文 
   
 
    
 
   解析类型
 
  当我们查询一个域名时,首先查找本地域名 本地的缓存
本地的缓存 根域名服务器
根域名服务器 
 
 
 DNS记录类型
 
   实际上,域名和与之关联的信息,就构成了一条  
   DNS 
   记录  
   (  
   DNS record  
   )。 
   DNS 
   记录可以理解成一个  
   键值对:  
  
 
  - 键:域名;
- 值:与域名关联的值
 
    除了 
     IP  
    地址, 
    DNS 
    记录值还可以是 
     IPv6  
    地址、别名、文本等等。据此, 
    DNS 
    记录可分为若干不同类型,包括: 
   
 
   - A ,主机 IP 地址;
- AAAA ,主机 IPv6 地址;
- ALIAS ,自动解析的别名( alias );
- CNAME ,别名的权威名称( canonical name );
- MX ,邮件交换服务器( Mail eXchange );
- NS ,域名服务器( name server );
- TXT ,描述文本;
A记录
[root@netbox ~]# dig test.fasionchan.com
; <<>> DiG 9.16.1-Ubuntu <<>> test.fasionchan.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49579
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;test.fasionchan.com. IN A
;; ANSWER SECTION:
test.fasionchan.com. 752 IN A 10.0.0.1
;; Query time: 71 msec
;; SERVER: 192.168.65.1#53(192.168.65.1)
;; WHEN: Mon Apr 26 17:22:16 CST 2021
;; MSG SIZE rcvd: 53CNAME记录
 
    CNAME  
    记录,表示别名的  
    权威名称  
    (  
    canonical name  
    )。  
   
 
    
    域名可以取别名,以  
    webserver.fasionchan.com  
    为例,它可以取一个别名,比如:  
   
 
    
    network.fasionchan.com  
    。如此一来称前者是后者的  
    权威名称  
    , 
    CNAME  
    记录则保存权威名称。 
   
 
  MX记录
 
   MX  
   记录,表示  
   邮件交换  
   (  
   mail exchange  
   )服务,即邮件服务器。其中, 
   MX  
   是 
    Mail eXchange  
   的缩写。  
  
 
   
   电子邮件可以是说是互联网中发展最早,应用最为广泛的应用。我们发送邮件时,客户端需要根据自己的邮箱账号找到邮件服务器的地址,并通过 
    SMTP  
   协议和它进行通信。  
  
 
   
   每个邮件厂商都有一个自己的域名,查询该域名的 
    MX  
   记录,即可找到邮件服务器的地址。以 
    QQ 
   邮箱为例,它的域名是  
   qq.com  
   。 
  
 
  NS记录
 
   NS  
   记录,保存着负责该域解析的权威 
   DNS 
   服务器,记录值为 
   DNS 
   服务器的域名。  
  
 
   
   以我的域名  
   fasionchan.com  
   为例,它在腾讯云  
   dnspod  
   上解析。我注册域名后,需要配置 
    NS  
   记  
  
 
   
   录,指向  
   dnspod  
   服务器。这个 
    NS  
   记录,最终会被同步到  
   .com  
   顶级域名服务器。 
  
 
  TXT记录
 
    TXT  
    记录用来保存一些文本信息,这些信息可以用作配置,但不太常见。  
   
 
    
    很多地方使用 
     TXT  
    记录来验证域名所有权:先让域名所有人配置一条特殊的 
     TXT  
    记录,然后查询该记  
    录看结果是否匹配。 
   
 
   三、DNS安全和防护
劫持原理
 
 
      
      由于家用路由器质量参差不齐,存在不少潜在安全漏洞。一旦家里的路由器被黑客攻破,黑客可以在DNS  
      代理上做手脚,将域名指到钓鱼站点进行欺诈。 
     
 
      
 
      
       如上图,路由器被黑客攻破,它的 
        DNS  
       代理服务被黑客控制。黑客在 
        DNS  
       代理上做手脚,将某个网站的域名,指向自己精心布置的钓鱼站点。这样的话,依靠 
        DNS  
       代理查询域名的终端,将被强制劫持到  
       钓鱼站点。  
      
 
       
       这就是所谓的  
       DNS 
       劫持  
       (  
       DNS Hijacking  
       ): 
       DNS  
       服务器受到攻击导致域名指向被黑客篡改。一旦域名被劫持到钓鱼网站,结果可能是灾难性的。  
      
 
      防御措施
 
       证书认证  
      
 
       
        启用 
         HTTPS  
        协议 
       
 
       
  公共 
  DNS 
  服务  
 
 
  
  很多 
  互联网大厂都提供了公共 
   DNS  
  服务,这些服务器由背后的公司背书,值得信任。这个表格列举了  
 
 
  
  一些常见的公共 
   DNS  
  服务: 
 
 
  
 
 四、实验,DNS服务部署
安装并启动服务
[root@dnsserver ~]# yum -y install unbound
[root@dnsserver ~]# rpm -qa | grep unbound
python3-unbound-1.7.3-14.el8.x86_64
unbound-libs-1.7.3-14.el8.x86_64
unbound-1.7.3-14.el8.x86_64
[root@dnsserver ~]# systemctl enable --now unbound
Created symlink /etc/systemd/system/multi-user.target.wants/unbound.service
→ /usr/lib/systemd/system/unbound.service.
[root@dnsserver ~]# systemctl status unbound
[root@dnsserver ~]# ss -anput | grep 53
# 注意防火墙以及SELinux
[root@dnsserver ~]# firewall-cmd --add-service=dns --permanent
[root@dnsserver ~]# firewall-cmd --reload 
 此时,修改 
 /etc/resolv.conf  
 中 
 nameserver 
 的值为 
  127.0.0.1  
 则可以使用 
 127.0.01  
 来进行域名解析,下面是一个简单的验证 
 
[root@dnsserver ~]# dig www.baidu.com
; <<>> DiG 9.11.13-RedHat-9.11.13-3.el8 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45619
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 1126 IN CNAME www.a.shifen.com.
www.a.shifen.com. 226 IN A 110.242.68.3
www.a.shifen.com. 226 IN A 110.242.68.4
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)   #注意这里是修改后的服务器IP
;; WHEN: Tue Apr 23 09:23:30 PDT 2024
;; MSG SIZE rcvd: 101配置缓存
 
 现在尝试让 
 dnsserver 
 以外的主机,可以使用 
 dnsserver 
 上面的的 
 unbound 
 进行域名解析。  
 
 
 修改配置文件: 
 
[root@dnsserver ~]# vim /etc/unbound/unbound.conf
 
   修改内容如下: 
  
 
   默认情况下,unbound 服务只监听 127.0.0.1 ,修改为 0.0.0.0 之后,会监听服务器上面所有 IPv4 地址的53 号端口,以实现与其他主机之间使用 53 号端口通信。
默认情况下,unbound 服务只监听 127.0.0.1 ,修改为 0.0.0.0 之后,会监听服务器上面所有 IPv4 地址的53 号端口,以实现与其他主机之间使用 53 号端口通信。
 这里规定了监听端口
这里规定了监听端口
 仅对于内网地址提供服务,其实就是访问控制ACL 规则,只有使用 allow 结尾的地址段中的主机可以与目前的服务器交互,并使用它提供的 DNS 缓存服务。这里实例的写法是所有的 IPv4 地址,建议还是使用自 己试验环境的网段。
仅对于内网地址提供服务,其实就是访问控制ACL 规则,只有使用 allow 结尾的地址段中的主机可以与目前的服务器交互,并使用它提供的 DNS 缓存服务。这里实例的写法是所有的 IPv4 地址,建议还是使用自 己试验环境的网段。
dnssec - lame - check 是一个用于检查 DNS 服务器是否缺乏 DNSSEC 权威性的工具或命令。在 DNSSEC中,权威性是指一个 DNS 服务器是否有权提供特定域名的验证结果。如果一个 DNS 服务器在 DNSSEC 上缺乏权威性,那么它无法提供对于该域名的 DNSSEC 记录的验证。

这里的配置,将使用一个知名的公共DNS服务器来进行域名解析,此时,在进行DNS解析时,会先转发 给指定8.8.8.8,进行一次递归,由8.8.8.8进行必要的迭代查询。
 因为上面配置了使用8.8.8.8 进行迭代,所以就不再需要指定根服务器的了。
因为上面配置了使用8.8.8.8 进行迭代,所以就不再需要指定根服务器的了。
重启验证
[root@dnsserver ~]# systemctl restart unbound.service
[root@dnsclient ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 192.168.110.131
[root@dnsclient ~]# dig www.baidu.com
; <<>> DiG 9.11.13-RedHat-9.11.13-3.el8 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30307
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 708 IN CNAME www.a.shifen.com.
www.a.shifen.com. 0 IN A 110.242.68.3
www.a.shifen.com. 0 IN A 110.242.68.4
;; Query time: 0 msec
;; SERVER: 192.168.110.131#53(192.168.110.131)
;; WHEN: Tue Apr 23 09:51:11 PDT 2024
;; MSG SIZE rcvd: 101实验二:自定义域名解析
[root@dnsserver ~]# vim /etc/unbound/unbound.conf

[root@dnsserver ~]# unbound-checkconf #检查配置文件语法,未指定路径就是默认配置文件
unbound-checkconf: no errors in /etc/unbound/unbound.conf
[root@dnsserver ~]# systemctl restart unbound测试
[root@dnsclient ~]# dig -t a dnsserver.test.com
; <<>> DiG 9.11.13-RedHat-9.11.13-3.el8 <<>> -t a dnsserver.test.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4877
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dnsserver.test.com. IN A
;; ANSWER SECTION: ##这一行
dnsserver.test.com. 3600 IN A 192.168.110.131
;; Query time: 0 msec
;; SERVER: 192.168.110.131#53(192.168.110.131)
;; WHEN: Tue Apr 23 11:03:23 PDT 2024
;; MSG SIZE rcvd: 63
[root@dnsclient ~]# dig -t a dnsclient.test.com
; <<>> DiG 9.11.13-RedHat-9.11.13-3.el8 <<>> -t a dnsclient.test.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57939
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dnsclient.test.com. IN A
;; ANSWER SECTION: ##这一行
dnsclient.test.com. 3600 IN A 192.168.110.133
;; Query time: 0 msec
;; SERVER: 192.168.110.131#53(192.168.110.131)
;; WHEN: Tue Apr 23 11:03:26 PDT 2024
;; MSG SIZE rcvd: 63
[root@dnsclient ~]# dig -t ns test.com
; <<>> DiG 9.11.13-RedHat-9.11.13-3.el8 <<>> -t ns test.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57087
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;test.com. IN NS
;; ANSWER SECTION: ##这一行
test.com. 3600 IN NS 192.168.110.131.
;; Query time: 0 msec
;; SERVER: 192.168.110.131#53(192.168.110.131)
;; WHEN: Tue Apr 23 11:03:43 PDT 2024
;; MSG SIZE rcvd: 66
[root@dnsclient ~]# dig -t mx test.com
; <<>> DiG 9.11.13-RedHat-9.11.13-3.el8 <<>> -t mx test.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53725
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;test.com. IN MX
;; ANSWER SECTION: ##这一行
test.com. 3600 IN MX 10 dnsclient.test.com.
;; Query time: 0 msec
;; SERVER: 192.168.110.131#53(192.168.110.131)
;; WHEN: Tue Apr 23 11:03:55 PDT 2024
;; MSG SIZE rcvd: 63
[root@dnsclient ~]# dig -x 192.168.110.131
; <<>> DiG 9.11.13-RedHat-9.11.13-3.el8 <<>> -x 192.168.110.131
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5464
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;131.110.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION: ##这一行
131.110.168.192.in-addr.arpa. 3600 IN PTR dnsserver.test.com.
;; Query time: 2 msec
;; SERVER: 192.168.110.131#53(192.168.110.131)
;; WHEN: Tue Apr 23 11:04:11 PDT 2024
;; MSG SIZE rcvd: 89
[root@dnsclient ~]# dig -x 192.168.110.133
; <<>> DiG 9.11.13-RedHat-9.11.13-3.el8 <<>> -x 192.168.110.133
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52023
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;133.110.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION: ##这一行
133.110.168.192.in-addr.arpa. 3600 IN PTR dnsclient.test.com.
;; Query time: 0 msec
;; SERVER: 192.168.110.131#53(192.168.110.131)
;; WHEN: Tue Apr 23 11:04:14 PDT 2024
;; MSG SIZE rcvd: 89维护命令简介
unbound-control dump-cache # 导出unbound缓存服务
unbound-control dump_cache > unbound.cache # 导出的数据保存到指定文件
unbound-control flush dnsserver.test.com # 刷新dnserver.test.com的缓存
unbound-control flush_zone test.com # 刷新test.com 域的缓存
unbound-control load_cache < unbound.cache # 从指定文件导入缓存
![[leetcode] 58. 最后一个单词的长度](https://img-blog.csdnimg.cn/direct/a36c1b59f2eb48eebd27dc7ba26116ca.png)


















