Nginx 防御CC攻擊的兩種方法

CC攻擊可以歸為DDoS攻擊的一種。他們之間都原理都是一樣的,即發(fā)送大量的請求數(shù)據(jù)

來導(dǎo)致服務(wù)器拒絕服務(wù),是一種連接攻擊。CC攻擊又可分為代理CC攻擊,和肉雞CC攻擊。代理CC攻擊是黑客借助代理服務(wù)器生成指向受害主機的合法網(wǎng)頁請

求,實現(xiàn)DOS,和偽裝就叫:cc(ChallengeCollapsar)。而肉雞CC攻擊是黑客使用CC攻擊軟件,控制大量肉雞,發(fā)動攻擊,相比來后

者比前者更難防御。因為肉雞可以模擬正常用戶訪問網(wǎng)站的請求。偽造成合法數(shù)據(jù)包。防御CC攻擊可以通過多種方法,禁止網(wǎng)站代理訪問,盡量將網(wǎng)站做成靜態(tài)頁

面,限制連接數(shù)量等。

Nginx是一款輕量級的Web服務(wù)器,由俄羅斯的程序設(shè)計師Igor Sysoev所開發(fā),最初供俄國大型的入口網(wǎng)站及搜尋引Rambler使用。 其特點是占有內(nèi)存少,并發(fā)能力強,事實上Nginx的并發(fā)能力確實在同類型的網(wǎng)站服務(wù)器中表現(xiàn)較好。

Nginx雖然可以比Apache處理更大的連接數(shù),但是HTTP GET FLOOD針對的不僅僅是WEB服務(wù)器,還有數(shù)據(jù)庫服務(wù)器。大量HTTP請求產(chǎn)生了大量的數(shù)據(jù)庫查詢,可以在幾秒之內(nèi)使數(shù)據(jù)庫停止響應(yīng),系統(tǒng)負(fù)載升高,最終導(dǎo)致服務(wù)器當(dāng)機。

本文主要介紹CentOS+Nginx下如何快速有效得防御CC攻擊。至于如何安裝Nginx就不詳細(xì)介紹了,有興趣的讀者可以在Nginx官方網(wǎng)站(http://www.nginx.org/)下載源代碼進行編譯。如果你使用的是Centos5,也可以使用rpm包進行安裝(http://centos.alt.ru/repository/centos/5/i386/nginx-stable-0.7.65-1.el5.i386.rpm)。

主動抑制方法

為了讓Nginx支持更多的并發(fā)連接數(shù),根據(jù)實際情況對工作線程數(shù)和每個工作線程支持的

最大連接數(shù)進行調(diào)整。例如設(shè)置“worker_processes 10”和“worker_connections

1024”,那這臺服務(wù)器支持的最大連接數(shù)就是10×1024=10240。

worker_processes 10;

events {

use epoll;

worker_connections 10240;

}

Nginx 0.7開始提供了2個限制用戶連接的模塊:NginxHttpLimitZoneModule和NginxHttpLimitReqModule。NginxHttpLimitZoneModule可以根據(jù)條件進行并發(fā)連接數(shù)控制。

例如可以定義以下代碼:

http {

limit_zone?? my_zone? $binary_remote_addr? 10m;

server {

location?/somedir/?{

limit_conn?? my_zone? 1;

}

}

}

其中“l(fā)imit_zone my_zone $binary_remote_addr 10m”的意思是定義一個名稱為my_zone的存儲區(qū)域、my_zone中的內(nèi)容為遠(yuǎn)程IP地址、my_zone的大小為10M;“l(fā)ocation /somedir/”的意思是針對somedir目錄應(yīng)用規(guī)則;“l(fā)imit_conn my_zone 1”的意思是針對上面定義的my_zone記錄區(qū)記錄的IP地址在指定的目錄中只能建立一個連接。

NginxHttpLimitReqModule可以根據(jù)條件進行請求頻率的控制。例如可以定義以下代碼:

http {

limit_req_zone? $binary_remote_addr? zone=my_req_zone:10m?? rate=1r/s;

...

server {

...

location?/somedir/?{

limit_req_zone?? zone= my_req_zone? burst=2;

}

Discuz!是使用比較多的一個php論壇程序。以Discuz!7.0為例,程序目

錄下有比較多的可以直接訪問的php文件,但其中最容易受到攻擊的一般有index.php(首頁)、forumdisplay.php(板塊顯示)、

viewthread.php(帖子顯示)。攻擊者一般會對這些頁面發(fā)起大量的請求,導(dǎo)致HTTP服務(wù)器連接數(shù)耗盡、mysql數(shù)據(jù)庫停止響應(yīng),最終導(dǎo)致

服務(wù)器崩潰。為了防止上述頁面被攻擊,我們可以設(shè)定以下的規(guī)則進行防御:

http {

limit_zone?? myzone_bbs? $binary_remote_addr? 10m;

limit_req_zone $binary_remote_addr zone=bbs:10m rate=1r/s;

...

server {

...

location ~ ^/bbs/(index|forumdisplay|viewthread).php$ {

limit_conn?? myzone_bbs? 3;

limit_req zone=bbs burst=2 nodelay;

root?? html;

fastcgi_pass?? unix:/dev/shm/php-cgi.sock;

fastcgi_index? index.php;

fastcgi_param? SCRIPT_FILENAME??/usr/share/nginx/html$fastcgi_script_name;

includefastcgi_params;

}

}

}

應(yīng)用這條規(guī)則后,bbs目錄下的index.php、forumdisplay.php和viewthread.php這些頁面同一個IP只許建立3個連接,并且每秒只能有1個請求(突發(fā)請求可以達(dá)到2個)。雖然這樣的規(guī)則一般來說對正常的用戶不會產(chǎn)生影響(極少有人在1秒內(nèi)打開3個頁面),但是為了防止影響那些手快的用戶訪問,可以在nginx中自定義503頁面,503頁面對用戶進行提示,然后自動刷新。在Nginx中自定義503頁面:

error_page ? 503 ? /errpage/503.html;

503頁面的源代碼:

<?head>

<?title>頁面即將載入....

<?meta?http-equiv=content-type c>

<?META?NAME="ROBOTS"?C>

< /head>

<?body?bgcolor="#FFFFFF">

<?table?cellpadding="0"?cellspacing="0"?border="0"?width="700"?align="center"height="85%">

Verdana, Tahoma; color: #666666; font-size: 11px">

頁面即將載入

你刷新頁面的速度過快。請少安毋躁,頁面即將載入...

[<

fontcolor=#666666>立即重新載入]

< /table>

< /body>

< /html>

<?SCRIPT?language=javascript>

function update()

{

window.location.reload();

}

setTimeout("update()",2000);

< /script>

被動防御方法

雖然主動防御已經(jīng)抵擋了大多數(shù)HTTP GET FLOOD攻擊,但是道高一尺魔高一丈,攻擊者會總會找到你薄弱的環(huán)節(jié)進行攻擊。所以我們在這里也要介紹一下被動防御的一些方法。

封IP地址

訪問者通過瀏覽器正常訪問網(wǎng)站,與服務(wù)器建立的連接一般不會超過20個,我們可以通過腳本禁止連接數(shù)過大的IP訪問。以下腳本通過netstat命令列舉所有連接,將連接數(shù)最高的一個IP如果連接數(shù)超過150,則通過 iptables阻止訪問:

#!/bin/sh

status=`netstat?-na|awk?'$5 ~ /[0-9]+:[0-9]+/ {print $5}'?|awk?-F?":"?--'{print $1}'?|sort?-n|uniq?-c |sort?-n|tail?-n 1`

NUM=`echo?$status|awk?'{print $1}'`

IP=`echo?$status|awk?'{print $2}'`

result=`echo?"$NUM > 150"?|?bc`

if?[ $result = 1 ]

then

echo?IP:$IP is over $NUM, BAN IT!

/sbin/iptables?-I INPUT -s $IP -j DROP

fi

運行crontab -e,將上述腳本添加到crontab每分鐘自動運行:

* * * * * /root/xxxx.sh

通過apache自帶的ab工具進行服務(wù)器壓力測試:

# ab -n 1000 -c 100 http://www.xxx.com/bbs/index.php

測試完成后,我們就可以看到系統(tǒng)中有IP被封的提示:

#tail /var/spool/mail/root

Content-Type: text/plain; charset=ANSI_X3.4-1968

Auto-Submitted: auto-generated

X-Cron-Env:

X-Cron-Env:

X-Cron-Env: <;PATH=/usr/bin:/bin>

X-Cron-Env:

X-Cron-Env:

IP:58.246.xx.xx is over 1047, BAN IT!

至此,又一次HTTP GET FLOOD防御成功。

根據(jù)特征碼屏蔽請求(對CC攻擊效果較好)

一般同一種CC攻擊工具發(fā)起的攻擊請求包總是相同的,而且和正常請求有所差異。當(dāng)服務(wù)器遭遇CC攻擊時,我們可以快速查看日志,分析其請求的特征,比如User-agent。下面的是某一次CC攻擊時的User-agent,Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate幾乎沒有正常的瀏覽器會在User-agent中帶上“must-revalidate”這樣的關(guān)鍵字。所以我們可以以這個為特征進行過濾,將User-agent中帶有“must-revalidate”的請求全部拒絕訪問:

if?($http_user_agent ~ must-revalidate) {

return?403;

}

本文主要介紹了nginx下的HTTP GET FLOOD防御,如果有不對的地方,希望大家可以向我提出。同時,也希望大家能夠舉一反三,把這種思路應(yīng)用到apache、lighttpd等常見的web服務(wù)器中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容