天天看點

Cloudflare自動檢測惡意IP拉黑到防火牆和自動切換5秒盾防CC

作者:yuuid

Cloudflare很多朋友都在使用,如果你的網站伺服器架設在國外,那Cloudflare是一個非常好的加速工具,一可以為你的網站進行加速,二可以給你的網站提供防護

網站遭遇非常強大的CC和DDoS攻擊時,啟用Cloudflare經典的5秒盾防攻擊,設定一個定時任務,當系統負載超過某一個值,調用Cloudflare API啟用5秒盾。

一、Cloudflare自動拉黑惡意IP

利用腳本分析在一分鐘單個IP通路的頻率,超過一定的頻率(一般來正常的通路,一分鐘内應該不超過60次,你可以設定為更小),即認定為惡意IP。腳本如下:

#/bin/bash

#日志檔案,你需要改成你自己的路徑

logfile=/data/wwwlogs/

last_minutes=1

#開始時間1分鐘之前(這裡可以修改,如果要幾分鐘之内攻擊次數多少次,這裡可以自定義)

start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes'

echo $start_time

#結束時間現在

stop_time=`date +"%Y-%m-%d %H:%M:%S"`

echo $stop_time

cur_date="`date +%Y-%m-%d`"

echo $cur_date

#過濾出機關之間内的日志并統計最高ip數,請替換為你的日志路徑

tac $logfile/sky.ucblog.net_nginx.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,RSTART+14,21);if(t>=st && t<=et) {print $0}}' | awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/log_ip_top10

ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`

ip=`cat $logfile/log_ip_top10 | awk '{if($1>2)print $2}'`

# 機關時間[1分鐘]内單ip通路次數超過2次的ip記錄入black.txt,這裡wzfou.com為了測試設定了2,你需要改成其它的數字

for line in $ip

do

echo $line >> $logfile/black.txt

echo $line

# 這裡還可以執行CF的API來送出資料到CF防火牆

done           

批量添加IP到防火牆

使用以下代碼就可以将惡意IP批量添加到Cloudflare的防火牆了,記得替換為你的Cloudflare API。

#!/bin/bash

# Author: Zhys

# Date : 2018

# 填Cloudflare Email郵箱

CFEMAIL="[email protected]"

# 填Cloudflare API key

CFAPIKEY="xxxxxxxxxxxxxxxx"

# 填Cloudflare Zones ID 域名對應的ID

ZONESID="xxxxxxxxxxxxxxxxxxxx"

# /data/wwwlogs/black.txt存放惡意攻擊的IP清單

# IP一行一個。

IPADDR=$(</data/wwwlogs/black.txt)

# 循環送出 IPs 到 Cloudflare 防火牆黑名單

# 模式(mode)有 block, challenge, whitelist, js_challenge

for IPADDR in ${IPADDR[@]}; do

echo $IPADDR

curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" \

-H "X-Auth-Email: $CFEMAIL" \

-H "X-Auth-Key: $CFAPIKEY" \

-H "Content-Type: application/json" \

--data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'

done

# 删除 IPs 檔案收拾幹淨

rm -rf /data/wwwlogs/black.txt           

自動找出惡意IP并添加到防火牆

直接将上面兩個腳本合并到一個腳本即可。

#/bin/bash

#日志檔案,你需要改成你自己的路徑

logfile=/data/wwwlogs/

last_minutes=1

#開始時間1分鐘之前(這裡可以修改,如果要幾分鐘之内攻擊次數多少次,這裡可以自定義)

start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes'

echo $start_time

#結束時間現在

stop_time=`date +"%Y-%m-%d %H:%M:%S"`

echo $stop_time

cur_date="`date +%Y-%m-%d`"

echo $cur_date

#過濾出機關之間内的日志并統計最高ip數,請替換為你的日志路徑

tac $logfile/sky.ucblog.net_nginx.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,RSTART+14,21);if(t>=st && t<=et) {print $0}}' | awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/log_ip_top10

ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`

ip=`cat $logfile/log_ip_top10 | awk '{if($1>2)print $2}'`

# 機關時間[1分鐘]内單ip通路次數超過2次的ip記錄入black.log,這裡為了測試設定2,你需要改成其它的數字

for line in $ip

do

echo $line >> $logfile/black.txt

echo $line

# 這裡還可以執行CF的API來送出資料到CF防火牆

done

# 填Cloudflare Email郵箱

CFEMAIL="[email protected]"

# 填Cloudflare API key

CFAPIKEY="xxxxxxxxxxxxxxxxxxxxxxxx"

# 填Cloudflare Zones ID 域名對應的ID

ZONESID="xxxxxxxxxxxxxxxxxxxxxxxxxxx"

# /data/wwwlogs/black.txt存放惡意攻擊的IP清單

# IP一行一個。

IPADDR=$(</data/wwwlogs/black.txt)

# 循環送出 IPs 到 Cloudflare 防火牆黑名單

# 模式(mode)有 block, challenge, whitelist, js_challenge

for IPADDR in ${IPADDR[@]}; do

echo $IPADDR

curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" \

-H "X-Auth-Email: $CFEMAIL" \

-H "X-Auth-Key: $CFAPIKEY" \

-H "Content-Type: application/json" \

--data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'

done

# 删除 IPs 檔案收拾幹淨

rm -rf /data/wwwlogs/black.txt           

上面的腳本我已經放在我的下載下傳中心,可以提供給大家下載下傳使用,代碼如下:

wget https://do.wzfou.net/shell/attack-ip.sh

chmod +x /qicmd/cfblockip.sh

./cfblockip.sh

wget https://do.wzfou.net/shell/attack-ip.sh

chmod +x /qicmd/attack-ip.sh

./attack-ip.sh

wget https://do.wzfou.net/shell/cf-block-attack-ip.sh

chmod +x /qicmd/cf-block-attack-ip.sh

./cf-block-attack-ip.sh           

最後,設定一個定時任務,讓腳本每過一分鐘檢測一次(請根據需要來調整,關于定時任務的使用參考:Linux Crontab指令定時任務基本文法)

* * * * * /bin/bash /root/cf-block-attack-ip.sh > /tmp/ou1t.log 2>&1           

自動添加惡意IP到CloudFlare防火牆的效果如下:

Cloudflare自動切換5秒盾腳本

網站:

https://github.com/Machou/Cloudflare-Block           

當你的伺服器受到攻擊時,系統負載就會爆增,利用腳本自動檢測系統負載,當壓力超過一定的值時就可以切換為” I’m Under Attack! “模式了。操作步驟如下:

#下載下傳

cd /root && git clone https://github.com/Machou/Cloudflare-Block.git DDoS

#打開Cloudflare.sh,修改配置

API_KEY You're Global API Key (https://dash.cloudflare.com/profile)

MAIL_ACCOUNT Email of your Cloudflare account

DOMAIN Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)

#設定定時任務

crontab -e

*/1 * * * * /root/DDoS/Cloudflare.sh 0 # check every 1 minute if protection is not enabled

*/20 * * * * /root/DDoS/Cloudflare.sh 1 # check every 20 minutes if protection is enabled           

腳本預設的是檢測系統負載為10,啟動” I’m Under Attack! “模式,你以根據需要來調整。

完整的腳本代碼如下:

#!/bin/bash

# $1 = 1min, $2 = 5min, $3 = 15min

loadavg=$(cat /proc/loadavg|awk '{printf "%f", $1}')

# load is 10, you can modify this if you want load more than 10

maxload=10

# Configuration API Cloudflare

# You're Global API Key (https://dash.cloudflare.com/profile)

api_key=

# Email of your account Cloudflare

email=

# Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)

zone_id=

# create file attacking if doesn't exist

if [ ! -e $attacking ]; then

echo 0 > $attacking

fi

attacking=./attacking

hasattack=$(cat $attacking)

if [ $(echo "$loadavg > $maxload"|bc) -eq 1 ]; then

if [[ $hasattack = 0 && $1 = 0 ]]; then

# Active protection

echo 1 > $attacking

curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \

-H "X-Auth-Email: $email" \

-H "X-Auth-Key: $api_key" \

-H "Content-Type: application/json" \

--data '{"value":"under_attack"}'

fi

else

if [[ $hasattack = 1 && $1 = 1 ]]; then

# Disable Protection

echo 0 > $attacking

curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \

-H "X-Auth-Email: $email" \

-H "X-Auth-Key: $api_key" \

-H "Content-Type: application/json" \

--data '{"value":"high"}'

fi

fi

exit 0           

總結

Cloudflare是一個非常好用的防禦DDos和CC攻擊的工具,免費版本的Cloudflare結合API可以實作更加靈活的功能,對于普通的防禦足夠自己使用了。

繼續閱讀