详解DNS原理 - 六省断网其实和DNSPod无关

| No Comments | No TrackBacks
最近在CB上看到多篇存在关于DNS故障的文章,其中大多存在谬误,让人产生问题在于DNSPod,而暴风影音是无辜的受害者的错觉。这里我觉得有必要出来说说DNSPod才是无辜受害者,错全在暴风(还有黑客)。
首先说说DNS是怎么注册的:
一个域名注册成功以后上级域名的拥有者把这个域名的解析授权(Delegate)给用户指定的域名服务器,此时该服务器成为该域的权威(Authoritative)服务器,一切到该域名的查询以此服务器提供的结果为准。(也存在不授权只设置NS记录的情况。)
比如新浪注册了sina.com,向VeriSign交了钱以后,VeriSign在他们的根域名服务器里面添加如下的记录:
sina.com. 60 IN NS ns3.sina.com.cn.
sina.com. 60 IN NS ns1.sina.com.cn.
sina.com. 60 IN NS ns2.sina.com.cn.
ns1.sina.com.cn. 37305 IN A 202.106.184.166
ns2.sina.com.cn. 37305 IN A 61.172.201.254
ns3.sina.com.cn. 37305 IN A 202.108.44.55
然后我们看如何解析:
因为DNS是非常基础的服务直接关系到网络访问的效率,所以DNS是采用多级缓存的方式运作的。通常一个程序发出DNS请求以后,系统会先搜索自己的DNS 缓存,没有找到则会向网络设置中的DNS服务器发出请求。对一个电信用户来说这个服务器被DHCP协议自动配制成电信指定的服务器。
电信的DNS服务器在收到请求后还是检查自己的缓存,与个人电脑的缓存机制不同的是,一般公共DNS服务器为了加快解析减少流量,都将一个成功的解析缓存域名记录中指定的最长时间(即TTL值,常见的是3600秒)。但如果缓存里没有这个域名的记录,此时根据配置不同有两种选择:一是向自己的上级DNS服务器请求(Forwarder),二是从root-hints开始逐级向下解析。比如当收到www.sina.com的请求的时候,DNS发现缓存里有.com的域名的NS(域名服务器指向)记录,随即向该服务器请求sina.com,获得一个新浪的域名的NS记录以后转而向该服务器请求 www.sina.com。新浪的服务器返回结果,解析成功并将结果返回用户,同时将中间所有的结果都缓存下来以备下次使用。
从上面的过程可以看出,绝大多数的用户频繁访问的域名都已经在比较低级的DNS缓存了,一般几小时才会向该域名 的权威服务器发送请求。
再来看看此次断网事件:
首先DNSPod被攻击了,其实在断网前几天DNSPod的Web服务器(和NS1)也被攻击过。因为流量巨大,当地电信在骨干网上封掉了他们电信主域名服务器的IP。
3600 秒以后,缓存在各地DNS服务器上的暴风的记录过期,但此时暴风指向DNSPod的NS记录还没有过期(一般是24小时),于是各地的DNS继续向已经被封掉IP的服务器发送查询。由于域名查询使用UDP协议,服务器不会马上意识到对方主机已经下线(也可能与电信封IP的方式也有关,没有返回ICMP 包),在超时以后才放弃查询。但由于DNS服务器一般被配置为不缓存失败的查询,所以下一个DNS请求来的时候它还是得去向那个封掉的IP发送查询。
(注意此时DNSPod的IP被电信封了,后续所有的内容都和DNSPod无关。)
然后我们看看暴风客户端在干什么,首先它很”无辜“地向自己的服务器请求一个广告或者升级,于是需要解析服务器的域名。电信的DNS服务器收到请求以后,等待两秒没收到结果,只好对客户端说sorry。可是暴风客户端马上开始重试重试再重试,于是全国上亿的暴风用户都向DNS服务器发出的请求。由于这些服务器始终无法解析出域名,这些请求逐渐被堆积在内存里。最悲哀的是每个请求需要有一个请求ID以对应每一个客户端,而这个ID数量是有限的,当并发请求数达到一定数量的时候内存或者ID耗尽,服务器拒绝服务了。
从以上可以看出,此次的元凶除了最早攻击DNSPod的黑客以外,大概就是暴风流氓式的程序设计了。

No TrackBacks

TrackBack URL: http://tech.bestjoin.net/MT/mt-tb.cgi/493

Leave a comment

About this Entry

This page contains a single entry by Lance published on May 25, 2009 9:43 AM.

5月19日大陆DNS大规模故障始末 was the previous entry in this blog.

用户在优化Vista系统时的种种误区 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.