Linux的DNS域名解析服务
1 域名服务基础
1.1 什么是域名
域名(Domain Name)是由一串用点分隔的字符组成的名称,用于标识互联网上的计算机或服务器组。
所有的域名必须以点结尾,如:www.qq.com.cn. www.baidu.com.cn. ,没有点只是一种简略形式。
它的核心作用是替代数字形式的IP地址(如192.168.1.1),使人类更容易记忆和访问网络资源。
==通过域名系统(DNS)实现域名与IP地址的映射。==当用户输入域名时,DNS会将其解析为对应的IP地址,从而完成网络连接。
1.2 什么是DNS
域名系统(Domain Name System,DNS)是互联网的一项服务。
它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
当打开一个网站时,计算机需要知道该网站的IP地址以便与其建立连接并获取所需的内容。
DNS就是用于将网站的域名转换为IP地址的系统。
当在浏览器中输入一个域名时,比如“www.example.com”,计算机会向DNS服务器发送一个查询请求,问它这个域名对应的IP地址是什么。这个查询会依次向上查找,直到它找到能够提供该域名对应的 IP 地址的 DNS 服务器为止。当计算机获得了网站的IP 地址,它就可以向该地址发送请求,获取网站的内容。
DNS使用TCP和UDP端口53。
当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
1.2.1 使用UDP的情况
- 常规域名解析查询
- DNS查询通常是小型请求,UDP的无连接性和低延迟使其能够快速处理大量请求。UDP的包头较小,还能节省带宽资源。
- 大多数情况下,客户端向DNS服务器查询域名时,返回的内容不超过512字节,适合用UDP传输。
- DNS服务器之间进行迭代查询时,也使用UDP来发送和接收查询请求及响应。
- 本地缓存查询
- 在本地DNS服务器中查询缓存记录时,由于查询速度快且数据量小,通常使用UDP进行传输,以提高查询效率。
1.2.2 使用TCP的情况
- 区域传输
- 在DNS主从服务器之间进行区域传输(ZoneTransfer)时,需要传输大量的DNS数据记录,数据量可能超过UDP的单次传输限制。TCP的可靠性、面向连接特性和无传输大小限制,能够确保数据的完整性和准确性。
- 处理大型响应
- 当DNS响应的数据包超过512字节(如返回的记录较多或携带DNSSEC信息等)时,UDP无法满足需求,此时DNS会自动切换到TCP协议,以保证数据的完整传输。
- 防止DNS放大攻击
- 部分防火墙会配置为要求DNS查询走TCP,以减少DNS放大攻击的风险。因为TCP需要建立连接,攻击者难以伪造源IP地址进行放大攻击。
1.3 DNS服务器分类
- 域名服务器在DNS体系中扮演着不同的角色,根据其功能和位置可以分为:
- 根域名服务器
- 顶级域名服务器
- 权威域名服务器
- 本地DNS服务器
- 转发服务器
1.3.1 根域名服务器
根域名服务器是DNS层次结构的最高层,它们并不直接提供具体的域名解析结果,而是指引查询到正确的顶级域名服务器。全球共有13组根域名服务器,标识为A到M。
日本、英国、瑞典各一台,其余的均在美国。
1.3.2 顶级域名服务器
负责管理特定的顶级域名,如.com、.org、.net等通用顶级域名,或者国家代码顶级域名(ccTLD)如.cn(中国)、.jp(日本)。
当接收到查询时,TLD服务器会指向更具体的权威域名服务器。
顶级DNS服务器 | 应用 |
---|---|
.com | 工商、企业 |
.net | 网络供应商 |
.edu | 教育机构 |
.cn | 中国国家域名 |
.org | 团体组织 |
.gov | 政府部门 |
1.3.3 权威域名服务器
权威域名服务器保存了特定域名的具体DNS记录(如A记录、MX记录等),并能提供最准确的解析信息。
对于每个域名而言,至少有一个权威域名服务器来维护该域名的信息。例如:阿里云DNS、腾讯云DNS
1.3.4 本地DNS服务器
通常网络管理员提供,自建类型。
这类服务器执行递归查询,即代表客户端完成整个查询过程。它们首先检查自己的缓存,如果找不到所需信息,则依次向根域名服务器、顶级域名服务器以及权威域名服务器发起查询,直到找到对应的IP地址并将结果返回给客户端,同时将其存储在缓存中以供后续查询使用。
1.3.5 转发服务器
转发服务器不是必需的,但它可以作为优化查询效率的一种方式。
它接收来自其他DNS服务器或客户端的请求,并将这些请求转发给另一个DNS服务器进行处理,然后将结果返回给原始请求者。这有助于减少重复查询的工作量,特别是在大型网络环境中。
1.4 正向解析与反向解析
DNS 系统在网络中的作用就是维护一个地址数据库,其中记录了各种主机域名与IP 地址的对应关系,以便为客户程序提供正向或反向的地址查询服务,即正向解析与反向解析。
1.4.1 正向解析
域名-------->IP
根据域名查IP 地址,即将指定的域名解析为相对应的IP 地址。
域名的正向解析是DNS服务器最基本的功能,也是最常用的功能。
1.4.2 反向解析
IP---------->域名
根据IP 地址查域名,即将指定的IP地址解析为相对应的域名。
域名的反向解析不是很常用,只在一些特殊场合才会用到,比如反垃圾邮件的验证。
1.4.3 区域
每一台 DNS 服务器都只负责管理一个有限范围(一个或几个域)内的主机域名和IP地址的对应关系,这些特定的 DNS 域或IP 地址段称为zone(区域)。
根据地址解析的方向不同,DNS 区域相应地分为正向区域(包含域名到IP 地址的解析记录)和反向区域(包含 IP 地址到域名的解析记录)。
- 常见反向域:
- 114.114.114.114是国内移动、电信和联通通用的DNS,手机和电脑端都可以使用。
- 8.8.8.8是GOOGLE公司提供的DNS,该地址全球通用,相对来说,更适合国外以及访问国外网站的用户使用。
- 223.5.5.5 和 223.6.6.6:阿里云DNS(IPV62400:3200::1和 2400:3200:baba::1)。
- 江苏省南京市(中国电信)首选DNS为:218.2.135.1备用DNS为:61.147.37.1。
根据所管理的区域地址数据的来源不同,DNS系统可以分为不同的类型。
在同一台 DNS服务器中,相对于不同的区域来说,也拥有不同的身份。
- 缓存域名服务器
- 只提供域名解析结果的缓存功能,目的在于提高查询速度和效率,但是没有自己控制的区域地址数据。构建缓存域名服务器时,必须设置根域或指定其他 DNS 服务器作为解析来源。
- 主域名服务器
- 维护某一个特定DNS 区域的地址数据库,对其中的解析记录具有自主控制权,是指定区域中唯一存在的权威服务器、官方服务器。构建主域名服务器时,需要自行建立所负责区域的地址数据文件。
- 从域名服务器
- 与主域名服务器提供完全相同的DNS解析服务,通常用于 DNS服务器的热备份。
- 对客户机来说,无论使用主域名服务器还是从域名服务器,查询的结果都是一样的。关键区别在于,从域名服务器提供的解析结果不是由自己决定的,而是来自于主域名服务器。
- 构建从域名服务器时,需要指定主域名服务器的位置,以便服务器能自动同步区域的地址数据库。
主、从服务器的角色只是针对某一个特定的DNS 区域来说的。
同一台DNS 服务器,可以是某个区域的主域名服务器,同时也可以是另一个区域的从域名服务器。
1.5 DNS的查询方式
1.5.1 递归查询
一般客户机和本地DNS服务器之间属于递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到最终的肯定或否定的结果后转交给客户机。
此查询的源和目标保持不变,为了查询结果只需要发起一次查询。(不需要自己动手)
1.5.2 迭代查询
一般情况下(有例外)本地的DNS服务器向其它DNS服务器的查询属于迭代查询,如:若对方不能返回权威的结果,则它会向下一个DNS服务器(参考前一个DNS服务器返回的结果)再次发起进行查询,直到返回查询的结果为止。
此查询的源不变,但查询的目标不断变化,为查询结果一般需要发起多次查询。(需要自己动手)
1.6 查询原理过程
- 正向解析查询过程:
- 先查本机的缓存记录
- 查询hosts文件
- 查询dns域名服务器:交给dns域名服务器处理以上过程成为递归查询
- 这个dns服务器可能是本地域名服务器,也有个缓存,如果有直接返回结果,如果没有则进行下一步
- 求助根域服务器:根域服务器返回可能会知道结果的顶级域服务器让他去找顶级域服务器
- 求助顶级域服务器:顶级域服务器返回可能会知道结果的二级域服务器然他去找二级域服务器
- 求助二级域服务器:二级域服务器查询发现是我的主机,把查询到的ip地址返回给本地域名服务器
- 本地域名服务器将结果记录到缓存,然后把域名和ip的对应关系返回给客户端
1.7 本地主机DNS映射文件(hosts)
hosts文件包含了ip地址与主机名之间的映射,还包括主机的别名。
默认情况下,系统首先从hosts文件查找解析记录。
hosts 文件的优先级高于DNS服务器,这是由/etc/nsswitch.conf 文件规定的。
hosts 文件只对当前的主机有效。
hosts 文件可减少DNS查询过程,从而加快访问速度。
Linux中有关DNS的映射文件:/etc/hosts
windos中有关DNS的映射文件:Windows\System32\drivers\etc\hosts
2 构建缓存域名服务器
2.1 内网划分DNS域名解析器目的
- 提高网络访问速度
- 内网设置DNS服务器可以缓存已经解析过的域名与IP地址的映射关系。
- 当内网用户再次访问同一域名时,DNS服务器直接返回缓存中的IP地址,避免了查询过程,从而提高了访问速度。
- 提高网络安全性
- 通过设置DNS服务器,可以屏蔽一些恶意网站,防止内网用户访问具有威胁的网站,降低受到恶意软件、病毒和网络攻击的风险。
- 通过DNS服务器可以对访问的内容进行过滤和控制,限制内网用户访问特定的网站或资源。
- 实现内部网络管理
- 内网DNS服务器允许企业或组织对内部网络的域名进行管理。管理员可以为内部网络中的主机和服务分配专属的域名,提供更方便的内部访问方式。
- 减少外部DNS查询依赖
- 当内网用户访问外部网站时,如果每次都需要查询公共的DNS服务器,会造成网络延迟,降低访问速度。
- 内网DNS服务器可以缓存域名与IP地址的映射关系,减少对外部DNS服务器的依赖,从而提高访问速度。
- 实现内部资源访问
- 内网DNS服务器可以实现内部域名解析,使内网用户可以直接通过域名访问内部资源,提高内网管理的便捷性。
- 还可以设置反向解析,将IP地址解析为域名,方便进行网络监控和审计。
2.2 缓存域名服务器
缓存域名服务器通常架设在公司的局域网内,主要目的是提高域名解析的速度,减少对互联网访问的出口流量。
2.3 BIND的安装和控制
BIND (Berkeley Internet Name Domain):是最广泛使用的DNS软件之一,支持作为权威域名服务器和递归(缓存)服务器。它提供了全面的功能集,并且是许多顶级域名服务器的基础。
apt install bind9
BIND 软件包安装完毕以后,会自动增加一个名为named 的系统服务,通过systemctl工具可以控制DNS 域名服务的运行。
# 查看运行状态
systemctl status named
# 启动服务
systemctl start named
# 重启服务
systemctl restart named
# 关闭服务
systemctl stop named
2.4 BIND服务的配置文件
- 使用 BIND 软件构建域名服务时,主要涉及两种类型的配置文件:主配置文件和区域数据文件。
- 主配置文件:在/etc/bind目录下,用于设置named 服务的全局选项、注册区域及访问控制等各种运行参数。
- 区域数据文件:用于存放某个DNS 区域的地址解析记录(正向记录或反向记录)。
2.4.1 主配置文件
/etc/bind/named.conf:BIND服务的主要配置文件,用于定义全局选项和各个区域的配置。
/etc/bind/named.conf.options:用于配置BIND服务的全局选项,如监听地址、允许查询的IP地址范围等。
/etc/bind/named.conf.default-zones:默认区域配置文件,通常包含根域的基本配置。
/etc/bind/named.conf.local:用于定义本地DNS区域,如内部网络使用的域名解析。
2.4.2 options的参数设置
options 的参数设置会影响整个BIND9DNS环境的配置
-
listen-on:用于配置监听的端口以及IPv4地址,默认的监听端口为:53
-
listen-on-v6:用于监听 IPv6 地址以及端口
-
directory:用于指定读取DNS数据文件的文件夹,默认的文件夹的路径为:/var/cache/bind
-
dump-file:用来设置域名缓存数据库文件的位置,可以自己定义。默认的存储文件为:named_dump.db
-
statistics-file:用来设置状态统计文件的位置,可以自己定义
-
memstatistics-file:用来设置服务器输出的内存使用统计信息。默认保存在/var/named/data 目录下,文件名为named.memstats
-
recursion:用于设置递归查询,一般客户机和服务器之间属于递归查询,即当客户机向DNS服务器发出查询请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。此选项有yes和no两个值。这个选项用于设置 Failover 。
-
dnssec-enable:用来设置是否启用DNSSEC支持,DNSSEC可以用来验证DNS数据的有效性,该选项有yes和no两个值,默认值为yes。
-
dnssec-validation:用来设置是否启用DNSSEC确认,默认值为yes,可以选择auto。
-
bindkeys-file:用来设置内置信任的密钥文件,其默认值为/etc/named/iscdlv.key。
-
managed-keys-directory:用于指定目录中的文件存储位置,跟踪管理DNSSEC密钥
-
allow-query:用来设置允许DNS查询的客户端地址,默认值为localhost,可以设置为某个网段、任意地址、具体的某台主机三种情况。
例如,要修改为任意地址,就在括号内的加入any,也可以引用之前创建的acl 内的所有地址。
-
forwarders:DNS转发器。用于设定该DNS解析服务器无法进行当前域名解析的情况下,进行转发解析的DNS地址,其中8.8.8.8和8.8.4.4 是谷歌的免费DNS服务器的网络地址;233.5.5.5和233.6.6.6 是阿里云的免费DNS地址。
当设置了 forwarder 的转发器之后,所有的非本域的和在缓存中无法查找到的域名查询都转发设置的DNS转发器,由DNS转发器完成转发操作。因此这台转发器的缓存中就记录了丰富的域名信息。因此如果遇到非本域的查询,转发器的缓存就可以做到查询,从而减少了向外部的查询流量
2.4.3 区域数据配置文件
2.4.3.1 正向解析
/etc/bind/db.local
(1)正向区域数据配置文件
-
$TTL 604800:DNS记录在缓存中存活的时间(以秒为单位)。
604800秒(即 7 天)是默认的生存时间。如果记录没有单独设置TTL,则使用此值。
-
@:代表根域名localhost
-
IN SOA:指定这是一条“Start of Authority”记录,标志着区域的起始
-
localhost.:主名称服务器的域名
-
root.localhost.:区域管理员的电子邮件地址(注意:@替换为.)
-
Serial:序列号,用于标识区域文件的版本,通常在每次更改区域文件时增加
-
Refresh:其他 DNS 服务器应每604800秒(即7天)查询一次主服务器以获取更新
-
Retry:如果主服务器未响应,其他服务器在86400秒(即1天)后重试
-
Expire:如果主服务器长时间未响应(在2419200秒,即28天后),则停止提供该区域的记录
-
Negative Cache TTL:当查询失败时,DNS服务器将缓存失败的响应604800秒(即7天)
-
上述配置内容中,时间单位默认为秒(s),也可以使用 M(分)、H(时)、W(周)、D(天)等单位。
(2)正向解析配置:/etc/bind/db.local
- @ IN NS localhost.:指示localhost域名的名称服务器(NS记录)
- @ IN A 127.0.0.1:将根域localhost映射到IP 地址127.0.0.1,用户访问localhost时,会将请求发送到该 IP 地址
- www IN A 127.0.0.1:localhost也映射到同一个IP 地址127.0.0.1
常见地址解析记录:
- NS(Name Server,域名服务器):记录当前区域的DNS 服务器的主机地址
- MX(Mail Exchange,邮件交换):记录当前区域的邮件服务器的主机地址
- A(Address,地址):记录正向解析条目
- CNAME(Canonical Name,别名):记录某一个正向解析条目的其他名称
2.4.3.2 反向解析
/etc/bind/db.127
在反向区域数据文件中,不会用到A记录,而是使用PTR 指针(Point)记录。
使用 PTR 记录时,第一列只需要指明对应IP地址的“主机地址”部分即可,系统在查找地址记录时会自动将当前反向域的网络地址作为前缀。
修改完区域数据文件以后,该文件进行语法检查。
-
named-checkconf 检查主配置文件语法
-
named-checkconf /etc/bind/named.conf
-
-
用 named-checkzone 检查区域文件
-
named-checkzone xykj.com /etc/bind/xykj.local
-
2.5 实验1:正向解析
地址 | 应用 |
---|---|
192.168.40.131 | DNF服务器 |
192.168.40.132 | 客户机 |
192.168.40.133 | 目标地址 |
将xykj.com正向解析为192.168.40.133
192.168.40.133反向解析为www.xykj.com
2.5.1 DNS服务器配置
- vim /etc/bind/named.conf.options
# 在options中添加如下内容
listen-on port 53 { 192.168.40.131; };
allow-query { 192.168.40.0/24; };
- vim /etc/bind/named.conf.default-zones
# 添加正向区域配置
zone "xykj.com" {type master;file "/etc/bind/xykj.local";
};
- vim /etc/bind/xykj.local
# 添加正向区域数据文件xykj.local
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA xykj.com admin.xykj.com. (2 ; Serial604800 ; Refresh86400 ; Retry2419200 ; Expire604800 ) ; Negative Cache TTL
;
@ IN NS xykj.com.
@ IN A 192.168.40.133
www IN A 192.168.40.133
mail IN A 192.168.40.134
- 检查文件
named-checkzone xykj.com /etc/bind/xykj.local
named-checkconf /etc/bind/named.conf
- vim /etc/resolv.conf
# 修改DNS服务器配置文件,将ip地址改为本机
nameserver 192.168.40.131
- 重启服务
systemctl restart named
2.5.2 客户机配置
- vim /etc/resolv.conf
# 修改DNS服务器地址
nameserver 192.168.40.131
# 测试
nslookup xykj.com
nslookup www.xykj.com
nslookup mail.xykj.com
2.6 实验2 反向解析
实验环境:在[实验1](# 2.5 实验1:正向解析)的基础上进行配置
- vim /etc/bind/xykj.local.1
# 创建反向区域数据文件 PTR:方向指针,反向代理的意思
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA xykj.com admin.xykj.com. (2 ; Serial604800 ; Refresh86400 ; Retry2419200 ; Expire604800 ) ; Negative Cache TTL
;
@ IN NS xykj.com.
@ IN A 192.168.40.133
133 IN PTR www.xykj.com.
- vim /etc/bind/named.conf.default-zones
# 添加反向区域配置
zone "40.168.192.in-addr.arpa" IN {type master;file "/etc/bind/xykj.local.1";
};
- 检查文件
named-checkzone xykj.com /etc/bind/xykj.local.1
named-checkconf /etc/bind/named.conf
- 重启服务
systemctl restart named
- 测试
nslookup 192.168.40.133
3 构建主从域名服务器
3.1 概述
主域名服务器通常架设在Internet 环境中,提供某一个域或某几个域内的主机名与IP地址的查询服务。
为了分担域名查询的压力、提供区域数据的备份,有时还会另外架设一台从域名服务器,与主域名服务器同时提供服务。
3.2 实验3
3.2.1 环境
在[实验2](# 2.6 实验2 反向解析)的基础上进行实验
地址 | 应用 |
---|---|
192.168.40.131 | 主DNF服务器 |
192.168.40.132 | 从DNF服务器 |
192.168.40.133 | 客户机 |
两台DNS服务器都要安装bind9
3.2.2 主DNS服务器配置
- vim /etc/resolv.conf
# 添加从DNS服务器地址
nameserver 192.168.40.132
-
vim /etc/bind/named.conf.options
在options中添加如下内容 该项可以不做
forwarders {
114.114.114.114;
8.8.8.8;
}; -
vim /etc/bind/named.conf.default-zones
# 修改区域配置文件
zone "xykj.com" {type master;file "/etc/bind/xykj.local";allow-transfer { 192.168.40.132; };
};zone "40.168.192.in-addr.arpa" IN {type master;file "/etc/bind/xykj.local.1";allow-transfer { 192.168.40.132; };
};
- 检查文件
named-checkzone xykj.com /etc/bind/xykj.local
named-checkconf /etc/bind/named.conf
- 重启服务
systemctl restart named
systemctl restart bind9
3.2.3 从DNS服务器配置
- vim /etc/resolv.conf
# 添加从DNS服务器地址
nameserver 192.168.40.132
- vim /etc/bind/named.conf.options
# 在options中添加如下内容 any:监听所有可用网络端口
listen-on port 53 { any; };
allow-query { any; };
- vim /etc/bind/named.conf.default-zones
# 在区域配置文件中添加如下内容
zone "xykj.com" {type slave;file "/etc/bind/xykj.local";masters { 192.168.40.131; };
};zone "40.168.192.in-addr.arpa" IN {type slave;file "/etc/bind/xykj.local.1";masters { 192.168.40.131; };
};
- 拷贝数据文件
scp root@192.168.40.132:/etc/bind/xykj.local /etc/bind/
scp root@192.168.40.132:/etc/bind/xykj.local.1 /etc/bind/
- 检查文件
named-checkzone xykj.com /etc/bind/xykj.local
named-checkconf /etc/bind/named.conf
- 重启服务
systemctl restart named
systemctl restart bind9
3.2.4 客户机配置
- vim /etc/resolv.conf
# 添加主从DNS服务器地址
nameserver 192.168.40.131
nameserver 192.168.40.132
3.2.5 测试
- 不关闭主DNS服务器
nslookup www.xykj.com
- 关闭主DNS服务器
# 在主DNS服务器上操作
systemctl stop named
systemctl stop bind9
# 在客户机上进行操作
nslookup www.xykj.com