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