zoukankan      html  css  js  c++  java
  • dns解析原理

    通过六省断网事件剖析DNS解析原理

    2010-10-12

    最近在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的黑客以外,大概就是暴风流氓式的程序设计了。

    From:http://www.cnbeta.com/articles/85030.htm

    http://www.zzndns.com/news/397.html

  • 相关阅读:
    电子论文写作不发愁
    美化 Blog
    The problem with install redhat linux
    Unknown hard error.stop:c000021a.
    .NET集合类:定义,用途及使用条件
    linux ftp 命令详解
    [转]MVC和MVP的区别
    一次谷歌面试趣事(转)
    全文索引原理及其示例(sqlserver)【转】
    “什么是团队精神”——《海贼王》里的一段台词
  • 原文地址:https://www.cnblogs.com/lexus/p/2246396.html
Copyright © 2011-2022 走看看