网站软防指南:自动拉黑恶意IP到Cloudflare防火墙

这个脚本主要是通过启用 Nginx 或者 Caddy 中的 Real IP 模块,利用脚本分析网站日志找出异常IP,然后使用 Cloudflare API 批量将恶意 IP 添加到 Cloudflare 的防火墙当中。

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

7、效果如下图所示

8、最后附上下载地址:点击下载

同时也可以使用下面命令直接下载:

wget https://www.moeelf.com/shell/cf-block-ip.sh
chmod +x cf-block-ip.sh
. cf-block-ip.sh

Leave a Reply