蝴蝶效应

令人意想不到的是,这次断网的起因竟然是所谓两个网游私服外挂互掐,一个游戏“私服”的网站打算对它的竞争对手发动攻击,黑客在没法黑掉竞争对手网站的情况下,干脆从域名下手,利用肉鸡攻击对方的免费DNS服务商DNSpod的服务器,大流量的DDoS攻击导致了DNSpod的服务器流量剧增,于是被机房停止了服务,导致DNSpod的DNS服务暂停。而非常不巧的是DNSpod正好是暴风影音的域名解析站,所以数以亿万计的全国的暴风用户集体转向电信的DNS解析服务器发起请求,导致电信的DNS服务器瘫痪,形成了这次席卷中国的大规模网络瘫痪。这次攻击间接导致了6省近一天的网络中断,工信部因此强制介入处理,而暴风影音被迫“史无前例”的召回他们的软件。

这次事件看起来暴风影音也是受害者,暴风影音也在第一时间就发布公告称:“事故原因系DNS域名解析故障,暴风也是受害者之一”云云,但实际上,暴风影音对此事负有不可推卸的责任。在DNS解析服务异常后,“无辜”的暴风影音由于未对DNS请求的频率进行限制,在访问网络失败后仍然不间断的重试,在海量用户的“帮助”下,把巨大的流量发向网络。首当其冲的,自然是各地运营商的DNS解析服务器,运营商倒下后,整个地区的DNS解析服务都无法进行。DNS解析是互联网最基础的服务,一旦无法工作,就演变了在我们看来的断网事件。

暴风影音6省断网事件原理示意图

就像上面断网事件示意图所展示的,一个节点的异常,在连锁反应下演变成了这场灾难。其实DNS域名解析服务,几乎是目前互联网最脆弱的神经,大大小小的故障不断。除了国内这次事件外,2002年有黑客利用数百万台肉鸡攻击位于美国的DNS根服务器,造成微软、Google、IBM等网站瘫痪数小时。

DNS请求处理方案

那么,我们要怎么做才能做到安全,让我们的产品远离“暴风门”?

1. 自建DNS服务器

一来可以保证服务质量,二来可以避免第三方免费DNS服务器被攻击而殃及鱼池。当然,黑客的攻击目标如果是你那这个是避免不了的。

2. 程序对DNS请求做频率限制和容错处理

  1. 在客户端中集成了大量硬编码的服务器IP地址,启动时会去判断DNS是否正常,如果DNS解析发生错误,则会直接使用服务器IP地址而不再使用DNS。QQ就是这么处理的。服务器的IP列表可以下推动态更新。
  2. 如果担心无法负载均衡和就近接入,那么干脆拒绝服务。启动时判断DNS是否正常,如果DNS解析发生错误,则会屏蔽后续的网络请求,直到DNS服务恢复。QQ音乐和QQ视频就是这么处理的。

TIPS

  • 在移动网络环境中,WIFI下,DNS时间为50ms左右,3G/2G下DNS时间会更长,如果直接使用IP访问的话,可以减少DNS的耗时。但是直接使用IP需要解决的问题就是就近接入问题。
  • 有些公司会引入一个叫做GSLB的东东。GSLB可以根据IP段级别实现国内运营商或者较大区域的接入引导。但是粒度相对比较粗,并且因为DNS缓存等原因,生效时间不太好控制。
  • 可以自己维护一套IP库和各地访问服务速度统计,实现更精细和更实时的引导,例如:根据用户id,客户端的版本号,客户端IP级和海外运营商等级别来引导用户到不同的加速点或直连回接入服务器;甚至可以在出现IDC级别的故障时,引导用户到备用IDC。