首页 > 历史军事 > 代码:烬 > 第11章 DNS污染

第11章 DNS污染(1/1)

目录

龙吟系统的公共DNS服务彻底停摆之后,瀛海市的数字世界没有立刻陷入沉默——它先陷入了一种更可怕的状态:错乱。

三组根节点全部离线后的第十七秒,备用微波链路终于完成了切换。这是龙吟系统设计之初就埋下的最后一道保险——一条独立于光纤网络之外的微波应急通道,直连龙穹科技总部地下机房的辅助DNS服务器。辅助服务器平时不参与公共解析,只做两件事:一是每天凌晨从根节点同步一次区域文件快照,二是在所有根节点同时宕机的极端情况下临时顶上去。按照设计文档里的描述,这个切换过程应该在十五秒内完成,从切换成功到辅助服务器开始正常响应查询请求,额外还需要大概十秒的缓存预热时间。加上之前已经过去的十七秒,总计大约四十二秒。

四十二秒的全城DNS空白,对于一座四千万人口的巨型都市来说,已经够长了。足够让所有依赖域名解析的服务——从银行交易到外卖配送到医院挂号——全部陷入等待超时。但四十二秒之后,辅助服务器上线,一切应该逐渐恢复正常。

但辅助服务器上线的时间点,恰好撞上了另一件事。

林劫的僵尸网络还活着。两百万台肉鸡在根节点宕机之后并没有停止发包——它们还在持续向已经死透的三组根节点IP地址发送查询请求,每秒超过一千万次。微波链路切换成功的那一刻,辅助服务器刚刚开始预热缓存,还没来得及处理第一条外部查询,就被一股从备用链路涌进来的数据洪流迎面拍在了脸上。这股流量的规模远小于之前的直接攻击——因为微波链路的带宽只有光纤的二十分之一,物理瓶颈天然限制了洪峰的流量上限。但问题是,辅助服务器的处理能力也只有主节点的不到十分之一,它的设计定位是“在根节点计划内维护期间临时接管”,而不是“在根节点被DDoS打死后硬扛全城流量”。

辅助服务器的DNS解析进程在启动后的零点几秒内就触发了过载保护,开始主动丢弃超出处理上限的查询请求。丢包率达到百分之四十的时候,缓存命中率开始断崖式下跌——因为大量正常用户的查询请求被丢掉了,而活下来的请求里大部分是僵尸网络发出的垃圾查询。垃圾查询请求的域名是随机生成的,每一条都不在缓存里,每一条都强制服务器向上一级权威DNS发起递归查询。辅助服务器的递归查询并发数上限是每秒两万条——在正常工况下这个上限几乎不可能被触发。但此刻,数十万台肉鸡正在用随机生成的假域名疯狂轰炸它的递归查询队列,队列在不到半秒内就被塞满了。

递归队列溢出之后,辅助服务器的DNS解析进程做了一个所有DNS软件在极端压力下都会做的事——它开始返回SERVFAIL。不是查询结果,不是“域名不存在”,而是直接的“服务器故障”。但这还不是最糟的。由于递归队列中积压了大量尚未完成的状态机,进程内存占用开始急剧膨胀,最终触发了操作系统的OOMKiller。OOMKiller这次没有杀掉DNS服务进程——它杀错了,杀掉了负责DNS区域文件完整性校验的后台守护进程。守护进程一死,区域文件失去了实时保护。

而僵尸网络还在发包。其中一部分请求包因为微波链路的数据错误,在传输过程中发生了比特翻转——微波链路本来就比光纤更容易受天气和电磁干扰,上次从旧通信基站授时服务器取时间的时候林劫就已经领教过这条链路的娇气。比特翻转之后的请求包在DNS协议层面变成了畸形包,辅助服务器的畸形包处理模块还没来得及加载——因为OOMKiller刚才顺手把它也杀掉了。畸形包直接撞击在未经校验的区域文件缓存上,在内存中写入了数千条错误的DNS记录。这些记录在极短的时间内被写入了区域文件快照——因为负责阻止这种事发生的守护进程已经死了。后台同步进程到点照常执行,把这份被污染的区域文件快照通过微波链路的反向通道,同步回了龙穹科技总部地下机房的主DNS服务器存储阵列——主节点还在挣扎着试图重新上线,刚刚完成重启,还没来得及加载区域文件。

凌晨两点零一分四十七秒。

龙吟系统公共DNS服务正式恢复。主节点从存储阵列中加载了区域文件快照,开始响应全城范围的所有查询请求。这一次没有过载,中间也没有任何异常——根节点的硬件性能绰绰有余,两台光纤直连的主节点和一台备用微波链路同时在线,全负载均衡正常工作,查询延迟从几千毫秒骤降至不到十毫秒。普通市民的手机、平板、智能家居、车载导航开始逐渐恢复网络连接——但恢复的是被篡改过的网络。在整个瀛海市范围内,DNS解析结果全部变成了错误的内容。当一个用户在手机浏览器里输入“瀛海银行”的网址,浏览器的DNS解析请求经过层层转发到达刚刚恢复服务的DNS根节点,根节点查询被污染的区域文件缓存后,返回了一个错误的IP地址——这个地址根本不属于任何一家银行,而是一个已经被废弃多年的个人博客服务器。每当有市民试图打开外卖应用,系统根据错误的解析结果将请求路由到了一个空地址,屏幕上转了几圈加载动画之后弹出一条冰冷的提示:网络连接异常,请稍后重试。每当有医院的挂号系统尝试与医保数据库建立连接,凭借记忆中的域名解析出来的IP地址完全不属于医保中心,而是随机指向了某个写字楼里的广告公司内部服务器。车载导航一旦请求高精地图更新,DNS把请求引向了一个只能返回空包的死胡同,地图界面卡在定位图标旋转的菊花状态不再更新,连路网信息都加载不出来。

这不是林劫亲手设计的剧本——他不知道自己塞进DNS模板里的随机域名会不会触发比特翻转,也不知道OOMKiller会杀掉哪个进程。但事情就这样发生了,从他敲下回车键的那一刻开始,所有的多米诺骨牌就已经在往下倒了。他只是推了第一块,后面的每一块都按照自己的重量和惯性砸向下一块。

“DNS污染了。”沈易盯着屏幕上那片密密麻麻的红色报错日志,脸上的表情慢慢僵住了。这种攻击效果他以前只在安全期刊上读过——大多是个别黑客对单一缓存服务器进行投毒的记录,撑死影响几个小众网站。他从未见过全城范围的毒化效应以肉眼可见的速度往外扩散,就像往一杯水里滴了一滴墨水,看着墨色扩散的速度快过扩散方程本身的估计。交通信号中央协调器的智能驾驶系统高精地图服务器始终连不上,车载信息娱乐终端反复弹出“服务暂时不可用”的提示,路网信息缺失、拥堵避让引导失效,全城智能驾驶车辆集体陷入被动模式。金融网络内部的交易路由被DNS污染带偏,大量支付请求开始失败,电子结算系统在两次尝试失败后自动触发熔断机制,暂时将整个支付网关强制降级为离线排队模式。

“这比DDoS狠。”沈易说。他的声音忽然变得很轻,“DDoS是堵门。污染是把门牌号全换了。”

林劫看着屏幕上那些被污染的记录,面色没有丝毫变化,继续敲着键盘。他正在做最后一件事——关掉僵尸网络的发包循环。根节点已经恢复,辅助服务器也已经重新加载了区域文件,继续攻击没有意义——污染已经写入区域文件快照的源头,从他的角度几乎不可恢复。他敲下最后一行指令,僵尸网络的控制台上那两行跳动的数字开始往下掉。在线节点数从一百八十多万持续向下回落,有的设备在完成最后一次查询后自动进入休眠,有的设备因为固件回滚机制被系统修复后自动退出网络,有的干脆掉线再也没回来——大概是信号太差,或者是设备本身太旧撑不住这么长时间的连续工作。从凌晨两点零二分开始,在线节点数以每秒上万台的速度往下掉,每刷新一次都掉一大截,屏幕上的数字卡顿了几次才重新跳出来一个新低值。

百万量级的僵尸节点在几分钟内迅速崩塌消散。两百万台沉睡的节点完成了它们的使命,正在一个接一个地安静下来。荧光液一样的光开始从屏幕上淡去。

目录
返回顶部