CCKiller:Linux輕量級CC攻擊防禦工具,秒級檢查、自動拉黑和釋放_linux shell

來源:互聯網
上載者:User

張戈部落格很久以前分享過一個CC攻擊的防禦指令碼,寫得不怎麼樣,不過被51CTO意外轉載了。部落格從此走上了經常被人拿來練手的不歸之路。

當然,還是有不少朋友在生產環境使用,並且會留言詢問相關問題。根據這些問題的需求,我花了一些時間重新寫了一個比較滿意的輕量級CC攻擊防禦指令碼,我給它取了一個比較形象的名字:CCKiller,譯為CC終結者。

一、功能申明

分享之前我必須先申明一下,眾所周知,DDoS攻擊指的是分散式阻斷服務。而CC攻擊只是DDoS攻擊的一種,本文所闡述的CC攻擊,指的是每個IP都以高並發請求攻擊,而非分布式海量IP的低並發DDoS攻擊!

對於個人低配伺服器,除了使用CDN來防護,至少我是沒有想到如何抵擋海量IP攻擊的!因為每個IP都用正常的UA來請求,而且每個IP的低並發請求和正常使用者請求一樣,並不會觸發防禦閾值,同時來1000個,甚至上萬個,個人低配伺服器的頻寬在第一時間就會被佔滿,無法繼續提供服務!

所以,如果你的網站正受到海量IP的低並發DDoS攻擊,那麼本文分享的CCKiller就無能為力了。趕緊去開啟CDN來拓展頻寬吧!

二、功能介紹

通過以上申明,也就大致給CCKiller一個定位:CCKiller是用於個人低配伺服器的輕量級CC攻擊防禦,可以抵擋單個IP產生的高並發攻擊。

目前設計的功能特性如下:
①、秒級檢查
很多人寫的防禦指令碼都是使用了Linux系統的計劃任務crontab來定時檢查的。而crontab的最細顆粒是1分鐘,也就是說指令碼最快也只能1分鐘檢查一次。對於一些強迫症來說就會很不爽。

所以,我還是按照以前分享的思路,利用while迴圈實現秒級檢查,實現更細的顆粒。當然,CCKiller更是被我寫成了系統服務,更加靈活穩定。
②、拉黑時間長度
CCKiller可以設定拉黑時間長度,預設為10分鐘。當發現有惡意請求時,會自動拉黑目標IP,並在拉黑時間長度結束後自動釋放,這個功能算是對我之前寫的指令碼的一個大的改進。
③、並發閾值
CCKiller 可以設定單個IP的最高請求數,如果某個IP同時請求數超過了設定的閾值,就會被暫時拉黑一段時間。
④、郵件發送
這個功能沒啥好說的,意義並不大。而且發送成功率和伺服器的環境也有很大關係。
⑤、並發顯示
安裝後,直接運行cckiller會列出當前系統的請求排行,可以清晰的看到當前請求IP和並發數。使用-s參數還可以繼續定製需求,比如 cckiller -s 10 就能顯示當前並發數排行前10名的IP。
⑥、手動拉黑
支援手動拉黑,執行後會立即檢查,將並發請求超過n的IP拉黑一段時間,比如 cckiller -k 100 就會將目前超過100個請求的IP拉黑一段時間,如果沒有則不會執行任何拉黑操作。

三、工具安裝
①、線上安裝

由於我可能經常會更新一些功能,或修複一些BUG,所以僅提供線上安裝,以保證指令碼是最新的。

安裝非常簡單,執行如下命令就能進入配置步驟了:

複製代碼 代碼如下:

wget --no-check-certificate -O install.sh https://zhangge.net/wp-content/uploads/files/cckiller/install.sh?ver=1.0.1 && chmod +x install.sh && ./install.sh -i

②、工具配置

因為每個伺服器的情況可能不一樣,所以有一個自訂配置的過程。

執行上述安裝命令後,將會進入自選配置部分,如圖:

提示否使用指令碼預設配置,如果選擇是(y),那麼顯示預設配置,並詢問是否繼續:

預設配置如下:

複製代碼 代碼如下:

The Time interval : 20 s       #每20s檢查一次系統請求情況
The Forbidden Time: 600 s  #拉黑時間長度設為10分鐘
Adminstrator Email: root@localhost   #郵件對象設定為root@localhost(即關閉郵件發送)
Connections Allow: 100      #單個IP並發限制為100

如果不符合你的需求,你可以使用 ctrl + c 按鍵組合終止指令碼,或者先繼續安裝,因為工具設計了配置修改的功能,所以無需著急。

如果不使用預設配置(n),則會要你輸入參數來自訂配置:

如圖,我將參數依次定義為每10秒進行檢查,拉黑時間長度為300秒,寄件者設定為部落格郵箱,並發限制設定為60,斷行符號後會彈出一個提示,讓你檢查,如果沒問題你直接斷行符號就會安裝並啟動:

③、服務控制

安裝後,會將cckiller註冊成系統服務,這時你就可以使用service來控制cckiller了。
使用標準的service定義,支援 start | stop | restart | status 四個參數。所以,你可以使用
service cckiller stop來停止cckiller,也可以使用service cckiller status來查看狀態。

 ④、整合命令

成功安裝後,系統還會多出一個cckiller的命令,這個命令現有功能如下:
cckiller -h可以調出協助資訊:

複製代碼 代碼如下:

CCkiller version 1.0.0 Author: Jager <ge@zhangge.net>
Copyright ©2015 zhangge.net. All rights reserved.
Usage: cckiller [OPTIONS] [N]
N : number of tcp/udp   connections (default 100)
OPTIONS:
-h | --help: Show       this help screen
-k | --kill: Block the offending ip making more than N connections
-s | --show: Show The TOP "N" Connections of System Current

我蹩腳的英文也能湊合解釋一下功能了吧~

-k 是拉黑功能,需要在後面帶上你想拉黑的並發數,比如 cckiller -k 100 就會拉黑當前請求數大於100的IP一段時間(和拉黑時間長度一致)

-s 是顯示並發排名,也需要在後面帶上數字,比如 cckiller -s 10 就能顯示當前並發數排行前10名的IP。
⑤、檔案結構
如上圖所示,指令碼安裝目錄為/usr/local/cckiller,其結構如下:

cckiller/
├── cckiller       #主程式
├── log/           #日誌目錄(ver 1.0.1新增特性)
├── ck.conf        #設定檔
├── ignore.ip.list #白名單
└── install.sh     #安裝和卸載指令碼
 
0 directories, 5 files

很簡單也比較規範的的結構,當然,後續功能如果越來越多,此結構可能會有所更新,這是後話。

如果你熟悉vim的話,只要編輯ck.conf就可以定義工具參數了:

複製代碼 代碼如下:

##### Paths of the script and other files
PROGDIR="/usr/local/cckiller"
PROG="/usr/local/cckiller/cckiller"
LOGDIR="/usr/local/cckiller/log"
IGNORE_IP_LIST="/usr/local/cckiller/ignore.ip.list"
IPT="/sbin/iptables"
DKName=CCkiller
DKVer=1.0.1
##### SLEEP_TIME設定檢查頻率,單位為秒
SLEEP_TIME=10
##### NO_OF_CONNECTIONS設定並發限制
NO_OF_CONNECTIONS=60
##### EMAIL_TO設定郵件的發送對象
EMAIL_TO="ge@zhangge.net"
##### BAN_PERIOD設定拉黑時間長度,單位為秒
BAN_PERIOD=300

如果不熟悉也沒關係。你還可以執行 ./install.sh -c 進行工具初始化,重新設定所有參數,過程和首次安裝時一致,這裡就不贅述了。
⑥、白名單
工具安裝時會預設將系統所有IP都加入白名單,避免自己把自己給拉黑的尷尬。如果你還有其他要加白的IP,可以將IP加入到cckiller安裝目錄下的ignore.ip.list檔案中,每行一個。

Ps:目前白名單還不支援IP段,敬請期待後續更新。
⑦、卸載工具
有心的朋友可能注意到了install.sh是可以帶參數的。我寫代碼的時候已經設計了幾個常用的安裝卸載功能,具體如下:

複製代碼 代碼如下:


#直接執行./install.sh 將會顯示如下協助資訊
###################################################################
#  CCkiller version 1.0.1 Author: Jager <ge@zhangge.net>          #
#  For more information please visit https://zhangge.net/5066.html #
#-----------------------------------------------------------------#
#  Copyright @2015 zhangge.net. All rights reserved.              #
###################################################################
 
Usage: configure.sh [OPTIONS]
 
OPTIONS:
-h | --help : Show help of CCkiller
-u | --update : update Check for CCkiller [not available now]
-c | --config : Edit The configure of CCkiller again
-i | --install : install CCkiller version 1.0.0 to This System
-U | --uninstall : Uninstall cckiller from This System

其中:


-u 參數用來升級工具,不過目前由於沒時間還沒寫,所以不可用(Ver 1.0.2已支援線上更新)

-i 參數用來安裝工具,如果已安裝則會提示並終止

-c 參數用來組態工具,方便安裝後隨時修改工具配置

-U 參數用來卸載工具,注意是大寫哦!

因此,我們可以使用 ./install.sh -U 如圖卸載CCKiller:

四、攻防測試

成功安裝並啟用CCKiller之後,我們可以使用壓力測試工具來測試拉黑和釋放效果,比如webbench 或 ab等。
假如CCKiller設定的並發限制為100,檢查間隔為10s,使用webbench如下測試:
webbench -c 101 -t 60 http://www.yourwebsite.com/
啟動測試後,你可以立即去伺服器上查看防火牆:
iptables -nvL
多刷幾下,就可以看到webbench所在伺服器IP已經在DROP規則中了。
確定已被拉黑之後,你等個10分鐘再來看防火牆,可以發現webbench所在伺服器IP已經消失了,成功釋放!

Ps:如果郵件發送功能無誤,那麼應該也收到了工具發來的警示郵件,比如有一個飽受CC攻擊煎熬的站長給我發來的反饋:

五、更多說明①、配置並發限制
CCKiller配置最大串連數限制時,建議根據單個網頁產生的並發數來判斷。

情況A: 你網站做了動靜分離,那麼靜態請求就到另一個網域名稱了(假設靜態資源託管在另一台伺服器或是CDN),單個IP請求一個頁面可能就只會產生若干並發(假設5個),我們假設某個使用者很猛,他喜歡快速拖拽開啟你網站的多個網頁,比如同時開啟10個,那麼正常使用者的正常最大並發你也可以基本確定了吧?即並發限制:10x5=50。如果有人同時重新整理你幾十個頁面,要說沒惡意你也不相信吧?

情況B: 如果沒有做動靜分離,那麼一個頁面產生的並發可能就比較多了,每個css、js、圖片都會產生一次請求。所以,在這種情況下就需要稍微計算一下你網站單個頁面產生的並發請求,比如一個單頁面會產生30個請求,那麼你也需要考慮使用者可能會連續拖拽多個頁面的情況,假設我允許使用者可以同時重新整理10頁面,那麼並發限制就可以設定為300了,依此類推。

容錯:從A和B來看,CCKiller其實是有一個盲點的,那就是如果使用者IP是某個公司的統一出口,也就是代理上網IP,那麼工具就容易誤殺無辜了。所以,除了A和B,你還得考慮你網站的受眾人群類型。比如,我就一個個人部落格,同一時刻被一個公司的多名同時多視窗拖拽訪問,這種情況也不多吧?如果可能存在這種受眾人群,那麼這個並發限制可以設定大一些,避免錯殺無辜。當然,拉黑也就10分鐘而已,也不至於“一失足成千古恨”。。。

當然,不管哪種情況,並發限制都可以比預估設定高那麼一些,這個自行斟酌吧!
②、不足與完善
CCKiller是我最近利用閑暇時間,匆忙之作,難免會有各種問題。也沒時間進行測試和完善。不過目前還是有數位站長在使用,暫未反饋異常。當然, 我分享的是線上安裝方式,也是為後續的更新提供方便。不過對比我以前寫的防禦指令碼,CCKiller算是有了長足的進步了,很簡單的安裝,更強大的功能!

功能計劃:

A. 線上升級功能

這個不用多說,現有的工具已經預留了,後面可能會加入版本判斷和更新的功能。

B. 加入其他安全防護設定

目前工具其實是趕鴨子上架一樣,直接就檢查,也沒有對系統內容做一些初始化的設定。比如網站通用的iptables設定、sync洪水攻擊防禦等。後續會在安裝的時候會作為一個可選功能。

C. 整合傻瓜式的防火牆控制功能

並不是每個站長都會熟練操作iptables,所以可能考慮給cckiller這個命令整合一個ban和unban ip的功能,比如禁止一個ip,執行 cckiller -D $ip 即可,降低 iptables 的使用門檻。

另外,值得說明是,CCKiller只適合裸奔的網站,而不適合使用CDN的網站,因為使用CDN之後,請求過來的IP都是CDN節點,你總不能把CDN節點也拉黑了吧?(Ps:其實也可以用,你把並發限制稍微設定高一些就好了,就算拉黑CDN節點也就拉黑10分鐘而已,不至於影響過大)

針對這個問題,後續我會找時間研究下直接從Nginx日誌裡面取得真實來源IP來拒絕訪問。目前已經有了階段性的進展了,敬請期待!
附錄:更新記錄

2015-09-23 Ver 1.0.1:

支援白名單為IP段新增拉黑改為判斷 iptables 是否已存在操作IP的判斷方式;增加日誌記錄功能,每天一個記錄檔,位於安裝目錄下的log檔案內;整合手動拉黑IP和解鎖IP功能,使用cckiller -b $IP拉黑,使用 cckiller -u $IP 解鎖。

2015-11-29 Ver 1.0.2:

新增線上更新功能,執行 ./install.sh -u 即可檢測是否有新版本:

如果發現有新版本則顯示更新內容,並提示是否執行更新。選擇之後將會更新到新版本,需要重新設定,但是IP或連接埠白名單會保持不變。

新增連接埠白名單功能

應網友需求,新增了這個連接埠白名單功能。在配置CCKiller的最後一項會提示輸入連接埠白名單:

如果需要排除某些連接埠,請如圖最後一行所示,輸入連接埠並已逗號分隔,比如 21,2121,8000

本次更新為非必須功能,在用的朋友可以按需更新,當然新增了線上更新這個功能,也強力推薦更新一下,方便後續檢測CCKiller是否是最新版本。

更新難免存在不可意料的紕漏,使用中存在任何問題請留言告知,謝謝!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.