前言
DNS(Domain Name System) 等级性的分布式域名系统,用于转换域名空间到IP地址空间,核心是分布式数据库,协议默认使用53端口的UDP协议传输。
DNS在云服务及CDN中处于核心地位。
DNS反映了互联网中的行政责任结构,由多个子域组成树。
介绍
DNS的好处:
- 对用户友好,用户无需记录IP地址,同一域名,不同用户可能同时接收到不同的IP地址,CDN加速。
- 更换IP等只需更新DNS记录而不影响用户,动态域名解析DDNS
DNS结构
是根据client-server结构搭建的一种树状分布式数据库系统。每个节点都是一个name server, 每个域名都至少有一个权威DNS服务器发布与其有关的信息。
查询通过right-most domain label, recursive and caching name server, DNS resolver, record caching, circular dependencies and glue records 和reverse / client lookup组成
DNS报文
查询和回复都是同样格式,包含header, question, answer, authority, additional space.
Resource records:
Name保存域名,TYPE记录类型,如Start of Authority (SOA), IP addresses (A and AAAA), SMTP mail exchangers (MX), name servers (NS), pointers for reverse DNS lookups (PTR), and domain name aliases (CNAME)等。
A记录:地址记录,用来指定域名的IPv4地址(如:8.8.8.8),如果需要将域名指向一个IP地址,就需要添加A记录。
CNAME: 如果需要将域名指向另一个域名,再由另一个域名提供ip地址,就需要添加CNAME记录。
TXT:在这里可以填写任何东西,长度限制255。绝大多数的TXT记录是用来做SPF记录(反垃圾邮件)。
NS:域名服务器记录,如果需要把子域名交给其他DNS服务商解析,就需要添加NS记录。
AAAA:用来指定主机名(或域名)对应的IPv6地址(例如:ff06:0:0:0:0:0:0:c3)记录。
MX:如果需要设置邮箱,让邮箱能收到邮件,就需要添加MX记录。
URL:从一个地址301重定向到另一个地址的时候,就需要添加URL记录(注:DNSPod目前只支持显性301重定向)。
SRV:记录了哪台计算机提供了哪个服务。格式为:服务的名字、点、协议的类型,例如:_xmpp-server._tcp。
全部类型可及含义参考维基
DNS访问过程
- 浏览器将会检查缓存中有没有这个域名对应的解析过的IP地址,如果有该解析过程将会结束。浏览器缓存域名也是有限制的,包括缓存的时间、大小,可以通过TTL属性来设置。
- 如果用户的浏览器中缓存中没有,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
- 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
- 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
- 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
- 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找域名域服务器,重复上面的动作,进行查询,直至找到域名对应的主机。
- 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
DNS缓存
- 浏览器DNS缓存TTL与返回DNS的TTL不同,Chrome可通过
chrome://net-internals/#dns
查看浏览器缓存,TTL为1分钟 - 系统DNS缓存会参考DNS服务器响应的TTL,但不完成等于TTL。
- ISP有时会设置较长TTL,导致更新不及时。
- Android 10分钟,IOS 24小时刷新。
在从Root DNS请求域名解析的过程中,有太多的层次影响DNS的获取,缓存是双刃剑,提高了获取DNS的速度,也会影响DNS在IP变更时不能及时更新到最新。导致IP切换或内外网访问切换将可能导致访问失败。
常用命令
- 清除DNS缓存记录可以使用
ipconfig /flushdns
- 查询DNS记录可以用
ipconfig /displaydns
- 查询某个DNS对应的IP可用
nslookup www.163.com
加入-d,可获取TTL时间
A记录与CNAME详解
A记录是将域名指向一个IP地址,而CNAME则是将一个域名指向另一个域名,同时继承另一个域名的完整resolution chain.
#A record
blog.dnsimple.com. A 185.31.17.133
#CNAME record
blog.dnsimple.com. CNAME aetrion.github.io.
aetrion.github.io. CNAME github.map.fastly.net.
github.map.fastly.net. A 185.31.17.133
- 使用CNAME时,被指向的域名不能有其他的record,如用于email的MX record.
- IP地址固定的情况下适合使用A记录。
- 此外可通过URL record, HTTP 301实现重定向。
- CNAME永远不要用于根域名。