高性能Web应用服务器Nginx功能之自动化封禁ip
简介
在日常业务场景中可能存在恶意用户频繁访问系统,占用系统资源,影响正常用户访问,我们有许多方案杜绝此类问题发生,例如增加验证码,应用内限制访问次数,网关ip封禁等等。本次介绍如何利用Nginx和shell脚本自动化封禁访问ip。
Nginx封禁ip或ip段
封禁ip/ip段语法
1 | deny 1.2.3.4; |
允许ip/ip段语法
1 | allow 1.2.3.4; |
新建/usr/local/nginx/conf/vhosts/blockip.conf,将封禁ip/ip段的语句放入到blockip.conf
根据放入的语句块实现封禁ip的范围:
include vhosts/blockip.conf放在server语句块,则单独封禁某个网站include vhosts/blockip.conf放在http语句块,则封禁所有网站
记得在nginx.conf导入blockip.conf:
shell脚本自动化封禁ip
awk
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。后面会详细介绍。
自动化封禁ip的思路:
1、统计访问日志的ip并去重排序
2、计算超过特定访问速率(每分钟60次)的ip
3、将ip记录在vhosts/blockip.conf并灰度发布
4、crontab定时运行脚本
1 | awk '{print $1}' /usr/local/nginx/logs/access.log |
1 | awk '{print $1}' /usr/local/nginx/logs/access.log | sort | uniq -cd |
1 | awk '{print $1}' /usr/local/nginx/logs/access.log | sort | uniq -cd | awk '{if($1>)print $0}' |
编写shell脚本
1 | 不能把别人IP一直封着吧,这里就清除掉了 |
crontab定时运行脚本
编辑/etc/crontab
1 | * * * * * root /usr/bin/sh /usr/local/nginx/shell/blockip.sh |
* * * * *表示每分钟运行一次
root表示运行用户
/usr/bin/sh表示运行程序
/usr/local/nginx/shell/blockip.sh表示运行脚本
效果
为了更快达到效果,博主将访问次数改为20次
如果想调整每分钟的访问次数,请修改shell脚本
如果想调整定时任务的间隔时间,请参考cron表达式,修改/etc/crontab
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 心流!
评论
TwikooValine










