#教程# Cloudflare 自动脚本提交攻击(恶意)IP到防火墙[修改版]

前言

昨天在网上找Cloudflare自动脚本提交攻击(恶意)IP 到防火墙的脚本,发现都是有瑕疵的,都是统计整个日志时间段的 IP,不能在设定的统计时间段内准确列出恶意 IP,现修改了下脚本发出来分享给大家。 此脚本利用脚本分析网站日志,从日志中搜集异常 IP,然后使用Cloudflare API 批量将恶意 IP 添加到 Cloudflare 的防火墙当中。

图片[1] - #教程# Cloudflare 自动脚本提交攻击(恶意)IP到防火墙[修改版] - 云线路

使用说明

按天切割日志

需要配合 Nginx 使用 CDN(CloudFlare)获取网站日志真实 IP 地址使用;

原版脚本

下面是 wafou 的原版代码

#/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

改版脚本

下面是博主修改后的代码

#/bin/bash
# 日志文件,你需要改成你自己的路径
logfile=/home/wwwlogs/
last_minutes=1 
# 开始时间 1 分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义)
start_time=`date -d"$last_minutes minutes ago" +"%H:%M:%S"`
echo $start_time
# 结束时间(现在)
stop_time=`date +"%H:%M:%S"`
echo $stop_time
# 过滤出单位之间内的日志并统计最高 ip 数,替换为你的日志路径
tac $logfile/xxx.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>70)print $2}'`
# 单位时间[1 分钟]内单 ip 访问次数超过 70 次的 ip 记录入 black.txt
for line in $ip
do
echo $line >> $logfile/black.txt
echo $line
done
# 这里还可以执行 CF 的 API 来提交数据到 CF 防火墙
# 填 Cloudflare Email 邮箱
CFEMAIL="xxx@gmail.com"
# 填 Cloudflare API key
CFAPIKEY="xxxxxxxxxxxxxxxxxxxxxxxx"
# 填 Cloudflare Zones ID 域名对应的 ID
ZONESID="xxxxxxxxxxxxxxxxxxxxxxxxxx"
# /home/wwwlogs/black.txt 存放恶意攻击的 IP 列表
# IP 一行一个。
IPADDR=$(</home/wwwlogs/black.txt)
# 循环提交 black.txt 到 Cloudflare  防火墙黑名单
# 模式(mode)有 block(屏蔽), challenge(验证码), whitelist(白名单), js_challenge(js 人机验证,俗称:5 秒盾)
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
# 删除 black.txt 文件收拾干净
rm -rf /home/wwwlogs/black.txt

下载脚本

wget https://dl.yunloc.com/Shell/cf-block-attack-ip.sh && chmod +x cf-block-attack-ip.sh

需要设置一个定时任务,让脚本每钟检测一次

* * * * * /bin/bash /root/cf-block-attack-ip.sh >> /home/wwwlogs/oult.log

结语

部分内容参考自wzfou版权所有。本站文章可自由引用,但请注明来源。

© 本站文章随意转载,但请注明出处!
THE END
点赞2.9W+ 分享
评论 共9条
头像
务必使用真实的邮箱地址评论,虚假邮箱的评论将不通过审核及无回复。
提交
头像

昵称

取消
昵称表情代码图片
    • 头像110
    • 头像110
    • 头像110
    • 头像110
    • 头像Davis0
        • 头像hehe0