DNS通识
网络库深入1–应用层网络通识DNS
DNS学习
使用dig查找域名服务器
1 | dig +trace www.163.com @8.8.8.8 |
查找根域名服务器地址
google8.8.8.8域名服务器查找根域名服务器,返回13台.根域名服务器(a..net-m..net),客户端可以使用其中高的一台去查找顶级域名服务器。
此时如果dig .root-servers.net可以获得根域名服务器的A记录.
1 | b.root-servers.net. 54421 IN A 199.9.14.201 |
查找com域名服务器
j.root-servers.net告诉client com域名服务器,一共13台com域名服务器。client可以使用其中一台com域名服务器超找163.com域名服务器
查找163.com域名服务器
client选择了com域名服务器m.gtld-servers.net去查找www.163.com的ip地址,所以需要找一台163.com域名服务器
查找最终IP地址或者cname地址
通过找的163.com域名服务器(3.nease.net)找到了www.163.com的cname记录。
通过cname找到对于的ip
可以看到如下对应的A记录。
抽象出DNS的层级结构
树形结构最为贴切,root就是根域名,再向左右两边长出枝干,按照层级对应顶级域名、一级域名、二级域名。
根域名.ROOT
最高以及域名节点,whole world 有13组根域名服务器,a.root-servers.net ~ m.root-servers.net,其中一个主根服务器在US,其余12个为辅根服务器,9in US,2 in UKand 瑞典,1in Japan。
13组根域名服务器由12个组织运营,Verisign管理2组根域名服务器,A J两个服务器,每家公司为例保证根域名服务器的稳定性,会部署多个节点,Verisign公司不熟练104台根域名服务器,根域名服务器个数至少有500多台。
.root域名一般被省略,所有域名查询都需要先访问根域名。
顶级域名
.com .net .edu .us .cn诸如此类域名,由美国加州ICANN公司管理,ICANN负责规定顶级域名的名字范围,不负责管理域名,每个顶级域名委托给托管商,比如.cn域名的托管商是中国互联网络信息中心(CNNIC),它决定了.cn域名的各种政策,目前最大的顶级域名托管商是Verisign,拖管了.com .net .name .gov四个一般性顶级域名以及.cc .tv国别级顶级域名。
DNS分级查找
定义
分级查询,根域名开始,依次查询每一级域名的NS记录,直到查到最终IP。每一级域名都有自己的NS记录,NS记录指向该级域名的域名服务器,这些NS服务器知道下一级域名的各种记录。
查找步骤
1 | dig +trace @8.8.8.8 www.163.com |
表示通过谷歌的域名服务器分级查找各级域名的NS记录,最后找到www.163.com的IP,查找steps:
询问本地DNS服务器(8.8.8.8):根域名服务器地址(.root的服务器地址)
询问根域名服务器:顶级域名服务器地址(com的域名服务器地址)
询问顶级域名服务器:二级域名服务器地址(163.com域名服务器地址)
询问二级域名服务器:www.163.com的IP地址
DNS记录类型
A(Address)记录是地址记录,用来指定主机名(或域名)对应的IP地址记录,通过A记录,可以设置不同域名指向不同的IP。
有时服务器的地址可能随时更改,并且不是固定的。 目前,使用了CNAME记录。 Cname也称为别名解析。 通常,将指定DNS服务提供商提供的第二级域名,以便DNS也可以通过该第二级域名找到服务器的IP地址。 使用CNAME的好处是,即使服务器的IP地址发生了变化,也无需更改解析记录。 DNS将自动更新解析,这比A记录要麻烦少一些。
A记录:域名到IP地址的映射,IPV4协议;AAAA IPV6协议
CNAME: 域名的别名,www.163.com的别名
MX:邮件投递时寻址
NS:权威服务器名字
PTR:IP地址到域名的映射,俗称反解
TXT:主机或域的文本记录,用于反垃圾
使用DNS的好处
服务器地址IP发生变化时,只需要在DNS系统中修改域名对应的ip即可,客户端则无需修改ip。
在客户端发器域名解析时,通过权威DNS服务器可以查到新的IP地址,然后建立起连接即可完成互联网络传输。
使用DNS的风险
DNS劫持导致用户呗重定向至非目标服务器。一旦DNS被劫持,意味着用户真实访问的网站并非是预期网站,可能造成资金安全、盗号、政治不安全等问题。
例如攻击方案“缓存投毒”,通过修改DNS缓存服务器中的DNS缓存记录,也就是通过对子域名的投毒进而影响主域名的所有DNS解析,比如黑客利用不存在的子域名(xx.xx.com)进行投毒,达到更新DNS缓存服务器上子域名和IP的映射关系,核心目的是为了更改主域名和黑客DNS服务器ip的映射关系,让所有通过主域名的DNS解析都通过走黑客的DNS服务器来达到目的。
实现缓存投毒,必须在DNS缓存服务器向权威服务器递归查询IP时,伪造大量的DNS Reply报文,先于权威服务器结果返回,达到先更新DNS缓存服务器中的域名和IP映射关系。
1.黑客向缓存服务器发送一个不存在的子域名请求,在授权服务器返回DNS Reply报文之前,黑客大量伪造DNS Reply(包含授权服务器IP、缓存服务器端口,Reply Query ID),在授权服务器Reply到达之前被缓存服务器缓存,如果只是缓存不存在的子域名,几乎没影响。
2.但是DNS Reply的时候会把主域名的解析记录一并返回,黑客利用这个机制,在伪造DNS Relpy报文的时候把主域名的映射关系也伪造掉,导致后续所有请求主域名的地址都是虚假的IP地址。
防御思路:检查DNS reply报文的会话五元组信息(源IP地址、目的IP地址、源端口号、目的端口号、协议),Query ID和域名是否和缓存服务器发出的DNS request报文一致。
HTTP DNS
传统的DNS是一个公共基础服务,如果DNS缓存服务器中存在DNS记录则直接返回客户端,若不存在需要通过根域名服务器、顶级域名服务器、权威域名服务器多层地递归查询服务器ip地址列表返回给客户端,且缓存到DNS缓存服务器。一般来说,运营商会在自己的IDC部署DNS缓存服务器来减少DNS分级查找的消耗。
缺点:缓存服务器存在和权威服务器同步更新不及时的情况、运营商域名转发导致并非最优链路,多层递归解析延迟、缓存污染等,导致客户端拿到的最终ip可能并非最优甚至是错误的。
这表明减少消耗同时要付出代价的。
解决思路:减少中间查询层级,如果能做到让客户端直接和最后缓存服务器交互,返回最优的服务器地址,就可以提升查询的效率。
基于上述思路,HTTPDNS采用不走传统的DNS解析,自己搭建基于HTTP协议的DNS服务器集群,DNS服务器集群中缓存自己的业务的服务器地址,分布在多个地点和多个运营商,当客户端需要DNS解析的时候,直接通过HTTP协议进行请求HTTPDNS服务器集群,得到就近的地址,这就需要基于HTTP协议,实现自己的域名解析和自定义地址簿,不使用统一的地址簿。
HTTPDNS比较适合手机端的应用场景,在客户端的HTTPDNS sdk中可以提前下发HTTPDNS服务器列表,意味着HTTP请求时的域名解析不走公开的DNS解析,而是直接访问HTTPDNS服务端,获取业务服务器的IP列表,缓存到本地。因为HTTPDNS sdk可以知道用户ip、运营商、所在的省市信息等,HTTPDNS智能调度服务综合地址位置、线路状况酸楚一个排序有先访问优质低延时的ip,缓存到客户端,减少递归查询的层级,提升查询效率。
HTTPDNS:像拥有一个帮助DNS解析的军师再去做DNS解析操作,是有能力的企业搭建自己的DNS缓存服务器,不走运营商的缓存服务器来减少中间查询层级,且通过自己的DNS缓存服务器可以做到实时刷新缓存,来解决更新不及时。