用nginx日誌+iptables防護CC攻擊

攻擊狀況

最近被cc攻擊,搞得mysql壓力很大,訪問速度很慢或者沒法訪問
看了一下nginx日誌,發現日誌裏面$http_user_agent這個變量中總有包含「Baiduspider」這個變量。
以下圖mysql

解決思路

1.找出全部包含「Baiduspider」的ip地址
2.用iptables禁用這些地址nginx

具體解決方法

安裝redisredis

aptitude install redis-server

跟蹤分析nginx日誌,把發起攻擊的ip地址存放到redis中

爲了擁有完整的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)}' &


這時候就能夠把iptables中的ip地址添加到iptables中禁用掉了

先把禁用命令輸出出來看一下命令行

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攻擊。

相關文章
相關標籤/搜索