这个脚本主要是通过启用 Nginx 或者 Caddy 中的 Real IP 模块,利用脚本分析网站日志找出异常IP,然后使用 Cloudflare API 批量将恶意 IP 添加到 Cloudflare 的防火墙当中。测试是有效果的,但实际用处有多大就不清楚了。部分代码来自网络,但网络上的基本有问题,博主是自己改过和测试确认可用的。(小博客,应该没有大佬看的上的。OωO)
1、启用 Real IP 模块,这里以 Caddy 为例。开启方法可以参考:Caddy 使用 CDN 后在日志中显示访客真实IP
2、启用后修改配置文件(一般是“/etc/caddy/Caddyfile”),确保加入了 {when_unix} 这个参数。(realip 部分是显示访客的真实 IP)
aaa.com {
root /var/www/typecho
log / /var/log/caddy/aaa_com.log "{remote} - {user} [{when}] {when_unix} \"{method} {uri} {proto}\" {status} {size} \"{>Referer}\" \"{>User-Agent}\""
tls mail@gmail.com
gzip
header / Strict-Transport-Security "max-age=31536000"
fastcgi / /run/php/php7.1-fpm.sock php
rewrite {
if {path} not_match ^\/admin
to {path} {path}/ /index.php?{query}
}
realip {
from 0.0.0.0/0
}
}
3、重新启动 Caddy
systemctl restart caddy
4、访问网站,然后在log文件中可以看到如下所示的日志
119.135.205.161 - - [15/Jun/2019:01:00:33 -0400] 1560574833 "GET /usr/themes/handsome/usr/img/sj/2.jpg HTTP/1.1" 304 0 "https://www.moeelf.com/archives/4.html" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
119.135.205.161 - - [15/Jun/2019:01:00:34 -0400] 1560574834 "GET /favicon.ico HTTP/1.1" 304 0 "https://www.moeelf.com/archives/4.html" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
5、利用脚本分析一分钟内单个 IP 访问的频率,超过一定的频率(正常来说一分钟内应该不超过 60 次,可以根据自己的情况进行设置),即认定为恶意IP。脚本如下:
#/bin/bash
#日志文件,你需要改成你自己的路径
logfile=/var/log/caddy/
#结束时间现在
end_time=`date +%s`
#echo $end_time
#开始时间1分钟之前
start_time=$(( end_time - 60 ))
#echo $start_time
#过滤并统计日志中单位时间之内的最高ip数。请把$logfile/moeelf_com.log替换为你的日志路径。
tac $logfile/moeelf_com.log | awk -v st="$start_time" -v et="$end_time" '{if(($6 > st || $6 == st) && ($6 < et || $6 == et)) {print $1}}' | sort | uniq -c | sort -nr > $logfile/log_ip_top
ip_top=`cat $logfile/log_ip_top | head -1 | awk '{print $1}'`
#单位时间[1分钟]内相同ip访问次数超过 n 次自动加入到 Cloudflare 防火墙. (这里 5 次是做测试用的。)
ip=`cat $logfile/log_ip_top | awk '{if($1>5) print $2}'`
# 填 Cloudflare 帐号的 Email 邮箱
CFEmail="123@gmail.com"
# 填 Cloudflare 帐号的 Global API Key
GlobalAPIKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# 填 Cloudflare 域名对应的 Zone ID
ZoneID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
for IPAddr in $ip; do
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZoneID/firewall/access_rules/rules" \
-H "X-Auth-Email: $CFEmail" \
-H "X-Auth-Key: $GlobalAPIKey" \
-H "Content-Type: application/json" \
--data '{"mode":"block","configuration":{"target":"ip","value":"'$IPAddr'"},"notes":"CC/DDOS Attatch"}'
done
6、设置一个定时任务,下面是每分钟检查一次。(可以根据需要更改)
* * * * * /bin/bash /root/cf-block-ip.sh > /tmp/cfblockip.log 2>&1
8、最后附上下载地址:[button color=”info” icon=”glyphicon glyphicon-download-alt”]点击下载[/button];同时也可以使用下面命令直接下载:
wget https://www.moeelf.com/shell/cf-block-ip.sh
chmod +x cf-block-ip.sh
. cf-block-ip.sh
现在好像过滤失效了,前面还是有一段时间
Copied from wzfou?
@starwish 类似的文章网上很多吧,最开始谁写的我不知道。部分代码有直接用网上的,但基本有问题,我是自己改和测试的。(为了避免可能出现的问题,我加上部分代码来自网络。)
@萌精灵 https://wzfou.com/cloudflare-cc/
相似度挺高
@starwish 我上面已经回了,部分代码来自网络。网络上有很多类似的文章且基本一样,我的是我自己改过且测试过的。如果说是直接复制的,我肯定会加上转载的。(计算时间的方式都不一样好吧。)