秦春磊
摘 要:文章以一次被攻擊經(jīng)歷為例,詳細(xì)描述了如何發(fā)現(xiàn)CC攻擊和對CC攻擊進(jìn)行基本的防范。
關(guān)鍵詞:CC攻擊;防范;bash iptables
CC攻擊,全名是Challenge Collapsar攻擊,是DDOS(分布式拒絕服務(wù))的一種,是利用TCP/IP協(xié)議三次握手規(guī)則發(fā)起的針對服務(wù)器的攻擊。
1 背景介紹
近日,某web服務(wù)器出現(xiàn)了典型的被攻擊的癥狀:網(wǎng)絡(luò)和系統(tǒng)正常的情況下,打開網(wǎng)頁延遲很高;遠(yuǎn)程登錄服務(wù)器時(shí),建立連接等待時(shí)間長。
服務(wù)器是CentOS系統(tǒng),獨(dú)立IP接入互聯(lián)網(wǎng),因?yàn)槭菧y試機(jī),所以前端沒有防護(hù)設(shè)備。上面安裝了http服務(wù)。
2 攻擊類型確認(rèn)
面對攻擊,首先得確定攻擊類型,以對癥下藥。
首先查看資源使用情況。經(jīng)檢查,內(nèi)存、CPU使用率很低,顯然,資源使用率不是延遲高的原因;然后,修改http端口號,發(fā)現(xiàn)訪問速度恢復(fù)正常。輸入命令: ps -ef | grep apache | wc,結(jié)果顯示:277 2450 41582,原因找到!數(shù)字277意思是有277個(gè)apache進(jìn)程。而低并發(fā)網(wǎng)站,進(jìn)程數(shù)應(yīng)為10個(gè)左右。因此,初步斷定為DDOS攻擊??紤]到資源利用率低,猜測是CC攻擊。
為了驗(yàn)證猜測,輸入命令:netstat -ant | awk '/^tcp/ {c[$NF] ++} END { for(s in c) print s,c[s];}',顯示結(jié)果如下:
(略)
SYN_RECV 254
(略)
這里,SYN_RECV連接數(shù)為254個(gè)。我們知道,建立TCP/IP連接,有三次握手: 一是(SYN_SEND),C到S的syn包發(fā)送,等待S回復(fù);二是(SYN_RECV),S到C的syn/ack數(shù)據(jù)發(fā)送,等待C回復(fù);三是(ESTABLISHED),C確認(rèn)ACK給服務(wù)器,鏈接成功。
3 攻擊防范策略
CC攻擊非常常見,而且沒有“簡單而廉價(jià)的”處理方式。主要原因是無法簡單有效地判斷一個(gè)連接是否是CC攻擊。如果把ACK連接時(shí)間長的殺掉,有可能導(dǎo)致誤殺。通常做法是使用專業(yè)設(shè)備,由前置設(shè)備進(jìn)行判斷連接的有效性。
當(dāng)然,上述是商業(yè)化的解決方案,作為學(xué)習(xí)之用,應(yīng)對低強(qiáng)度CC攻擊,可考慮下面手段:
第一步:應(yīng)用層面上的防范,采用mod_evasive模塊。Mod_evasive是Apache通用的防DDOS攻擊的擴(kuò)展模塊。它不能防御DDOS,但可緩解服務(wù)器壓力。安裝過程可參考網(wǎng)上資料。
默認(rèn)配置下,模塊會在/tmp目錄下形成日志。如:來自1.2.3.4的CC攻擊有99次,就會生成一個(gè)名為1.2.3.4的文件,內(nèi)容是99。
第二步:防火墻層面的防范,可利用iptables命令配置,這個(gè)網(wǎng)上也有很多描述,就不再詳細(xì)描述。可參考第四步的命令。
第三步:系統(tǒng)層面關(guān)于SYN的設(shè)置,Linux內(nèi)核提供了若干SYN相關(guān)的配置,用命令: sysctl -a | grep syn 看到相關(guān)的參數(shù),修改這些參數(shù)即可。詳細(xì)參數(shù)介紹可以參考網(wǎng)上介紹。為了系統(tǒng)重啟動時(shí)保持上述配置,可將上述命令加入到/etc/rc.d/rc.local文件中。
第四步:使用bash命令,自動添加黑名單。
建立一個(gè)目錄,用于存放我們的bash文件和log文件。
首先:創(chuàng)建iptables.rule文件,添加以下內(nèi)容(精選部分):
Vim iptables.rule
#!/bin/bash
(省略部分前期配置)
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED -j ACCEPT
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
# Keep connect established
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
(省略部分)
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,F(xiàn)IN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
簡要說明:上述命令,實(shí)際上是設(shè)置了內(nèi)外網(wǎng)訪問不同的權(quán)限,對連接的鏈路也做了一定的規(guī)定。可以根據(jù)內(nèi)外網(wǎng)網(wǎng)卡名字的不同和ip地址的不同做適當(dāng)?shù)男薷?。這個(gè)文件,在后面是可以隨時(shí)進(jìn)行增加的,主要用于增加黑名單。
最后,在/usr/local/gateway中,創(chuàng)建black.sh文件,該文件的作用,就是分析/tmp目錄下的已經(jīng)確定是cc的ip地址,然后把該ip地址加入到黑名單中。
Vim black.sh
增加如下內(nèi)容:
#!/bin/bash
LOCAL="127.0.0.1"
W1="1.2.3.4" #允許訪問的公網(wǎng)ip地址。
now=`date +%Y-%m-%d.dos`
echo "#add $now" >> /root/gateway/iptables.rule
for i in `ls /tmp/dos* | awk -F- '{print $2}'`
do
if [ $i = $LOCAL ]
then
continue;
fi
if [ $i = $W1 ]
then
continue;
fi
m=$"iptables -I INPUT -s $i -j DROP"
echo $m >> /usr/local/gateway/log/$now
echo $m >> / usr/local/gateway/iptables.rule
done
rm -f /tmp/dos*
/bin/iptable.rule restart
保存退出。
完成了上述操作,我們可以把上述三個(gè)文件設(shè)置為可執(zhí)行,最后加入到crontab中設(shè)置為定時(shí)運(yùn)行:
Crontab -e
增加:
0 */4 * * * /bin/bash /usr/local/gateway/black.sh
至此,完成了全部的服務(wù)器設(shè)置。服務(wù)器在運(yùn)行一段時(shí)間后,在檢測SYN_RECV數(shù)據(jù),就可以看到數(shù)量明顯下降。
當(dāng)然,上述方法無法徹底解決CC攻擊,要徹底解決,還是要從系統(tǒng)構(gòu)架、資金保障等方面去考慮。