目录
1 DNS介绍
1.1 DNS服务器的工作原理
1、什么DNS
DNS是域名系统(Domain Name System)英文名称的缩写,是一种组织域层次结构的计算机和网络服务命名系统。
域名系统DNS是由主机名解析方案发展起来的一种新的名字的解析机制。域名系统将主机名解析成IP地址使用了一个全局的、层次性的分布式数据库系统。该数据库系统包含了Internet上所有域名及IP的对应信息。数据库的层次性允许将域名空间划分成独立的管理部分,并称为域(Domain)。数据库的分布式特性则允许将数据库的各个不同的部分分配到不同网络的域名服务器上,这样各域名服务器可以实现独立的管理。
2、DNS域名体系结构
DNS的域是一种分布式的层次结构,这种结构非常类似于UNIX文件系统的层次结构。下面是域名体系结构层次图
- 根的名字以空标签(“”)表示,并称为根域(Root Domain)
- 根域的下一级是顶级域。顶级域有两种划分方法:地理域和通用域。
- 地理域是为世界上每个国家或地区设置的,由ISO-3166定义,如中国是cn,美国是us,日本是jp。
- 通用域是指按照机构类别设置的顶级域,主要包括com(商业组织)、edu(教育机构)、biz(商业)、info(信息行业)等。
- 在顶级域名下,还可以再根据需要定义次一级的域名,如在我国的顶级域名cn下又设立了com、net、org、gov、edu、ac,以及我国各个行政区的字母代表,如bj代表北京,sh代表上海等。
3、域名空间
域名空间是指表示DNS这个分布式数据库的逆向树型层次结构,完整域名由从树叶节点到根节点的一条路径的所有节点以分隔符“.”按顺序连接而成,如http://www.tony.com.cn/,其中“.”代表根域(当“.”出现在域名的最右边时,实际上还表示其右边有代表根的空标签“”;也可以用最右边的“.”来表示根),“cn”为顶级域,“com”为二级域,“tony”为三级域,“www”为主机名。
1.2 域名服务的解析原理和过程
cn域名解析的工作原理和过程如下:
- 1.用户提出域名解析请求,并将该请求发送给本地的域名服务器。
- 2.当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该记录项,则本地的域名服务器就直接把查询的结果返回。
- 3.如果本地的缓存中没有该记录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域,如cn)的主域名服务器的地址。
- 4.本地服务器再向上一步骤中所返回的域名服务器发送请求,然后收到该请求的域名服务器查询其缓存,返回与此请求所对应的记录或相关的下级的域名服务器的地址,本地域名服务器将返回的结果保存到缓存。
- 5.重复上一步,直到找到正确的记录。
- 6.本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。
以www.tony.com.cn为例,域名解析过程如下:
- (1)客户机发出请求解析域名www.tony.com.cn的报文。
- (2)本地的域名服务器收到请求后,查询本地缓存,假设没有该记录,则本地域名服务器nm.test.cn向根域名服务器发出请求解析域名 www.tony.com.cn。
- (3)根域名服务器收到请求后,判断该域名属于.cn域,查询到NS记录及相应的A记录。
- (4)域名服务器 nm.test.cn 收到回应后,先缓存以上结果,再向.cn域的域名服务器之一如ns.cnc.ac.cn发出请求解析域名 www.tony.com.cn 的报文。
- (5)域名服务器ns.cnc.ac.cn收到请求后,判断该域名属于.com.cn域,开始查询本地的记录,找到6条NS记录及相应的A记录。然后将这个结果返回给域名服务器 nm.test.cn。
- (6)域名服务器 nm.test.cn 收到回应后,先缓存以上结果,再向.com.cn域的域名服务器之一如sld-ns1.cnnic.net.cn.发出请求解析域名www.tony.com.cn的报文。
- (7)域名服务器sld-ns1.cnnic.net.cn.收到请求后,判断该域名属于.tony.com.cn域,开始查询本地的记录,找到NS记录及对应的A记录。然后将结果返回给域名服务器 nm.test.cn 。
- (8)域名服务器nm.test.cn收到回应后,先缓存以上结果,再向.tony.com.cn域的域名服务器之一如ns1.tony.com.cn.发出请求解析域名 www.tony.com.cn 的报文。
- (9)域名服务器ns1.tony.com.cn.收到请求后,开始查询本地的记录,找到如下CNAME记录及相应的A记录,并将结果返回给域名服务器nm.test.cn。
- (10)域名服务器 nm.test.cn 将得到的结果保存到本地缓存,同时将结果返回给客户机。这样就完成了一次域名解析过程
1.3 几个名称解释
正向解析:将域名解析为IP
反向解析:将IP解析为域名
A记录: 将域名指向一个IPv4地址,需要增加A记录
CNAME记录: 如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。这个域名一般是主机服务商提供的一个域名
MX记录: 建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写此记录
NS记录: 域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录
TXT记录: 可任意填写,可为空。一般做一些验证记录时会使用此项,如:做SPF(反垃圾邮件)记录
AAAA记录: 将主机名(或域名)指向一个IPv6地址,需要添加AAAA记录
SRV记录: 添加服务记录服务器服务记录时会添加此项,SRV记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:_example-server._tcp)。
SOA记录: SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中那一台是主服务器
PTR记录: PTR记录是A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域名
2 ubuntu22.04搭建DNS服务器 - bind9
2.1 安装bind9
sudo apt install bind9
# 安装后的配置文件如下:
root@test:/etc/bind# ls
bind.keys db.0 db.127 db.255 db.empty db.local named.conf named.conf.default-zones named.conf.local named.conf.options named.conf.options.bak rndc.key zones.rfc1918
2.2 修改配置文件 named.conf.local
cd /etc/bind/
vim named.conf.local
# 配置正向解析
# 正向解析是指将域名解析为 IP 地址的过程。在第一个配置块中,定义了名为 "test.cn" 的域名区域,并在 "/etc/bind/db.test.cn" 文件中存储了相应的域名和 IP 地址映射信息。当域名服务器接收到一个查询请求时,它会查询这个配置文件,并将查询结果返回给客户端。
zone "test.cn" {
type master;
file "/etc/bind/db.test.cn";
};
# 配置反向解析
# 反向解析则是将 IP 地址解析为域名的过程。在第二个配置块中,定义了名为 "172.168.192.in-addr.arpa" 的域名区域,并在 "/etc/bind/db.192.example.com" 文件中存储了相应的 IP 地址和反向域名映射信息。当域名服务器接收到一个反向查询请求时,它会查询这个配置文件,并将查询结果返回给客户端。
zone "172.168.192.in-addr.arpa" {
type master;
file "/etc/bind/192.zone";
};
2.3 配置正向解析文件
# 配置正向解析文件
vim /etc/bind/db.test.cn
$TTL 604800
$ORIGIN test.cn.
@ IN SOA test.cn. root.test.cn. (
2006080401 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1
@ IN A 192.168.172.201
ns1 IN A 192.168.172.201
www IN A 192.168.172.201
blog IN A 172.16.172.56
参数解释:
这是一个简单的 DNS 区域配置文件,用于配置一个名为"test.cn"的域名区域。以下是对配置文件中各条目的解释:
1.$TTL 604800:定义了区域数据的 Time To Live(TTL)为 604800 秒,即 172 小时。这意味着区域数据在缓存中的生存时间为 172 小时,过了这个时间后,缓存的数据将被清除。
2. $ORIGIN test.cn.:指定域名空间的根区域为 “test.cn”。
3. @ IN SOA test.cn. root.test.cn. ( 2006080401 ; Serial ) ; Serial:定义了区域配置的序列号(Serial),表示每次对该文件进行修改时,序列号应递增。这里设置的序列号为 2006080401。
4. 604800 ; Refresh:刷新间隔时间为 604800 秒,即 172 小时。这意味着区域数据在每次更新后,刷新时间为 172 小时。
5. 86400 ; Retry:定义了区域数据的重试时间为 86400 秒,即 24 小时。当区域数据更新失败时,重试时间为 24 小时。
6. 2419200 ; Expire:定义了区域数据的过期时间为 2419200 秒,即 688 小时。过期时间表示区域数据在缓存中的最长生存时间。
7. 604800 ) ; Negative Cache TTL:负缓存时间(Negative Cache TTL)为 604800 秒,即 172 小时。这意味着在查询失败时,负缓存时间用于防止错误的信息在缓存中传播。
8. @ IN NS ns1:定义了一个名为 “ns1” 的域名服务器,负责解析 “test.cn” 域名下的所有域名。
9. @ IN A 192.168.172.201:指定域名 “test.cn” 的 IP 地址为 192.168.172.201。
10. www IN A 172.16.1.201:将 “www” 域名解析为 IP 地址 192.168.172.201。
2.4 配置反向解析文件
vim /etc/bind/192.zone
$TTL 604800
@ IN SOA test.com. root.test.com. (
20211201;Serial
604800 ;Refresh
86400 ;Retry
2419200 ;Expire
604800) ;Negative Cache TTL
;
@ IN NS ns1.test.com.
201 IN PTR ns1.test.com.
201 IN PTR www.test.com.
56 IN PTR blog.test.com.
# 注意域名后面的点千万不要少了,否则会报错
下面是几个参数的解释:
- @ IN NS ns1.test.com. :定义域名解析服务器的名称,一定要对
- $TTL 604800 缓存时间
- 201 IN PTR ns1.test.com. 将 IP 地址 201 解析为域名 “ns1.test.com”。
- 其余参数与上述类似
2.5 配置
vim /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
// forwarders {
// 0.0.0.0;
// };
// option配置文件路径为 /etc/bind/named.conf.options, 去掉文件中forwarders的注释。forwarders节点配置的是转发器,所有非本域的和在缓存中无法找到的域名查询都将转发到设置的DNS转发器上,由这台DNS来完成解析工作并做缓存。转发器设置两个常用的DNS服务器即可:
forwarders {
8.8.8.8;
};
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;
listen-on-v6 { any; };
auth-nxdomain no; # conform to RFC1035
listen-on port 53 {192.168.172.201;}; //这一项是填写自己的DNS服务器IP地址
allow-transfer {any; };
allow-query{ any; };
};
2.6 启动并验证
# 启动
systemctl restart bind9
# 修改配置文件重新启动后,可能不会立即生效,可执行下述命令刷新之后重新验证
systemctl reload bind9
# 验证
vim /etc/resolv.conf
# 自建的DNS服务器地址
nameserver 192.168.172.201
# 测试命令
nslookup blog.test.cn
# dig 域名 DNS服务器地址
dig www.test.com 192.168.172.201
# dig -x ip @DNS服务器IP
dig 192.168.192.56 @ 192.168.172.201
dig -x 192.168.172.201
3 DNS配置
3.1 Linux
vim /etc/resolv.conf
nameserver 192.168.172.201
3.2 windows
控制面板\网络和 Internet\网络连接
如果通过nslookup解析出来的DNS地址和配置的DNS不一致,则可以使用如下步骤解决:
- 使用nslookup命令: nslookup www.test.com 会解析处具体使用的哪个DNS服务器,比如说得到的结果是Address:192.168.172.5
- 在cmd中执行:ipconfig /all ,查找DNS为 192.168.172.5 的网卡。 找到网卡名。
- 在 控制面板\网络和 Internet\网络连接 处找到对应的名字网卡,将网卡的DNS修改为我们自己的DNS服务器的IP
- 再次执行 nslookup www.test.com 命令,dns的IP已正确
- 如果对应的域名有相应的web页面,可以登录验证