1. 程式人生 > 實用技巧 >記一次針對靜態頁面的DDOS基本防護

記一次針對靜態頁面的DDOS基本防護

可以說是我試圖進入安全口的天才第一步了,能走多遠鬼知道呢

背景

去年年前接到的一個外包專案,是一個base在日本的中國人留學機構做的靜態頁面。出於鍛鍊自己的目的,選擇為他們按次結薪做長期服務維護。20年618當天給我越洋電話打過來說大量潛在客戶試圖訪問機構官網報錯無法訪問伺服器,讓我去幫他們看看怎麼回事。

回到電腦前登陸阿里雲,發現頻寬和CPU被佔滿了,如下圖所示:

第一反應就是:壞了,拒絕服務攻擊,搞不好還是分散式的……然後登陸後臺嘗試看日誌,發現還真是拒絕服務攻擊:

還行,不是分散式的,不過也夠吃滿了伺服器的1核1G1MBps小水管了……對方還挺無聊,發post沒把body整的整齊劃一,內容繽紛多彩

處理過程

第一階段:請求洪泛

iptable bans:
由於發現對方沒有使用分散式的攻擊手段,我考慮停止對攻擊流量的來源IP地址進行HTTP響應,經過查詢學習,我選擇使用iptables命令完成這一操作:
iptables -I INPUT -s <ip addr.> -j DROP
通過此命令,當傳入閘道器的ip地址為定義的ip時,閘道器會直接丟棄請求,不做任何處理。然而很快我就發現自己太年輕了。對方顯然不是抱著筆記本在攻擊我,他們不僅更換了ip, 還歡樂罵我的話……

我當時很幼稚的不死心,又用iptables ban了對面五個IP,然後對方換了IP繼續打我,我真的毫無辦法……

第二階段 分散式請求洪泛

ddos deflate:
由於對方會動態更換IP地址,單純手動封禁IP只能做到“見招拆招”,假設對方用的手動更換IP還好,拼手速即可,一旦人家用的是IP池自動呼叫,人是肯定幹不過機器的。一開始打算造輪子,結合

    iptables -I INPUT -s <addr> -j DROP

弄個指令碼自動封IP,後來覺得僱主給不了讓我滿意的錢而且我太懶,於是轉而上網尋找輪子——找到了ddos deflate

這款軟體完全實現我的想法:輪詢拿指定時間範圍內的網路訪問記錄,把設定時間長度內連續請求數量大於指定值的IP自動關進小黑屋一段時間。但是他不是萬能的,對於僱主的小水管,一秒一次的請求居然也能造成服務延遲,對方不斷試探我配置的引數,先後有過一秒一次,五分鐘30次然後停止攻擊5分鐘、半小時攻擊停止五分鐘等各種憨批操作……下圖這些稀奇古怪的字串有無大佬知道是什麼,還請評論區教教我。

後來我配上一小時內連續訪問50次就ban的自殺式配置了以後,伺服器太平了10天左右。我自以為高枕無憂,沒想到……

第三階段 SYN 半開連結攻擊

強安全策略 + CDN掩蓋源站地址
這次僱主又給我打電話,說裂開了,訪問時斷時續的。我上去看發現對方每三十秒給我發一次髒話。奇了怪了,這怎麼會讓服務崩潰呢?用netstat命令檢視發現有些IP地址連線數很高卻沒有被 ddos deflate遮蔽掉,於是檢視這些IP的連結情況(圖是我後來截的):

可以看到,有些IP一直處於 SYN_RECD 狀態(這裡沒有是因為攻擊已經被遮蔽了,命令是對的哈),意即為已經向其傳送了SYN訊號等待第三次握手,卻沒有收到ACK。每當一個IP地址埠向我們的伺服器傳送TCP連結請求,都會有一個執行緒被喚起對其提供服務,如果攻擊者drop我們發回的SYN,預設的該執行緒會等待15分鐘並重試3次,也就是說對方每個埠發動攻擊一次就會浪費一個執行緒45分鐘。當量足夠大,執行緒池爆掉的時候,你的伺服器就再也無法為正常使用者提供服務了。
這一攻擊致命在於你不能判斷一個TCP半開連結是真的網不好還是有惡意,所以超時太短會導致影響正常使用者體驗,太長則會被對方攻擊流量洪泛。網傳的哪些加大視窗佇列長度、縮短超時時間等方法實際上並不能解決本質問題。

那麼我們怎麼解決這個問題呢?
答案是使用分散式內容分發網路(CDN)。由於CDNIP不固定且遍佈全球,某個IP如果被短時間高流量爆破,還有其他的IP為使用者提供服務,不會導致系統完全停止響應。而大多CDN提供了更好用的防火牆設定,也能方便我們自定義安全策略。本次處置我採用了CloudFlare CDN(免費版)+ 阿里雲強安全策略解決了這一問題。

第一步:部署CloudFlare

登陸註冊以後,前往你的域名服務商,將DNS重定向至Cloudflare提供的地址:

隨後,等待24h使修改生效。

第二步:應用強安全策略

在阿里雲上使用網路安全組策略,設定一個優先順序為2的禁止任何流量流入或流出伺服器的組策略和一個優先順序為1的允許Cloudflare IP地址通過防火牆的組策略:


這時你的服務應該已經恢復正常了,因為攻擊者就算知道源站IP,也沒有辦法用垃圾流量塞滿你的伺服器了。但是這還不夠太平,因為他們有可能洪泛掉免費CDN那點可憐的頻寬,怎麼辦呢:

第三步:使用Cloudflare防火牆策略

在Cloudflare上,根據僱主特點(訪問集中於東亞洲幾個國家和幾個VPS常見地址)部署自定義的防火牆策略,如圖:

成效是顯著的,域外發動的攻擊基本全部被遮蔽,一個月以來,我們的服務再也沒有中斷過,而對方的攻擊流量全部被Cloudflare 一 瞬 緩 存

願大家在防禦的路上武運方昌!