Linux

关于DNS的小结

1 什么是DNS

Domain Name Service,将域名解析为对应的IP地址的一种服务。

2 为什么需要DNS

当我们访问互联网上的不同站点服务时,其实是分别访问它们后端的服务器的IP地址,然后获取对应的服务的。但是,人们很难记住IP地址,人脑对名字比较敏感。比如,人们选择通过http://google.com 来访问Google,而不是http://8.7.198.46

3 DNS分类

内网DNS:我们可以在局域网内部假设自己的DNS服务器来解析内网域名。依然还记得10年前,部署Oracle 11gR2 RAC数据库时,配置Oracle的scan name和scan IP的场景,通过配置DNS服务器来实现的。

外网DNS:通常由一些域名服务商来维护DNS服务器。

4 DNS配置

server端:需要单独的服务器来安装配置dns服务;

client端:Linux上,只需要在/etc/resolv.conf文件里写入nameserver dns_server_ip即可。如:

[root@node-1 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 172.16.6.11
[root@node-1 ~]# 

5 DNS服务分类

根域名服务器:.

顶级域名服务器:解析.com;.org;.cn;.net;等;

二级域名服务器:解析knockatdatabase.com;163.com;等;

三级域名服务器:解析ex.knockatdatabase.com;mail.163.com;等;

6 DNS工作原理

互联网上收集到的2个比较好的参考图片:

How DNS works
The DNS hierarchy

以及倪朋飞老师的Linux性能优化专栏,第37 | 案例篇:DNS 解析时快时慢,我该怎么办?的一张图片:

img

演示,DNS解析流程图:

#1 如果没有dig工具,需要手工安装
[root@ky_app1 ~]# dig +trace +nodnssec knockatdatabase.com
-bash: dig: command not found
[root@ky_app1 ~]# yum install bind-utils -y
...
Installed:
  bind-utils.x86_64 32:9.11.4-26.P2.el7_9.9                                                                                                                                                                                   

Dependency Installed:
  bind-libs.x86_64 32:9.11.4-26.P2.el7_9.9                                                                                                                                                                                    

Complete!
[root@ky_app1 ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
search openstacklocal
nameserver 100.125.136.29
nameserver 100.125.1.250
options timeout:1 single-request-reopen
[root@ky_app1 ~]#  
#2 dig +trace +nodnssec knockatdatabase.com
[root@ky_app1 ~]# dig +trace +nodnssec knockatdatabase.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> +trace +nodnssec knockatdatabase.com
;; global options: +cmd
.                       518400  IN      NS      K.ROOT-SERVERS.NET.
.                       518400  IN      NS      L.ROOT-SERVERS.NET.
.                       518400  IN      NS      A.ROOT-SERVERS.NET.
.                       518400  IN      NS      F.ROOT-SERVERS.NET.
.                       518400  IN      NS      E.ROOT-SERVERS.NET.
.                       518400  IN      NS      D.ROOT-SERVERS.NET.
.                       518400  IN      NS      J.ROOT-SERVERS.NET.
.                       518400  IN      NS      M.ROOT-SERVERS.NET.
.                       518400  IN      NS      I.ROOT-SERVERS.NET.
.                       518400  IN      NS      G.ROOT-SERVERS.NET.
.                       518400  IN      NS      H.ROOT-SERVERS.NET.
.                       518400  IN      NS      C.ROOT-SERVERS.NET.
.                       518400  IN      NS      B.ROOT-SERVERS.NET.
;; Received 239 bytes from 100.125.136.29#53(100.125.136.29) in 2 ms

com.                    172800  IN      NS      j.gtld-servers.net.
com.                    172800  IN      NS      i.gtld-servers.net.
com.                    172800  IN      NS      g.gtld-servers.net.
com.                    172800  IN      NS      e.gtld-servers.net.
com.                    172800  IN      NS      a.gtld-servers.net.
com.                    172800  IN      NS      f.gtld-servers.net.
com.                    172800  IN      NS      k.gtld-servers.net.
com.                    172800  IN      NS      l.gtld-servers.net.
com.                    172800  IN      NS      c.gtld-servers.net.
com.                    172800  IN      NS      m.gtld-servers.net.
com.                    172800  IN      NS      d.gtld-servers.net.
com.                    172800  IN      NS      b.gtld-servers.net.
com.                    172800  IN      NS      h.gtld-servers.net.
;; Received 844 bytes from 202.12.27.33#53(M.ROOT-SERVERS.NET) in 58 ms

knockatdatabase.com.    172800  IN      NS      dns2.hichina.com.
knockatdatabase.com.    172800  IN      NS      dns1.hichina.com.
;; Received 406 bytes from 192.43.172.30#53(i.gtld-servers.net) in 226 ms

knockatdatabase.com.    600     IN      A       8.129.225.115
;; Received 64 bytes from 139.224.142.124#53(dns2.hichina.com) in 33 ms

[root@ky_app1 ~]# 

1 从本地配置的DNS服务器那里获取根域名(.)服务器的NS记录;

2 从根域名服务器的NS记录里选择1个顶级域名服务器(M.ROOT-SERVERS.NET),查询顶级域名.com的NS记录;

3 从.com的NS记录中选择1个(i.gtld-servers.net),并返回二级域名knockatdatabase.com的NS服务器:dns1.hichina.com.和dns2.hichina.com.。注意,这里的返回值后面有个英文句点符号。

4 最后,从knockatdatabase.com的2个NS服务器中,选择1个(dns2.hichina.com),查到knockatdatabase.com的A记录地址是8.129.225.115。

而我的这个站点在阿里云上解析的信息如下:

knockatdatabase.com 解析

结合上述信息,域名解析流程就更清晰了。

7 DNS记录类型

A 记录,把域名解析成 IP V4地址;

CNAME:将域名指向另外一个域名;

添加记录类型

8 DNS主机记录

主机记录说明

@表示,直接解析 knockatdatabase.com

www表示,解析www.knockatdatabase.com

也就是说,当我们在浏览器里输入knockatdatabase.com或者www.knockatdatabase.com 都可以正常访问。

9 查看域名的A记录

[root@ky_app1 ~]# nslookup knockatdatabase.com
Server:         100.125.136.29
Address:        100.125.136.29#53

Non-authoritative answer:
Name:   knockatdatabase.com
Address: 8.129.225.115

[root@ky_app1 ~]# nslookup www.knockatdatabase.com
Server:         100.125.136.29
Address:        100.125.136.29#53

Non-authoritative answer:
Name:   www.knockatdatabase.com
Address: 8.129.225.115

[root@ky_app1 ~]# 

10 DNS解析tips

缓存:

通常在解析过程中,我们可以采用DNS缓存的方式来提升解析性能。也就是说,当我们要找knockatdatabase.com这个域名时,我们本地的DNS服务器在第一次解析时,它不知道对应的IP是什么,于是经过请求根域名服务器,再到顶级域名服务器,层层嵌套查找之后,得到对应的IP地址是8.129.225.115,那么下一次我们再次向我们的DNS服务器查找这个域名对应的IP地址是多少的时候,本地DNS服务器可以通过之前解析的缓存结果立即返回8.129.225.115,而不必再一层一层的查找一次了。

当然,缓存也有过期的情况,或者后端服务器的IP地址的确更新了,那么这些情况需要关注。

留言