Nginx+Fail2ban 实现同一ip在一分钟内连续三次请求同一接口并响应成功时进行封禁

1. 安装 Fail2Ban 和 Nginx

如果尚未安装 Fail2Ban Nginx,可以使用以下命令进行安装:

# CentOS默认的仓库中可能不包含Nginx,所以需要添加EPELExtra 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

 

posted @ 2024-06-25 15:18  惊鸿难定  阅读(22)  评论(0编辑  收藏  举报