佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > CCKiller:Linux輕量級CC攻擊防御工具,秒級檢查、自動拉黑和釋放

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

熱門標簽:地方門戶網(wǎng)站 網(wǎng)站排名優(yōu)化 百度競價排名 AI電銷 Linux服務器 呼叫中心市場需求 鐵路電話系統(tǒng) 服務外包

張戈博客很久以前分享過一個CC攻擊的防御腳本,寫得不怎么樣,不過被51CTO意外轉載了。博客從此走上了經(jīng)常被人拿來練手的不歸之路。

當然,還是有不少朋友在生產(chǎn)環(huán)境使用,并且會留言詢問相關問題。根據(jù)這些問題的需求,我花了一些時間重新寫了一個比較滿意的輕量級CC攻擊防御腳本,我給它取了一個比較形象的名字:CCKiller,譯為CC終結者。

一、功能申明

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

對于個人低配服務器,除了使用CDN來防護,至少我是沒有想到如何抵擋海量IP攻擊的!因為每個IP都用正常的UA來請求,而且每個IP的低并發(fā)請求和正常用戶請求一樣,并不會觸發(fā)防御閾值,同時來1000個,甚至上萬個,個人低配服務器的帶寬在第一時間就會被占滿,無法繼續(xù)提供服務!

所以,如果你的網(wǎng)站正受到海量IP的低并發(fā)DDoS攻擊,那么本文分享的CCKiller就無能為力了。趕緊去開啟CDN來拓展帶寬吧!

二、功能介紹

通過以上申明,也就大致給CCKiller一個定位:CCKiller是用于個人低配服務器的輕量級CC攻擊防御,可以抵擋單個IP產(chǎn)生的高并發(fā)攻擊。

目前設計的功能特性如下:
①、秒級檢查
很多人寫的防御腳本都是使用了Linux系統(tǒng)的計劃任務crontab來定時檢查的。而crontab的最細顆粒是1分鐘,也就是說腳本最快也只能1分鐘檢查一次。對于一些強迫癥來說就會很不爽。

所以,我還是按照以前分享的思路,利用while循環(huán)實現(xiàn)秒級檢查,實現(xiàn)更細的顆粒。當然,CCKiller更是被我寫成了系統(tǒng)服務,更加靈活穩(wěn)定。
②、拉黑時長
CCKiller可以設置拉黑時長,默認為10分鐘。當發(fā)現(xiàn)有惡意請求時,會自動拉黑目標IP,并在拉黑時長結束后自動釋放,這個功能算是對我之前寫的腳本的一個大的改進。
③、并發(fā)閾值
CCKiller 可以設定單個IP的最高請求數(shù),如果某個IP同時請求數(shù)超過了設定的閾值,就會被暫時拉黑一段時間。
④、郵件發(fā)送
這個功能沒啥好說的,意義并不大。而且發(fā)送成功率和服務器的環(huán)境也有很大關系。
⑤、并發(fā)顯示
安裝后,直接運行cckiller會列出當前系統(tǒng)的請求排行,可以清晰的看到當前請求IP和并發(fā)數(shù)。使用-s參數(shù)還可以繼續(xù)定制需求,比如 cckiller -s 10 就能顯示當前并發(fā)數(shù)排行前10名的IP。
⑥、手動拉黑
支持手動拉黑,執(zhí)行后會立即檢查,將并發(fā)請求超過n的IP拉黑一段時間,比如 cckiller -k 100 就會將目前超過100個請求的IP拉黑一段時間,如果沒有則不會執(zhí)行任何拉黑操作。

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

由于我可能經(jīng)常會更新一些功能,或修復一些BUG,所以僅提供在線安裝,以保證腳本是最新的。

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

復制代碼 代碼如下:

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

②、工具配置

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

執(zhí)行上述安裝命令后,將會進入自選配置部分,如圖:

提示否使用腳本默認配置,如果選擇是(y),那么顯示默認配置,并詢問是否繼續(xù):

默認配置如下:

復制代碼 代碼如下:

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

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

如果不使用默認配置(n),則會要你輸入?yún)?shù)來自定義配置:

如圖,我將參數(shù)依次定義為每10秒進行檢查,拉黑時長為300秒,發(fā)件人設置為博客郵箱,并發(fā)限制設置為60,回車后會彈出一個提示,讓你檢查,如果沒問題你直接回車就會安裝并啟動:

③、服務控制

安裝后,會將cckiller注冊成系統(tǒng)服務,這時你就可以使用service來控制cckiller了。
使用標準的service定義,支持 start | stop | restart | status 四個參數(shù)。所以,你可以使用
service cckiller stop來停止cckiller,也可以使用service cckiller status來查看狀態(tài)。

 ④、集成命令

成功安裝后,系統(tǒng)還會多出一個cckiller的命令,這個命令現(xiàn)有功能如下:
cckiller -h可以調(diào)出幫助信息:

復制代碼 代碼如下:

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 是拉黑功能,需要在后面帶上你想拉黑的并發(fā)數(shù),比如 cckiller -k 100 就會拉黑當前請求數(shù)大于100的IP一段時間(和拉黑時長一致)

-s 是顯示并發(fā)排名,也需要在后面帶上數(shù)字,比如 cckiller -s 10 就能顯示當前并發(fā)數(shù)排行前10名的IP。
⑤、文件結構
如上圖所示,腳本安裝目錄為/usr/local/cckiller,其結構如下:

cckiller/
├── cckiller       #主程序
├── log/           #日志目錄(ver 1.0.1新增特性)
├── ck.conf        #配置文件
├── ignore.ip.list #白名單
└── install.sh     #安裝和卸載腳本
 
0 directories, 5 files

很簡單也比較規(guī)范的的結構,當然,后續(xù)功能如果越來越多,此結構可能會有所更新,這是后話。

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

復制代碼 代碼如下:

##### 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設定并發(fā)限制
NO_OF_CONNECTIONS=60
##### EMAIL_TO設定郵件的發(fā)送對象
EMAIL_TO="ge@zhangge.net"
##### BAN_PERIOD設定拉黑時長,單位為秒
BAN_PERIOD=300

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

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

復制代碼 代碼如下:


#直接執(zhí)行./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 參數(shù)用來升級工具,不過目前由于沒時間還沒寫,所以不可用(Ver 1.0.2已支持在線更新)

-i 參數(shù)用來安裝工具,如果已安裝則會提示并終止

-c 參數(shù)用來配置工具,方便安裝后隨時修改工具配置

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

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

四、攻防測試

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

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

五、更多說明①、配置并發(fā)限制
CCKiller配置最大連接數(shù)限制時,建議根據(jù)單個網(wǎng)頁產(chǎn)生的并發(fā)數(shù)來判斷。

情況A: 你網(wǎng)站做了動靜分離,那么靜態(tài)的請求就到另一個域名了(假設靜態(tài)資源托管在另一臺服務器或是CDN),單個IP請求一個頁面可能就只會產(chǎn)生若干并發(fā)(假設5個),我們假設某個用戶很猛,他喜歡快速拖拽打開你網(wǎng)站的多個網(wǎng)頁,比如同時打開10個,那么正常用戶的正常最大并發(fā)你也可以基本確定了吧?即并發(fā)限制:10x5=50。如果有人同時刷新你幾十個頁面,要說沒惡意你也不相信吧?

情況B: 如果沒有做動靜分離,那么一個頁面產(chǎn)生的并發(fā)可能就比較多了,每個css、js、圖片都會產(chǎn)生一次請求。所以,在這種情況下就需要稍微計算一下你網(wǎng)站單個頁面產(chǎn)生的并發(fā)請求,比如一個單頁面會產(chǎn)生30個請求,那么你也需要考慮用戶可能會連續(xù)拖拽多個頁面的情況,假設我允許用戶可以同時刷新10頁面,那么并發(fā)限制就可以設置為300了,依此類推。

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

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

功能計劃:

A. 在線升級功能

這個不用多說,現(xiàn)有的工具已經(jīng)預留了,后面可能會加入版本判斷和更新的功能。

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

目前工具其實是趕鴨子上架一樣,直接就檢查,也沒有對系統(tǒng)環(huán)境做一些初始化的設置。比如網(wǎng)站通用的iptables設置、sync洪水攻擊防御等。后續(xù)會在安裝的時候會作為一個可選功能。

C. 集成傻瓜式的防火墻控制功能

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

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

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

2015-09-23 Ver 1.0.1:

支持白名單為IP段新增拉黑改為判斷 iptables 是否已存在操作IP的判斷方式;增加日志記錄功能,每天一個日志文件,位于安裝目錄下的log文件內(nèi);集成手動拉黑IP和解封IP功能,使用cckiller -b $IP拉黑,使用 cckiller -u $IP 解封。

2015-11-29 Ver 1.0.2:

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

如果發(fā)現(xiàn)有新版本則顯示更新內(nèi)容,并提示是否執(zhí)行更新。選擇之后將會更新到新版本,需要重新配置,但是IP或端口白名單會保持不變。

新增端口白名單功能

應網(wǎng)友需求,新增了這個端口白名單功能。在配置CCKiller的最后一項會提示輸入端口白名單:

如果需要排除某些端口,請如圖最后一行所示,輸入端口并已逗號分隔,比如 21,2121,8000

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

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

您可能感興趣的文章:
  • Linux如何處理文件已刪除但空間不釋放的問題
  • 手動釋放Linux服務器內(nèi)存(具體操作步驟)
  • Linux強制釋放占用端口以及Linux防火墻端口開放方法詳解
  • linux 內(nèi)存清理/釋放命令總結
  • Linux 內(nèi)存釋放命令詳解
  • 詳解Linux手動釋放緩存的方法
  • Linux文件刪除后空間未釋放問題詳解

標簽:湖南 湘潭 崇左 黃山 仙桃 衡水 銅川 蘭州

巨人網(wǎng)絡通訊聲明:本文標題《CCKiller:Linux輕量級CC攻擊防御工具,秒級檢查、自動拉黑和釋放》,本文關鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    社旗县| 梨树县| 宜宾县| 家居| 准格尔旗| 平阴县| 鞍山市| 景谷| 垫江县| 阿拉尔市| 探索| 富民县| 新余市| 凌海市| 白沙| 左权县| 桂东县| 镇原县| 成安县| 柏乡县| 景东| 车致| 西丰县| 如皋市| 铁力市| 博兴县| 津市市| 桂阳县| 华安县| 应用必备| 高雄市| 宜春市| 隆化县| 都江堰市| 来凤县| 合水县| 林州市| 寻甸| 隆化县| 嘉定区| 沂南县|