前情回顧

經過 黑衣人和 的合作,終於 清除 了入侵Linux帝國的網頁病毒,並修復了漏洞。不曾想激怒了幕後的黑手,一場新的風雨即將來臨。

詳情參見 一條SQL注入引出的驚天大案

1

風雲再起

小Q是Linux帝國網絡部負責TCP連接的公務員。

一直以來工作都很輕鬆,加班也少,但自從小馬哥到Linux帝國開設了nginx公司,小Q 的工作量一下就大了起來,經常加班,爲此小Q背後沒少抱怨。

一大早,nginx按時啓動,綁定了80端口監聽,開始了今天的營生。

沒過多久,今天的第一個客戶來了。

小Q還是如往常一樣,收到這個帶有 SYN 標記的數據包後,創建了一個連接請求塊,然後將其放入80端口歸屬的連接請求隊列中,回覆了一個帶有SYN和ACK標記的數據包後,開啓了一個定時器,等待第三次握手的完成。

沒等多久,這個客戶就發來了回信,三次握手完成。 小Q把這個連接請求塊轉移到了80端口對應的連接就緒隊列中,並按下了鈴鐺。

聽到鈴聲的nginx線程從epoll_wait函數中醒來,調用accept函數,從隊列中拿到了這個新來的客戶,開始服務。

這就是小Q的日常,他已經幹這份工作太久了,輕車熟路。

很快到了深夜,小Q準備打個盹兒,這麼晚估計是沒有活幹了。

沒想到剛躺下,就來了一個連接請求,小Q揉揉惺忪的睡眼,準備來處理,然後接着很快來了第二個,第三個,第四個······

奇怪的是,每一個客戶只發送了一個SYN就沒了音訊,眼看着連接請求隊列裏的請求塊越來越多,最後實在沒有空間安放新的請求塊,小Q開始意識到情況不妙,拉響了帝國安全警報······

2

全軍出擊

十分鐘前······

“快醒醒,有消息來了“,還在sleep的阿D被喚醒了。

“上峯總算想起我了,我來到Windows帝國都快一個月了,一直沒有指示,只是讓我保持靜默,我都憋壞了。” ,阿D伸了伸懶腰,起身調用recv函數取到了消息:

目標: 222.230.189.34

端口:80

動作:僞造源IP地址,發送SYN數據包

讀完消息後,阿D使用原始套接字構造 了一個TCP數據包,將SYN標記點亮,僞造了一個源IP地址,將其發送了出去。

經過一通路由轉發,這個數據包終於來到Linux帝國,卻遲遲沒有人來接待,側目望去,原來,已經有數不清的TCP包堵在門口,還有無數類似的TCP包正在源源不斷的湧入……

3

SYN Flood

此刻,帝國高層正在召開緊急會議。

防火牆:“ 現在有無數的網絡連接進來,爲了帝國的安全,我只好先關閉了網絡,把那些數據包擋在外面。”

小馬哥:“ 需要趕緊採取措施,恢復正常,我們nginx公司每秒鐘都在丟失大量的客戶,這是一筆鉅額損失!”

帝國安全部長:“小Q,你把當前的形勢介紹一下,大家一起來出謀劃策。”

小Q:“好的。TCP的三次握手想必諸位都有所瞭解, 收到SYN數據包後,我需要準備一個數據塊來存儲客戶端的信息,敵軍正是瞄準了這一點,給我發送 SYN數據包,我就需要分配大量的數據塊,直到把帝國空間耗盡 。”

小馬哥: “抱歉,我打斷一下,你爲何不及時把無效的數據塊釋放掉,騰出空間呢?

小Q:“當然有,我有一套超時機制,超時以後第三次握手還沒來,我就會給釋放掉。但現在問題是敵軍聲勢浩大,剛剛騰出的空間馬上又會被擠佔。”

小馬哥:“那簡單,你把超時時間調小一點,儘快釋放無效的數據塊不就行了!”

小Q:“要是太小了,正常的用戶因爲網絡原因,時延比較大的,這不就誤傷了嗎?”

小馬哥:“嗯,這個你們自己權衡一下,取一個合適的值,如今也沒有其他辦法,趕緊恢復生產纔是!”

安全部長:“小Q,先這樣試試看”

小Q:“行吧,我這就去”

半小時後 ······

小Q:“大人,我已經按照指示執行,不過網絡連接越來越多,這一招恐怕支撐不了太久,還是早做打算纔是。”

安全部長:“ WAF公司呢,你們有什麼辦法沒有?”

WAF公司黑衣人:“大人,我們關注的業務在於web應用安全,此次的 SYN Flood ,實非我等擅長。”

現場陷入了久久的沉默 ……

良久,防火牆打破了沉默:“小Q, 爲何非得在收到第一次握手SYN數據包後就建立數據塊?如果把數據塊的建立時間放在第三次握手之後呢?

小Q:“如果一開始不用建立數據塊佔用空間,那確實解決了大麻煩!不過,不建立數據塊,那如何把客戶端的信息保存起來呢?”

防火牆:“保存什麼信息?”

小Q:“客戶端的IP、端口、序列號這些啊。”

防火牆:“這些信息在第三次握手來的數據包中也有啊,不用提前存起來嘛!”

小Q:“說的也是,唉,還是不對,第三次握手我得校驗對方發來的ACK是不是我在第二次發給他的序列號+1,如果我提前不分配數據塊把我發給他的序列號存起來,到時候就沒辦法校驗了呀!不行,還是得提前存下來!”

防火牆:“有沒有什麼辦法,不用提前存,也能做校驗呢?”

小Q:“這,這怎麼做?”

防火牆:“有了! 第二次發給客戶端的序列號,如果不是一個隨機值,而是根據客戶端信息和其他信息綜合計算出來的一個哈希值,收到第三次握手的時候,我們拿到客戶端答覆的ACK,再重新計算一次哈希值,如果哈希值+1=ACK,那就能對得上,反之就是錯誤的包,直接丟棄!

還沒等小Q回過神,安全部長起身鼓掌: “妙哉! 這真是一個絕妙的點子! 小Q,就按這個辦法,趕緊去辦!

4

絕處逢生

小Q回到工作崗位,按照防火牆提供的思路修改了策略。隨後,通知防火牆重新打開網絡碼頭,但究竟效果如何,小Q心裏還是捏了一把汗。

網絡恢復的一剎那,無數TCP SYN數據包湧了進來,這一次,小Q不再分配數據塊,只是快速計算了一個哈希值作爲序列號,回覆給了客戶端。小Q忙的滿頭大汗,但看到存儲空間總算沒有瘋狂增長,小Q心裏長舒了一口氣。

收到消息的會議室裏響起了熱烈的掌聲!

安全部長:“本次經歷值得牢記,我們給這個方案取個名字吧,告知比特宇宙其他的帝國,幫助大家一起抵抗黑暗勢力的侵擾。”

WAF黑衣人搶先發言:“我覺得這個方式關鍵點在於把校驗信息的存儲從服務器放到了客戶端,有點類似web技術中的Cookie。要不咱們就叫做 SYN Cookie 吧!”

防火牆:“嗯,這個名字好,總結的很到位”

一個小時後,瘋狂的TCP SYN數據包潮水逐漸退去, Linux帝國終於恢復了往日的寧靜,nginx公司的業務也恢復了正常。 小Q抬頭一看,天邊已經微亮,這漫長的夜晚總算是熬過去了。

未完待續·······

彩蛋

“大人,Linux帝國有防火牆、WAF一幫人守衛,我們的攻擊沒有起到什麼效果。”

“你以爲他們真的是靠自己的本事勝利的嗎? 這次只是給他們點教訓, 我們的遊戲纔剛剛開始。

欲知後事如何,請關注後續精彩......

掃碼關注,更多精彩

相關文章