前面我转的阮一峰写的DNS 原理入门很好的介绍了DNS相关知识。
本文补充了这篇文章还没有介绍的地方,或者是介绍的不是很详细的地方,算是对DNS的一篇查缺补漏。
DNS规范
ISC网站列出了所有和DNS相关的RFC规范:DNS RFC。
有些规范可能已经被弃用了,比较常用的是下面两个规范:
ipv6
RFC 3096定义了DNS对 IPV6 的支持。
使用AAAA
记录类型作为IPV6的地址类型。
DNS根服务器
根域名服务器是互联网域名解析系统(DNS)中最高级别的域名服务器,负责返回顶级域名的权威域名服务器的地址。截至2014年10月,全球有504台根服务器,被编号为A到M共13个标号。
大部分借由任播(Anycast)技术,编号相同的根服务器使用同一个IP,504台根服务器总共只使用13个IP,因此可以抵抗针对其所进行的分布式拒绝服务攻击(DDoS)。
中国大陆在北京有三台编号为L的镜像,编号为F、I、J的镜像各一台,共6台;香港有编号为D、J的镜像各2台,编号为A、F、I、L的镜像各一台,共8台;台湾则有编号为F、I、J各一台,共3台。
所以虽然编号和IP地址相同,但是服务器确可能有多台。下面是这些服务器和地址的列表:
Hostname | IP Addresses | Manager |
---|---|---|
a.root-servers.net | 198.41.0.4, 2001:503:ba3e::2:30 | VeriSign, Inc. |
b.root-servers.net | 192.228.79.201, 2001:500:84::b | University of Southern California (ISI) |
c.root-servers.net | 192.33.4.12, 2001:500:2::c | Cogent Communications |
d.root-servers.net | 199.7.91.13, 2001:500:2d::d | University of Maryland |
e.root-servers.net | 192.203.230.10, 2001:500:a8::e | NASA (Ames Research Center) |
f.root-servers.net | 192.5.5.241, 2001:500:2f::f | Internet Systems Consortium, Inc. |
g.root-servers.net | 192.112.36.4 | US Department of Defense (NIC) |
h.root-servers.net | 198.97.190.53, 2001:500:1::53 | US Army (Research Lab) |
i.root-servers.net | 192.36.148.17, 2001:7fe::53 | Netnod |
j.root-servers.net | 192.58.128.30, 2001:503:c27::2:30 | VeriSign, Inc. |
k.root-servers.net | 193.0.14.129, 2001:7fd::1 | RIPE NCC |
l.root-servers.net | 199.7.83.42, 2001:500:9f::42 | ICANN |
m.root-servers.net | 202.12.27.33, 2001:dc3::35 | WIDE Project |
值的注意的是,在中国的只是根服务器的镜像,而不是根服务器的管理者。
任播Anycasting最初是在RFC1546中提出并定义的,它的最初语义是,在IP网络上通过一个Anycast地址标识一组提供特定服务的主机,同时服务访问方并不关心提供服务的具体是哪一台主机(比如DNS或者镜像服务),访问该地址的报文可以被IP网络路由到这一组目标中的任何一台主机上,它提供的是一种无状态的、尽力而为的服务。
权威DNS
权威DNS是经过上一级授权对域名进行解析的服务器,同时它可以把解析授权转授给其他人,如COM
顶级服务器可以授权xxorg.com
这个域名的的权威服务器为NS.ABC.COM
,同时NS.ABC.COM
还可以把授权转授给NS.DDD.COM
,这样NS.DDD.COM
就成了ABC.COM
实际上的权威服务器了。平时我们解析域名的结果都源自权威DNS。比如xxorg.com
的权威DNS服务器就是dnspod的F1G1NS1.DNSPOD.NET
和F1G1NS2.DNSPOD.NET
。
从字面意思也可以看出,权威就是该域名及下级域名的“说了算”的服务器;在权威上可以设置,修改,删除该区域内的解析记录, 而非权威DNS只能是查询。
Local DNS
Local DNS 也是和我们日常上网接触最多的DNS包括你的服务提供商(ISP)分配给你的DNS(一般为两个),或者接下来讲到的公共DNS。又因为填写在你的本地电脑上,所以也称为Local DNS。
公共DNS
我们都知道,我们要能上网,就必须要使用DNS。这个DNS可能是你的运营商提供给你的,也可以是一些其它组织提供的,比如我们熟知的谷歌的8.8.8.8,国内114dns的114.114.114.114. 。他们负责给我们的请求提供解析服务。
不过首先要明白,公共DNS不是:
- 不是根服务器
- 不是权威dns托管商,不提供域名注册等服务,比如万网和DNSpod
- 不是权威dns,不针对个别域名进行解析
公共DNS服务的特点就是服务的域名数量巨大,用户数多,同时要求具有安全性和抗攻击性,低延迟(响应快),无拦截(无广告)以及对解析成功率要求非常的高。
递归DNS
就是local dns。递归DNS可以理解为是一种功能复杂些的resolver,其核心功能一个是缓存、一个是递归查询。收到域名查询请求后其首先看本地缓存是否有记录,如果没有则一级一级的查询根、顶级域、二级域……直到获取到结果然后返回给用户。日常上网中运营商分配的DNSNS如8.8.8.8
即这里所说的递归DNS。
递归服务器怎么知道根权威服务器的地址?很简单,在递归服务器上都保存有一份根服务器的地址列表,如上面表格列出的根服务器的地址。
递归服务器每次查询域名都要向根那里找权威服务器吗?不是的,一旦成功一次,递归服务器就会把权威服务器列表缓存下来(如COM顶级服务器列表可以缓存48小时)。
转发DNS
负责接受用户查询,并返回结果给用户。但这个结果不是按标准的域名解析过程得到的,而是直接把递归DNS的结果转发给用户。它也具备缓存功能。他主要使用在没有直接的互联网连接,但可以连接到一个递归DNS那里,这时使用转发DNS就比较合适。其缺陷是:直接受递归DNS的影响,服务品质较差。比如我们用的路由器里面的DNS就是这一类,用路由器的朋友可以看下本地电脑的DNS一般都是192.168.1.1。
因此转发DNS可以看作是一种特殊的递归。如果本地的缓存记录中没有相应域名结果时,其将查询请求转发给另外一台DNS服务器,由另外一台DNS服务器来完成查询请求。
DNS查询过程
DNS污染
指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。 为了减免网络上的交通,一般的域名都会把外间的域名服务器数据暂存起来,待下次有其他机器要求解析域名时,可以立即提供服务。一旦有关网域的局域域名服务器的缓存受到污染,就会把网域内的电脑导引往错误的服务器或服务器的网址。
某个国家出现过多次的DNS污染, 参看知乎。
DNS缓存
查询DNS的时候可能会有多个地方存在缓存:
- 浏览器 DNS缓存
- Java DNS缓存
- OS DNS缓存
- Local DNS缓存
##eDNS
由于CDN主要根据用户LocalDNS的请求IP的运营商和地理属性返回相同或相近属性的节点,当用户使用了非当前网络运营商提供的DNS而使用知名的开发DNS如谷歌DNS(8.8.8.8或8.8.4.4)或OpenDNS(208.67.222.222或208.67.220.220)时,CDN往往不能正确选择最优节点,这也造成部分用户对CDN的效果产生了质疑。
针对这种状况,谷歌提出一个草案,并已由IETF牵头作为一个公开的标准建议,该草案叫“edns-client-subnet”,允许DNS resolver传递用户的ip地址给权威 DNS 服务器。其原理是当用户请求DNS的时候,递归DNS查询服务器将用户的IP或IP子网信息发给权威DNS服务器,权威服务器可以根据该信息返回相应的查询结果。