[經驗分享] 我的 Cloudflare Worker 被進行外部壓力測試,俗稱DDOS 😠

5 分鐘閱讀

目錄

1/3 下午我收到了三封 email 來自 Cloudflare,警告我 Workers 的用量被耗盡。
每日十萬次在下午兩點被用完?我的用量沒這麼狂,肯定有事情發生了。

發生了什麼

進到 Worker Dashboard 後注意到其中一支 Worker 被觸發了 251.22k 次
15 分鐘打了 25 萬次!
明顯是被 DDOS,但 Cloudflare 沒擋下來。或者說,我以為 WAF 會把這種異常擋下來。

這支 Worker 是用在 Soundbuttons 專案內的計數器,在 GitHub 上開源。它做的事很簡單: 存一個數值在 D1 資料庫,GET request 僅回傳數值,POST request 加 1 回傳數值。Soundbuttons 前端頁面在按鈕被觸發時就會 POST 一次。

有趣的是,再仔細看一次文首那張圖 —— 成功數 100%!

從 D1 的存取記錄可以看到,250.74k 查詢 + 28.13k 寫入。計數器的數字現在是 57213 ,而我記憶中上次注意到它是約 28000 左右,數目大致吻合。
* 計數器已手動校正回歸

這支 Cloudflare Worker 在 DDOS 攻擊中正常運作,證明了 Worker 和 D1 能夠直接吃下這個數量級的負載!持續的每秒 300 次請求!

哈哈,在外部壓測中交出漂亮成績單🤣

損失

損失難以估計...... 什麼的並沒有發生。除了我的當日免費額度被耗盡以外,沒有任何損失。

需要注意的是我是免費 plan,在超過流量時會被中斷服務而非被計價,所以我才沒有金錢損失。服務中斷對我的 side project 來說並不是什麼大問題,這符合我的預期。實際上這支 Worker 並沒有被中斷服務,我也不明白為什麼? 但我的其它 Worker 卻被中斷了。

如何預防再次發生

最大的問題是,Worker 被觸發了。
Worker 是以請求次數計價的,它被 DDOS 觸發本身就是問題,必須要在更前面就把它擋下來。

這支 Worker 我開了兩條路徑可存取

由於 sound-buttons.click 的 domain traffic 在這段時間顯示流量正常,可推測被打的是第二條預設的 workers.dev 的路徑。依照官方文件的說法,我認為 workers.dev 網域有 DDOS Protection 功能,但我在 dashboard 上找不到如何設定。或許是內建的不能設定? 這內建的不給力啊...

我的決定是停用 workers.dev 路徑,僅保留 sound-buttons.click 網域之下的路徑,並在網域上設定較嚴格的 DDOS 設定。還有就是... 不要把路徑直接寫在 GitHub 上😅

此攻擊來自巴西

延伸閱讀