代碼:燼_第11章 DNS污染(1)
龍系統的公共DNS服務徹底停擺之後,瀛海市的數字世界沒有立刻陷沉默——它先陷了一種更可怕的狀態:錯。
三組節點全部離線後的第十七秒,備用微波鏈路終於完了切換。這是龍系統設計之初就埋下的最後一道保險——一條獨立於纖網絡之外的微波應急通道,直連龍穹科技總部地下機房的輔助DNS服務。輔助服務平時不參與公共解析,只做兩件事:一是每天凌晨從節點同步一次區域文件快照,二是在所有節點同時宕機的極端況下臨時頂上去。按照設計文檔里的描述,這個切換過程應該在十五秒完,從切換功到輔助服務開始正常響應查詢請求,額外還需要大概十秒的緩存預熱時間。加上之前已經過去的十七秒,總計大約四十二秒。
四十二秒的全城DNS空白,對於一座四千萬人口的巨型都市來說,已經夠長了。足夠讓所有依賴域名解析的服務——從銀行易到外賣配送到醫院挂號——全部陷等待超時。但四十二秒之後,輔助服務上線,一切應該逐漸恢復正常。
但輔助服務上線的時間點,恰好撞上了另一件事。
林劫的殭網絡還活着。兩百萬台在節點宕機之後並沒有停止發包——它們還在持續向已經死的三組節點IP地址發送查詢請求,每秒超過一千萬次。微波鏈路切換功的那一刻,輔助服務剛剛開始預熱緩存,還沒來得及理第一條外部查詢,就被一從備用鏈路湧進來的數據洪流迎面拍在了臉上。這流量的規模遠小於之前的直接攻擊——因為微波鏈路的帶寬只有纖的二十分之一,理瓶頸天然限制了洪峰的流量上限。但問題是,輔助服務的理能力也只有主節點的不到十分之一,它的設計定位是“在節點計劃維護期間臨時接管”,而不是“在節點被DDoS打死後扛全城流量”。
輔助服務的DNS解析進程在啟後的零點幾秒就發了過載保護,開始主丟棄超出理上限的查詢請求。丟包率達到百分之四十的時候,緩存命中率開始斷崖式下跌——因為大量正常用戶的查詢請求被丟掉了,而活下來的請求里大部分是殭網絡發出的垃圾查詢。垃圾查詢請求的域名是隨機生的,每一條都不在緩存里,每一條都強制服務向上一級權威DNS發起遞歸查詢。輔助服務的遞歸查詢併發數上限是每秒兩萬條——在正常工況下這個上限幾乎不可能被發。但此刻,數十萬台正在用隨機生的假域名瘋狂轟炸它的遞歸查詢隊列,隊列在不到半秒就被塞滿了。
遞歸隊列溢出之後,輔助服務的DNS解析進程做了一個所有DNS件在極端力下都會做的事——它開始返回SERVFAIL。不是查詢結果,不是“域名不存在”,而是直接的“服務故障”。但這還不是最糟的。由於遞歸隊列中積了大量尚未完的狀態機,進程存佔用開始急劇膨脹,最終發了作系統的OOiller。OOiller這次沒有殺掉DNS服務進程——它殺錯了,殺掉了負責DNS區域文件完整校驗的後台守護進程。守護進程一死,區域文件失去了實時保護。
而殭網絡還在發包。其中一部分請求包因為微波鏈路的數據錯誤,在傳輸過程中發生了比特翻轉——微波鏈路本來就比纖更容易天氣和電磁干擾,上次從舊通信基站授時服務取時間的時候林劫就已經領教過這條鏈路的氣。比特翻轉之後的請求包在DNS協議層面變了畸形包,輔助服務的畸形包理模塊還沒來得及加載——因為OOiller剛才順手把它也殺掉了。畸形包直接撞擊在未經校驗的區域文件緩存上,在存中寫了數千條錯誤的DNS記錄。這些記錄在極短的時間被寫了區域文件快照——因為負責阻止這種事發生的守護進程已經死了。後台同步進程到點照常執行,把這份被污染的區域文件快照通過微波鏈路的反向通道,同步回了龍穹科技總部地下機房的主DNS服務存儲陣列——主節點還在掙扎着試圖重新上線,剛剛完重啟,還沒來得及加載區域文件。
凌晨兩點零一分四十七秒。
龍系統公共DNS服務正式恢復。主節點從存儲陣列中加載了區域文件快照,開始響應全城範圍的所有查詢請求。這一次沒有過載,中間也沒有任何異常——節點的件能綽綽有餘,兩台纖直連的主節點和一台備用微波鏈路同時在線,全負載均衡正常工作,查詢延遲從幾千毫秒驟降至不到十毫秒。普通市民的手機、平板、智能家居、車載導航開始逐漸恢復網絡連接——但恢復的是被篡改過的網絡。在整個瀛海市範圍,DNS解析結果全部變了錯誤的容。當一個用戶在手機瀏覽里輸“瀛海銀行”的網址,瀏覽的DNS解析請求經過層層轉發到達剛剛恢復服務的DNS節點,節點查詢被污染的區域文件緩存後,返回了一個錯誤的IP地址——這個地址本不屬於任何一家銀行,而是一個已經被廢棄多年的個人博客服務。每當有市民試圖打開外賣應用,系統據錯誤的解析結果將請求路由到了一個空地址,屏幕上轉了幾圈加載畫之後彈出一條冰冷的提示:網絡連接異常,請稍後重試。每當有醫院的挂號系統嘗試與醫保數據庫建立連接,憑藉記憶中的域名解析出來的IP地址完全不屬於醫保中心,而是隨機指向了某個寫字樓里的廣告公司部服務。車載導航一旦請求高地圖更新,DNS把請求引向了一個只能返回空包的死胡同,地圖界面卡在定位圖標旋轉的花狀態不再更新,連路網信息都加載不出來。
這不是林劫親手設計的劇本——他不知道自己塞進DNS模板里的隨機域名會不會發比特翻轉,也不知道OOiller會殺掉哪個進程。但事就這樣發生了,從他敲下回車鍵的那一刻開始,所有的多米諾骨牌就已經在往下倒了。他只是推了第一塊,後面的每一塊都按照自己的重量和慣砸向下一塊。
“DNS污染了。”沈易盯着屏幕上那片麻麻的紅報錯日誌,臉上的表慢慢僵住了。這種攻擊效果他以前只在安全期刊上讀過——大多是個別黑客對單一緩存服務進行投毒的記錄,撐死影響幾個小眾網站。他從未見過全城範圍的毒化效應以眼可見的速度往外擴散,就像往一杯水裡滴了一滴墨水,看着墨擴散的速度快過擴散方程本的估計。通信號中央協調的智能駕駛系統高地圖服務始終連不上,車載信息娛樂終端反覆彈出“服務暫時不可用”的提示,路網信息缺失、擁堵避讓引導失效,全城智能駕駛車輛集陷被模式。金融網絡部的易路由被DNS污染帶偏,大量支付請求開始失敗,電子結算系統在兩次嘗試失敗後自發熔斷機制,暫時將整個支付網關強制降級為離線排隊模式。
”。了換全號牌門把是染污。門堵是SoDD“,輕很得變然忽音聲的他。說易沈”。狠SoDD比這“
。值低新個一來出跳新重才次幾了頓卡字數的上幕屏,截大一掉都次一新刷每,掉下往度速的台萬上秒每以數點節線在,始開分二零點兩晨凌從。作工續連的間時長麼這住不撐舊太本備設是者或,差太號信是概大——來回沒也再線掉脆乾的有,絡網出退自後復修統系被制機滾回件固為因備設的有,眠休進自後詢查次一後最完在備設的有,落回下向續持萬多十八百一從數點節線在。掉下往始開字數的跳行兩那上台制控的絡網殭,令指行一後最下敲他。復恢可不乎幾度角的他從,頭源的照快件文域區寫經已染污——義意有沒擊攻續繼,件文域區了載加新重經已也務服助輔,復恢經已點節。環循包發的絡網殭掉關——事件一後最做在正他。盤鍵着敲續繼,化變毫有沒面,錄記的染污被些那上幕屏着看劫林
。去淡上幕屏從始開的樣一熒。來下靜安地個一接個一在正,命使的們它了完點節的睡沉台萬百兩。散消塌崩速迅鐘分幾在點節殭的級量萬百