風云再起
小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開始意識到情況不妙,拉響了帝國安全警報······
全軍出擊
十分鐘前······
“快醒醒,有訊息來了“,還在sleep的阿D被喚醒了。
“上峰總算想起我了,我來到Windows帝國都快一個月了,一直沒有指示,只是讓我保持靜默,我都憋壞了。”,阿D伸了伸懶腰,起身呼叫recv函式取到了訊息:

讀完訊息后,阿D使用原始套接字構造了一個TCP資料包,將SYN標記點亮,偽造了一個源IP地址,將其發送了出去。
經過一通路由轉發,這個資料包終于來到Linux帝國,卻遲遲沒有人來接待,側目望去,原來,已經有數不清的TCP包堵在門口,還有無數類似的TCP包正在源源不斷的涌入……
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,就按這個辦法,趕緊去辦!”
絕處逢生
小Q回到作業崗位,按照防火墻提供的思路修改了策略。隨后,通知防火墻重新打開網路碼頭,但究竟效果如何,小Q心里還是捏了一把汗。

網路恢復的一剎那,無數TCP SYN資料包涌了進來,這一次,小Q不再分配資料塊,只是快速計算了一個哈希值作為序列號,回復給了客戶端。小Q忙的滿頭大汗,但看到存盤空間總算沒有瘋狂增長,小Q心里長舒了一口氣。
收到訊息的會議室里響起了熱烈的掌聲!
安全部長:“本次經歷值得牢記,我們給這個方案取個名字吧,告知位元宇宙其他的帝國,幫助大家一起抵抗黑暗勢力的侵擾。”
WAF黑衣人搶先發言:“我覺得這個方式關鍵點在于把校驗資訊的存盤從服務器放到了客戶端,有點類似web技術中的Cookie。要不咱們就叫做SYN Cookie吧!”
防火墻:“嗯,這個名字好,總結的很到位”
一個小時后,瘋狂的TCP SYN資料包潮水逐漸退去,Linux帝國終于恢復了往日的寧靜,nginx公司的業務也恢復了正常。小Q抬頭一看,天邊已經微亮,這漫長的夜晚總算是熬過去了。

未完待續·······
uj5u.com熱心網友回復:
恩哼
uj5u.com熱心網友回復:
贊一個
uj5u.com熱心網友回復:
O(∩_∩)O哈哈~,看的津津有味,像小時候的小人書,有意思uj5u.com熱心網友回復:
這是。。。小說???轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/135695.html
標籤:新手樂園
