最近被cc攻擊,搞得mysql壓力很大,訪問速度很慢或者沒法訪問
看了一下nginx日誌,發現日誌裏面$http_user_agent這個變量中總有包含「Baiduspider」這個變量。
以下圖mysql
1.找出全部包含「Baiduspider」的ip地址
2.用iptables禁用這些地址nginx
安裝redisredis
aptitude install redis-server
爲了擁有完整的IP地址列表,把全部的ip地址過濾出來,並存進redis中,腳本以下:sql
tail -f /mnt/log/nginx/tuan.ganghaoyouhuo.access.log|awk { if($15 ~ /Baidu/ || $17 ~ /Baidu/) system("redis-cli zincrby black 1 "$1)}
解釋一下上述腳本
首先,用tail命令跟蹤分析nginx日誌,
而後用管道命令,鏈接awk命令,
分析日誌的第15或17列,
若是能匹配到/Baidu/這個關鍵字,就調起redis命令redis-cli,
使用zincrby方法,給找到的ip地址(nginx日誌的第一列,因此是$1),記錄訪問記錄加1.瀏覽器
幾分鐘後查看一下redis中的結果ide
發起攻擊的IP地址已經被存到redis裏了。在redis中使用有序集合來存放ip地址,能夠避免重複增長ip地址,還能夠統計攻擊發起的次數。url
爲了偷懶不須要常常從新掃nginx日誌,這裏增長一個後臺運行程序,跟隨nginx日誌的增加來實時分析它,這樣能夠下降壓力。讓這個命令在後臺運行,不隨命令行窗口終結,須要使用nohup命令:spa
nohup tail -f /mnt/log/nginx/tuan.ganghaoyouhuo.access.log |awk '{ if($15 ~ /Baidu/ || $17 ~ /Baidu/) system("redis-cli zincrby black 1 "$1)}' &
先把禁用命令輸出出來看一下命令行
redis-cli zrevrange black 0 -1|awk '{print "iptables -I INPUT -s "$0" -j DROP"}'
命令解釋
用redis的zrevrange命令,把記錄的ip地址所有輸出出來
用管道命令鏈接awk命令,拼接添加禁用地址的命令語句
結果以下設計
修改一下命令,讓iptables命令直接運行
redis-cli zrevrange black 0 -1|grep ''|awk '{system( "iptables -I INPUT -s "$0" -j DROP")}'
查看運行結果
iptables -L -n
這樣,發起攻擊的ip地址已經所有被禁用了。
過必定的時間後,能夠重複執行上面的命令,刷新iptables中的禁用地址列表
這樣發起cc攻擊的ip地址就全被禁用掉了,再看一下nginx日誌,是否是變得舒緩了起來
CC攻擊一般有這樣的特徵
1.通常的CC攻擊,攻擊方都會定製瀏覽器類型,就是nginx收到的$http_user_agent變量。這是最容易獲取特徵的地方。
2.都集中攻擊某幾個url地址。
3.通常的CC攻擊並無海量的ip地址,能有幾萬個IP地址已經很了不得了。
因此能夠根據這樣的特徵來設計應對方案。按照$http_user_agent和被訪問的url地址來判斷是不是攻擊行爲,利用redis來計算訪問次數,再封禁異常的訪問IP,這樣能夠應對多數的cc攻擊。