Cloudflare自動拉黑惡意IP到防火牆和自動切換5秒盾腳本防CC攻擊
一個朋友將自己的企業站放在XXX主機上,流量不大,但由於使用的是經常受到CC攻擊,主要表現就是IO和CPU爆增,最後就是數據庫掛掉導致網站無法訪問。一開始啟用了Cloudflare,但是攻擊者瘋狂地掃描,防禦效果一般。
為了能夠精確地識別惡意IP,在啟用了Cloudflare CDN後需要在Nginx和Apache中啟用Real IP模塊,然後利用腳本分析網站日誌,從日誌中蒐集異常IP,然後使用Cloudflare API批量將惡意IP添加到Cloudflare的防火牆當中。
當然,當網站遭遇非常強大的CC和DDoS攻擊時,我們可以啟用Cloudflare經典的5秒盾防攻擊,如果把握不了攻擊的頻率的話,可以設置一個定時任務,當系統負載超過某一個值(一般來攻擊會導致系統負載爆增),調用Cloudflare API啟用5秒盾。
一、Cloudflare自動拉黑惡意IP
1.1 找出惡意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
1.2 批量添加IP到防火牆
使用以下代碼就可以將惡意IP批量添加到Cloudflare的防火牆了,記得替換為你的Cloudflare API。
- #!/bin/bash
- # Author: Zhys
- # Date : 2018
- # 填Cloudflare Email郵箱
- CFEMAIL= “freehao123@gmail.com”
- # 填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
1.3 自動找出惡意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= “freehao123@gmail.com”
- # 填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://down.cheshirex.com/shell/attack-ip.sh
chmod +x /qicmd/cfblockip.sh
./cfblockip.sh
wget https://down.cheshirex.com/shell/attack-ip.sh
chmod +x /qicmd/attack-ip.sh
./attack-ip.sh
wget https://down.cheshirex.com/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可以實現更加靈活的功能,對於普通的防禦足夠自己使用了。
Cloudflare防護也有一定的問題,那就是啟用了Cloudflare後獲取到用戶的IP都是Cloudflare CDN節點的IP,我們還需要在服務器配置中做進一步的優化。
文章轉載自:挖站否https://wzfou.com/cloudflare-cc/,部分內容參考自9sep 版權所有。