Linux网络服务之DNS

一、DNS概述

1.1 什么是DNS?

DNS: 名称解析服务,域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53 和 TCP端口 53

BIND:Bekerley Internet Name Domain,由 ISC (www.isc.org)提供的DNS软件实现DNS域名结构

1.2 域名

域名(英语:Domain Name),又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。

1.3 FQDN:主机名和域名两个部分

完全合格域名 (Fully Qualified Domain Name)全限定域名组成方式:主机名 + 域名,其中域名组成:子域名 + 父域名 + 根域名,最多可达到127级域名

根域: 全球根服务器节点只有13个,10个在美国,1个荷兰,1个瑞典,1个日本

  • 一级域名:Top Level Domain: tld 三类:组织域、国家域(.cn, .ca, .hk, .tw)、反向域 com, edu, mil, gov, net, org, int,arpa

  • 二级域名:ops.com

  • 三级域名:study.ops.com

  • 最多可达到127级域名

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

# 安装
[root@master ~ ]# yum  install -y bind bind-utils
# 主配置文件语法检查 
[root@master ~ ]# named-checkconf
# 解析库文件语法检查
[root@master ~ ]# named-checkzone "ops.org" /var/named/ops.org.zone

1.4 DNS应用场景

Web浏览器:当您输入URL(Uniform Resource Locator,统一资源定位符)时,Web浏览器将使用DNS系统来查找该域名对应的IP地址,并将您重定向到该站点的网页。
​
电子邮件:当您发送电子邮件时,电子邮件客户端使用DNS系统查找目标邮件服务器的IP地址,以便将邮件传递给正确的服务器。
​
文件共享:在某些情况下,DNS系统可用于在网络上查找其他计算机或服务器的位置,以便进行文件共享或其他网络活动。
​
云服务:许多云服务提供商使用DNS系统来管理他们的基础设施,以确保服务可用性和性能。
​
安全性:DNS系统还可以用于实现安全性功能,例如DNS防火墙或DNS隧道,以保护网络免受恶意攻击或监视。

1.5 重点:DNS 工作原理

第一步:客户端查看本地hosts文件是否记录访问域名的地址,如果没有:则访问本地的权威DNS服务器

第二步:本地权威DNS服务器查询是否记录请求解析域名的地址

第三步:权威DNS服务没有记录域名的地址,则会查看该DNS服务器上的缓存是否记录

第四步:向上级DNS服务器进行迭代查看,直到查询到访问域名的IP地址,如图所示

说明:DNS服务器采用分布式查询,每台DNS服务器存储下级DNS服务器地址和上级DNS服务器地址

1.6 重点:DNS查询方式:递归查询迭代查询

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

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

1.7 名称服务器

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

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

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

1.8 DNS 解析类型

DNS 支持的解析类型:正向解析 和 反向解析

正向解析:是指把域名解析对应服务器的IP地址 FQDN --> IP

反向解析:是指把服务器IP地址解析为网站域名 IP --> FQDN

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

1.9 重点:完整的查询请求经过的流程

1> 客户机提交域名解析请求,并将该请求发送给本地的域名服务器。
​
2> 当本地的域名服务器收到请求后,就先查询本地的缓存(hosts)。如果有查询的DNS 信息记录,则直接返回查询的结果。如果没有该记录,本地域名服务器就把请求发给根域名服务器。
​
3> 根域名服务器再返回给本地域名服务器一个所查询域的顶级域名服务器的地址。
​
4> 本地服务器再向返回的域名服务器发送请求。
​
5> 接收到该查询请求的域名服务器查询其缓存和记录,如果有相关信息则返回客户机查询结果,否则通知客户机下级的域名服务器的地址。
​
6> 本地域名服务器将查询请求发送给返回的DNS 服务器。
​
7> 域名服务器返回本地服务器查询结果(如果该域名服务器不包含查询的DNS 信息,查询过程将重复<6>、<7>步骤,直到返回解析信息或解析失败的回应)。
​
8> 本地域名服务器将返回的结果保存到缓存,并且将结果返回给客户机。
​
# 简化
Client -->hosts文件 --> Client DNS Service Local Cache --> DNS Server (recursion递归) --> DNS Server Cache -->DNS iteration(迭代) --> 根--> 顶级域名DNS-->二级域名DNS… 

二、DNS配置文件

1、主配置文件

# 主配置文件
[root@master ~ ]# vim /etc/named.conf
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { any; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };
        allow-transfer {192.168.1.105;};        #只允许192.168.1.105(slave)来同步数据
        rrset-order { order cyclic; };      #设置以循环顺序返回IP
<p>       allow-transfer {none;};     #设置不允许任何服务器向本服务不同区域数据
       
forward first|only;     #设置转发方式和目标服务器
forwarders {192.168.1.101;};</p>
<p>#关闭安全转发<br />
       dnssec-enable no;
       dnssec-validation no;
       </p>
<h1 id="设置全局转发">设置全局转发</h1>
<p>   Options {
       forward first|only;     #转发类型
       forwarders { ip;};      #指定转发目标dns服务器地址
   };

2、区域配置文件

# 区域配置文件
[root@org ~ ]# vim /etc/named.rfc1912.zones
zone "ZONE_NAME" IN {
type {master|slave|hint|forward};
file "ZONE_NAME.zone";
};
​
#设置转发
[root@forward ~ ]# vim /etc/named.rfc1912.zones
zone "ops.org" IN {
       type forward;
       forward first|only;
       forwarders {192.168.1.102;};    #指定转发目标dns服务器地址
};

2.1、转发详解

# 全局转发  :   /etc/named.conf
Options {
forward first|only;     #转发类型
forwarders { ip;};      #指定转发目标dns服务器地址
};
​</p>
<h1 id="特定区域转发,比全局转发优先级高  :   /etc/named.rfc1912.zones">特定区域转发,比全局转发优先级高  :   /etc/named.rfc1912.zones</h1>
<p>zone "ZONE_NAME" IN {
type forward;
forward first|only;
forwarders { ip;};
};
​
转发类型解释:
   first:先转发至指定DNS服务器,如果无法解析查询请求,则本服务器再去根服务器查询
​
   only: 先转发至指定DNS服务器,如果无法解析查询请求,则本服务器将不再去根服务器查询

3、区域数据库配置文件

# 创建 ops.org 域的数据库文件
[root@master ~ ]# vim /var/named/aishop.com.zone
$TTL 1D
@       IN SOA  ns1 smtp.aishop.com.
                       (
                       2022【序列号】
                       1H  【同步时间】
                       15M 【重连时间】
                       1W  【过期时间】
                       1D  【缓存时间】
                       )  
@       NS      ns1
NS      ns2
ns1     A       192.168.1.100	# 主服务器
ns2     A       192.168.1.101	# 从服务器</p>
<p>www     CNAME   websrv			# CNAME 别名
websrv  A       192.168.1.102	# web服务</p>
<p>wh      A       192.168.1.103	# WH-子域</p>
<h1 id="设置权限">设置权限</h1>
<p>[root@dns ~ ]# chmod 640 /var/named/ops.org.zone
[root@dns ~ ]# chown root.named /var/named/ops.org.zone

4、命令:dig|host|nslookup

  • dig

# 格式:
   dig [-t type] name [@SERVER] [query options]
   query options:
    +[no]trace:跟踪解析过程 : dig +trace ops.org
    +[no]recurse:进行递归解析</p>
<h1 id="示例:">示例:</h1>
<p>   dig -x IP = dig -t ptr reverseip.in-addr.arpa
#模拟区域传送
   dig -t axfr ZONE_NAME @SERVER
   dig -t axfr ops.org @10.10.10.3
   dig -t axfr 100.1.10.in-addr.arpa @172.16.1.1
   dig -t NS . @34.34.34.34
   dig -t NS . @a.root-servers.net
  • host

# 格式
   host [-t type] name [SERVER]</p>
<h1 id="示例">示例</h1>
<pre><code>host -t NS ops.org &nbsp;172.16.0.1

​   host -t soa ops.org   [root@web1 ~]#host -t soa ops.com   ops.com has SOA record zhouhao.ops.com. smtp.ops.com. 1003 86400 3600 604800 10800 ​   host -t mx ops.org   host -t axfr ops.org   host 1.2.3.4

  • nslookup

# 格式
   nslookup [-option] [name | -] [server]</p>
<h1 id="使用">使用</h1>
<p>   交互式模式:
      nslookup>
​
   server IP: 指明使用哪个DNS server进行查询
​
   set q=RR_TYPE: 指明查询的资源记录类型
​
   NAME: 要查询的名称

6、排错流程

1.检查配置文件
2、查看日志  journalctl -xe
3、查看权限  ll /var/named/ops.org.zone
640  root.named
4.检查/etc/resolv.conf中解析记录
5.检查路由表 route
6.重启网络

三、综合实战:实现Internet 的DNS 服务架构

3.1 环境准备

环境准备

关闭SElinux
关闭防火墙

需要准备8台主机

设备类型

IP地址

作用

客户端

192.168.1.20

用于访问互联网的设备

本地DNS服务器

192.168.1.100

缓存DNS查询结果,提高查询效率

转发DNS服务器

192.168.1.101

将DNS查询转发至上游DNS服务器

根DNS服务器

192.168.1.102

解析域名的最高层次

org域DNS服务器

192.168.1.103

解析org域名的DNS服务器

ops.org域主DNS服务器

192.168.1.104

解析ops.org域名的主DNS服务器

ops.org域从DNS服务器

192.168.1.105

解析ops.org域名的从DNS服务器

www.ops.org的WEB服务器

192.168.1.110

提供www.ops.org网站的WEB服务

3.2 client网络配置

# 在 client DNS中配置本地DNS服务器地址 192.168.1.20
[root@client ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.1.20
NETMASK=255.255.255.0
GATEWAY=192.168.1.2
DNS1=192.168.1.100
​
[root@client ~]# systemctl restart network

3.3 搭建web服务

# 192.168.1.110 主机上搭建httpd服务
​
[root@web ~]# yum -y install httpd
[root@web ~]# systemctl enable --now httpd
[root@web ~]# echo "www.ops.org" >>/var/www/html/index.html

客户端测试

[root@client~]$ curl 192.168.1.110
www.ops.org

3.4 搭建ops.org域的主DNS服务器

#192.168.1.104主机搭建ops.org的主dns服务器
[root@master ~]# yum  install -y bind bind-utils</p>
<p>[root@master ~ ]# vim /etc/named.conf
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
directory       "/var/named";
dump-file       "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file  "/var/named/data/named.recursing";
secroots-file   "/var/named/data/named.secroots";
allow-query     { any; };
allow-transfer {192.168.1.105;};   #只允许192.168.1.105(slave)来同步数据</p>
<p>#修改区域配置文件
[root@master ~ ]# vim /etc/named.rfc1912.zones
zone "ops.org" IN {
type master;
file "ops.org.zone";
};</p>
<p>[root@master ~ ]# vim /var/named/ops.org.zone
$TTL 1D
@       IN SOA  master smtp.ops.com. ( 101 1D 1H 1W 3H )
@       NS      master
master     A    192.168.1.104
slave      A    192.168.1.105
www        A    192.168.1.110</p>
<p>[root@master ~ ]# chgrp named /var/named/ops.org.zone
[root@master ~ ]# systemctl start named

客户端测试

[root@client~]$ host www.ops.org 192.168.1.104
Using domain server:
Name: 192.168.1.104
Address: 192.168.1.104#53
Aliases:
​
www.ops.org has address 192.168.1.110

3.5 搭建ops.org域的从DNS服务器

#192.168.1.105主机搭建ops.org的从dns服务器
[root@slave ~]# yum  install -y bind bind-utils
​
[root@slave ~ ]# vim /etc/named.conf
options {
       listen-on port 53 { any; };
       listen-on-v6 port 53 { any; };
       directory       "/var/named";
       dump-file       "/var/named/data/cache_dump.db";
       statistics-file "/var/named/data/named_stats.txt";
       memstatistics-file "/var/named/data/named_mem_stats.txt";
       recursing-file  "/var/named/data/named.recursing";
       secroots-file   "/var/named/data/named.secroots";
       allow-query     { any; };
 #设置不允许任何服务器向本服务同步区域数据
      allow-transfer {none;};
​
#修改区域配置文件
[root@slave ~ ]#vim /etc/named.rfc1912.zones
zone "ops.org" IN {
       type slave;
       masters {192.168.1.104;};
       file "slaves/ops.com.slave";
};
​
[root@slave ~ ]# systemctl start  named
[root@slave ~ ]# ll /var/named/slaves/
-rw-r--r-- 1 named named 3110 Jul 16 22:32 ops.com.slave

客户端测试

[root@client~]$ host www.ops.org 192.168.1.105
Using domain server:
Name: 192.168.1.105
Address: 192.168.1.105#53
Aliases:
​
www.ops.org has address 192.168.1.110

3.6 搭建org域的DNS服务器

#192.168.1.103主机搭建org的dns服务器
[root@org ~]#yum install -y bind bind-utils
​
[root@org ~ ]# vim /etc/named.conf
options {
       listen-on port 53 { any; };
       listen-on-v6 port 53 { any; };
       directory       "/var/named";
       dump-file       "/var/named/data/cache_dump.db";
       statistics-file "/var/named/data/named_stats.txt";
       memstatistics-file "/var/named/data/named_mem_stats.txt";
       recursing-file  "/var/named/data/named.recursing";
       secroots-file   "/var/named/data/named.secroots";
       allow-query     { any; };
​
#设置不允许任何服务器向本服务不同区域数据
      allow-transfer {none;};
​
#修改区域配置文件
[root@org ~ ]# vim /etc/named.rfc1912.zones
zone "org" IN {
       type master;
       file "org.zone";
};
​
[root@org ~ ]# vim /var/named/org.zone
$TTL 1D
@       IN SOA  org. smtp.ops.com. ( 101 1D 1H 1W 3H )
@       NS      org.
ops      NS      master
ops      NS      slave
org.       A    192.168.1.103
master     A    192.168.1.104
slave      A    192.168.1.105
​
​
[root@org ~ ]# chgrp named /var/named/org.zone
[root@org ~ ]# systemctl start named

客户端测试

[root@client~]$ host www.ops.org 192.168.1.103
Using domain server:
Name: 192.168.1.103
Address: 192.168.1.103#53
Aliases:
​
www.ops.org has address 192.168.1.110

3.7 搭建根域的DNS服务器

#192.168.1.102搭建根域dns服务器
[root@root ~]# yum install -y bind bind-utils
​
[root@root ~ ]# vim /etc/named.conf
options {
       listen-on port 53 { any; };
       listen-on-v6 port 53 { any; };
       directory       "/var/named";
       dump-file       "/var/named/data/cache_dump.db";
       statistics-file "/var/named/data/named_stats.txt";
       memstatistics-file "/var/named/data/named_mem_stats.txt";
       recursing-file  "/var/named/data/named.recursing";
       secroots-file   "/var/named/data/named.secroots";
       allow-query     { any; };
#设置不允许任何服务器向本服务同步区域数据
       allow-transfer {none;};
       
#修改下面file文件名
[root@root ~ ]# vim /etc/named.rfc1912.zones
zone "." IN {
       type master;
       file "root.zone";
};
​
[root@root ~ ]# vim /var/named/root.zone
$TTL 1D
@       IN SOA  root smtp.ops.org. ( 101 1D 1H 1W 3H )
       NS      root
org.    NS      orgns
root         A    192.168.1.102
orgns        A    192.168.1.103
​
[root@root ~ ]# chgrp named /var/named/root.zone
[root@root ~ ]# systemctl start named

客户端测试

[root@client ~]# host www.ops.org 192.168.1.102
Using domain server:
Name: 192.168.1.102
Address: 192.168.1.102#53
Aliases:
​
www.ops.org has address 192.168.1.110

3.8 搭建转发目标的DNS服务器

#在192.168.1.101 搭建转发目标的DNS服务器
[root@forward ~]# yum install -y bind bind-utils
​
[root@forward ~ ]# vim /etc/named.conf
options {
       listen-on port 53 { any; };
       listen-on-v6 port 53 { any; };
       directory       "/var/named";
       dump-file       "/var/named/data/cache_dump.db";
       statistics-file "/var/named/data/named_stats.txt";
       memstatistics-file "/var/named/data/named_mem_stats.txt";
       recursing-file  "/var/named/data/named.recursing";
       secroots-file   "/var/named/data/named.secroots";
       allow-query     { any; };
       #设置不允许任何服务器向本服务不同区域数据
       allow-transfer {none;};
       #关闭安全转发
       dnssec-enable no;
       dnssec-validation no;
​
#设置转发根域服务器
[root@forward ~ ]# vim /etc/named.rfc1912.zones
zone "ops.org" IN {
       type forward;
       forward first;
       forwarders {192.168.1.102;};
};
​
[root@forward ~ ]# systemctl start named

客户端测试

[root@client ~]# host www.ops.org 192.168.1.101
Using domain server:
Name: 192.168.1.101
Address: 192.168.1.101#53
Aliases:
​
www.ops.org has address 192.168.1.110

3.9 搭建本地只缓存DNS服务器

#192.168.1.100 搭建本地转DNS服务器
[root@local ~]#yum install -y bind bind-utils
​
[root@localhost ~ ]# vim /etc/named.conf
options {
       listen-on port 53 { any; };
       listen-on-v6 port 53 { any; };
       directory       "/var/named";
       dump-file       "/var/named/data/cache_dump.db";
       statistics-file "/var/named/data/named_stats.txt";
       memstatistics-file "/var/named/data/named_mem_stats.txt";
       recursing-file  "/var/named/data/named.recursing";
       secroots-file   "/var/named/data/named.secroots";
       allow-query     { any; };
       #设置不允许任何服务器向本服务不同区域数据
       allow-transfer {none;};
       forward only;
       #设置转发方式和目标服务器
       forwarders {192.168.1.101;};
       #关闭安全转发
       dnssec-enable no;
       dnssec-validation no;
​
[root@localhost ~ ]# systemctl start named

3.10 客户端测试域名解析完整流程

[root@client ~]# host www.ops.org 192.168.1.100
Using domain server:
Name: 192.168.1.100
Address: 192.168.1.100#53
Aliases:
​
www.ops.org has address 192.168.1.110
​
[root@client ~]# dig www.ops.org. @192.168.1.100
​
; <<>> DiG 9.3.4-P2-RedHat-9.3.4-26.P2.el7_9.13 <<>> www.ops.org. @192.168.1.100
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1881
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
​
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.ops.org.           IN  A
​
;; ANSWER SECTION:
www.ops.org.        86065   IN  A   192.168.1.110
​
;; AUTHORITY SECTION:
ops.org.        86065   IN  NS  master.org.
ops.org.        86065   IN  NS  slave.org.
​
;; ADDITIONAL SECTION:
master.org.     86065   IN  A   192.168.1.104
slave.org.      86065   IN  A   192.168.1.105
​
;; Query time: 0 msec
;; SERVER: 192.168.1.100#53(192.168.1.100)
;; WHEN: Fri May 05 15:32:32 CST 2023
;; MSG SIZE  rcvd: 129
​
[root@client~]# vim /etc/resolv.conf
nameserver 192.168.1.100
​
[root@client ~ ]# curl www.ops.org.
www.ops.org
​
[root@client ~ ]# curl www.ops.org
www.ops.org

四、总结

DNS服务(Domain Name System)是一种将易于记忆的域名映射到对应IP地址的互联网基础架构服务。DNS服务在网络中扮演着至关重要的角色,它使得用户可以轻松访问网站和其他网络资源,而无需记忆数字IP地址。

DNS服务的主要功能是将域名映射到IP地址,这样当用户在浏览器中输入网址时,DNS服务器可以解析域名并返回与之对应的IP地址。DNS服务不仅可以提高网络的可用性和安全性,还能减轻网络负载,提高访问速度。同时,DNS还可以提供其他功能,例如反向解析和邮件交付等。

DNS服务的内部结构和运作方式比较复杂,需要专业人员进行管理和维护。DNS服务器的层级结构包括根域名服务器、顶级域名服务器、权威域名服务器和本地域名服务器等,每个服务器都承担着不同的任务。DNS服务也面临着一些安全风险,例如DNS欺骗和DNS投毒等攻击,因此需要采取相应的安全措施来保护网络安全。

总之,DNS服务是互联网基础架构中至关重要的组成部分,其作用不仅是提供域名解析服务,还能提高网络的可用性和安全性,为互联网的发展做出了巨大贡献。