乐于分享
好东西不私藏

Nginx 自动封IP脚本源码及使用方法

Nginx 自动封IP脚本源码及使用方法

这是一个经典的“日志分析 + 自动拉黑” 极简方案:

1. 自动拉黑脚本 (blockip.sh)

建议直接用这 10 行左右的代码,在 Linux 环境下非常稳。

Bash                  

#!/bin/bash                  # Nginx 日志路径                  LOG_FILE="/usr/local/nginx/logs/access.log"                  # Nginx 黑名单配置文件路径                  BLOCK_FILE="/usr/local/nginx/conf/conf.d/blockip.conf"                  # 逻辑:提取日志最后 10000 行,统计 IP 出现次数,超过 200 次的直接揪出来# 然后判断该 IP 是否已经在黑名单里,不在的话就追加进去                  tail -n 10000 $LOG_FILE | awk '{print $1}' | sort | uniq -c | sort -nr | awk '$1 > 200 {print $2}' > /tmp/bad_ips.txt                  for ip in $(cat /tmp/bad_ips.txt); doif ! grep -q "$ip" $BLOCK_FILEthen                  echo "deny $ip;" >> $BLOCK_FILE# 记录一下啥时候封的,方便回查                  echo "屏蔽 IP: $ip 于 $(date)" >> /var/log/nginx/block_history.log                  RELOAD_FLAG=1                  fi                     done                  # 如果有新 IP 加入,重载一次 Nginx 使其生效                  if [ "$RELOAD_FLAG" == "1" ]; then                  /usr/local/nginx/sbin/nginx -s reload                  fi

2. 如何在 Nginx 中启用?

你需要在 nginx.conf 的 http 模块或者具体的 server 模块里引用这个黑名单文件:

Nginx

Bash                  http {                  # 引入黑名单文件                  include /usr/local/nginx/conf/conf.d/blockip.conf;                  ...                  }

3. 自动化:开启“上帝模式”

在视频结尾你可以演示这个:用 crontab 让它每分钟自己跑一次。

Bash

Bash                  # 输入 crontab -e 进入编辑# 每 1 分钟执行一次脚本                  * * * * * /bin/bash /your/path/blockip.sh

💡 给粉丝的“避坑”锦囊:

1关于白名单: 如果怕误杀,可以在脚本里加一行 grep -v “你的办公IP”,别把自己给封了,那可就成了直播事故了。

1关于阈值: 脚本里的 200 次(100000行日志中)可以根据业务压力调。如果是接口,设小点;如果是静态资源,设大点。

1封禁时长: 这个脚本是“永久封禁”。如果想做“封 10 分钟自动解封”,那得配合 ipset 或者更高级的 fail2ban。不过对短视频来说,这个 Shell 脚本的视觉冲击力和获得感已经爆表了!

逻辑就是‘抓取 –> 过滤 –>封禁’。

欢迎在评论区交流