这个脚本主要是通过启用 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

7、效果如下图所示。
cfblockip.png

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