一、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: 53
CNAME记录
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 号端口通信。
这里规定了监听端口
仅对于内网地址提供服务,其实就是访问控制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 进行迭代,所以就不再需要指定根服务器的了。
重启验证
[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 # 从指定文件导入缓存