Nginx+Fail2ban 实现同一ip在一分钟内连续三次请求同一接口并响应成功时进行封禁
1. 安装 Fail2Ban 和 Nginx
如果尚未安装 Fail2Ban 和 Nginx,可以使用以下命令进行安装:
# CentOS默认的仓库中可能不包含Nginx,所以需要添加EPEL(Extra Packages for Enterprise Linux)仓库。
sudo yum install epel-release、
# 安装 Fail2Ban 和 Nginx
sudo yum install fail2ban nginx
2. 确认 Nginx 日志文件位置
确保 Nginx 正在生成访问日志和错误日志,默认情况下,这些日志位于 /var/log/nginx/access.log 和 /var/log/nginx/error.log。
3. 配置 Fail2Ban 监控 Nginx 日志
3.1 创建 Nginx 过滤器(filter)
创建一个新的过滤器文件以检测恶意行为,例如:/etc/fail2ban/filter.d/nginx-ql-reg-sms.conf
sudo nano /etc/fail2ban/filter.d/nginx-ql-reg-sms.conf
nginx-ql-reg-sms.conf内容如下
[Definition]
failregex = ^<HOST> - - .* "GET /api/platform/staff/register/.* HTTP/.*" 200
ignoreregex =
3.2 创建触发过滤器的处理方式(action)
sudo nano /etc/fail2ban/filter.d/nginx-ql-reg-sms-block.conf
nginx-ql-reg-sms-block.conf内容如下:主要是定义了封禁和解禁的动作,封禁时往blockedips.conf中追加一个ip,解禁时移除blockedips.conf中对应的ip
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = echo "deny <ip>;" >> /etc/nginx/blockedips.conf && nginx -s reload
actionunban = sed -i "/deny <ip>;/d" /etc/nginx/blockedips.conf && nginx -s reload
Nginx中的 deny 命令
deny 命令用于拒绝特定的IP地址或IP范围访问某些资源。在Nginx中,deny 指令通常配合 allow 指令使用,以控制对特定资源的访问权限。
使用 deny 命令的场景
封禁特定IP地址:
拒绝某些恶意IP地址的访问。
控制访问权限:
限制内部资源只允许特定IP访问,其他IP一律拒绝。
基本语法
# <address> 可以是单个IP地址、CIDR格式的IP地址范围,或者all(表示拒绝所有访问)。
deny <address>;
# 拒绝单个IP地址访问
location / {
deny 192.168.1.1;
allow all;
}
# 拒绝IP地址范围访问
location / {
deny 192.168.1.0/24;
allow all;
}
# 只允许特定IP地址访问,其他全部拒绝
location /admin {
allow 192.168.1.100;
deny all;
}
3.3使用自定义的过滤器和处理方式
编辑/etc/fail2ban/jail.local,在末尾加上如下配置
#是自定义监控项的名称。
[nginx-ql-reg-sms]
#启用监控项
enabled = true
# 指定使用创建的过滤器文件
filter = nginx-ql-reg-sms
#定义了触发封禁时执行的动作
action = nginx-ql-reg-sms-block
#指定 Nginx 访问日志的位置
logpath = /var/log/nginx/access.log
#在 findtime 时间内允许的最大重试次数
maxretry = 3
#检测时间窗口为 60 秒,即一分钟内
findtime = 60
#封禁时间为 3600 秒(即 1 小时)
bantime = 60
3.4 nginx中对指定接口进行拦截配置
# 在对应的server块中配置具体的接口
location /api/platform/staff/register/ {
# 引入封禁IP列表
include /etc/nginx/blockedips.conf;
proxy_pass http://172.16.0.5:93/api/platform/staff/register/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
}
4. 常用命令
4.1 启动和重启 Fail2Ban 服务
# 配置修改后,需要启动或重启 Fail2Ban 服务:
sudo systemctl restart fail2ban
# nginx配置修改后需要重载配置
/usr/sbin/nginx -t # 检查配置是否合法
/usr/sbin/nginx -s reload 重载配置
你可以使用以下命令检查 Fail2Ban 的状态,确保其正常运行:
sudo systemctl status fail2ban
4.2 查看所有封禁的 IP
列出所有监狱:首先,列出所有启用的 Fail2Ban 监狱:
sudo fail2ban-client status
查看特定监狱的详细信息:接下来,查看特定监狱的状态和封禁的 IP 地址。例如,要查看 nginx-api-platform-staff-register 监狱的状态:
sudo fail2ban-client status nginx-ql-reg-sms
4.3 解禁IP
如果需要解封某个 IP,可以使用以下命令:
sudo fail2ban-client set nginx-ql-reg-sms unbanip <IP_ADDRESS>
4.4 查看 Fail2Ban 的状态
# 用来检测当前过滤器在nginx访问日志中是否有匹配数据
sudo fail2ban-client status nginx-ql-reg-sms