配置fail2ban以禁止Nginx 403禁止请求

・6 分钟阅读

如果你要使用Nginx屏蔽某些路径或URL来保护内容,可能需要使用fail2ban来屏蔽这些Nginx捕获的403请求,例如,如果您重命名了登录页面,那么黑客机器人通常会在尝试登录时收到403禁止错误。

本指南将向你展示如何使用fail2ban在服务器级别自动屏蔽这些机器人,并且要小心你没有禁止谷歌或其他索引网站!

配置fail2ban以屏蔽Nginx 403请求

安装概述

  • 生成日志数据
  • 配置fail2ban筛选器和监狱

生成403错误的日志数据

转到nginx虚拟主机禁止的URL以生成一些日志数据,

显示Nginx日志文件的最后50行

tail -n 50 /var/log/nginx/logfile

这些条目将被用作fail2ban过滤器的基础,用于触发403个禁止错误的用户,


2016/09/15 17:01:18 [error] 3176#3176: *1 access forbidden by rule, client: 189.167.27.53, server: guides.wp-bullet.com, request: "GET /wp-login.php HTTP/1.1", host: "guides.wp-bullet.com", referrer: "android-app://com.Slack"
2016/09/15 17:01:54 [error] 3176#3176: *1 access forbidden by rule, client: 189.167.27.53, server: guides.wp-bullet.com, request: "GET /wp-login.php HTTP/1.1", host: "guides.wp-bullet.com", referrer: "android-app://com.Slack"

现在我们已经有了日志数据,我们可以创建fail2ban过滤器,

为Nginx 403禁止访问错误配置fail2ban

我们需要创建fail2ban过滤器,它将与日志文件中的错误匹配,然后我们创建一个监狱来使用过滤器,并且禁止用户。

为Nginx禁止请求创建fail2ban过滤器

创建Nginx过滤器

sudo nano /etc/fail2ban/filter.d/nginx-forbidden.conf

添加与Nginx日志中403禁止错误匹配的正则表达式


[Definition]
failregex = ^ [error] d+#d+: .* forbidden .*, client: , .*$

ignoreregex = 


Ctrl X,Y Enter保存并退出。

现在我们可以通过扫描Nginx虚拟主机中指定的错误日志来测试Nginx HTTP身份验证过滤器。

fail2ban-regex /var/log/nginx/wpbullet.error.log /etc/fail2ban/filter.d/nginx-forbidden.conf

你将看到在这个输出里显示了我们之前生成的登录失败记录。


Running tests
=============

Use failregex file : /etc/fail2ban/filter.d/nginx-forbidden.conf
Use log file : log

Results
=======

Failregex: 2 total
|- #) [# of hits] regular expression
| 1) [2] ^ [error] d+#d+: .* forbidden .*, client: , .*$
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
| [2] Year/Month/Day Hour:Minute:Second
`-

Lines: 2 lines, 0 ignored, 2 matched, 0 missed

为Nginx禁止请求创建fail2ban Jail

确保你有fail2ban jail 文件夹

sudo mkdir -p /etc/fail2ban/jail.d

创建fail2ban Nginx http auth配置文件

sudo nano /etc/fail2ban/jail.d/nginx-forbidden.conf

粘贴此配置,该配置使用我们之前创建的过滤器,扫描所有nginx日志文件,在60秒内失败3次就禁止用户6000分钟。


[nginx-forbidden]
enabled = true
filter = nginx-forbidden
port = http,https
logpath = /var/log/nginx/*error*.log
findtime = 60
bantime = 6000
maxretry = 3

既然已经知道怎么建造jail,那么测试fail2ban语法,确保它都能正常工作,

sudo fail2ban-client -d

如果你没有看到任何错误(警告是可以的),那么我们可以重启fail2ban,

sudo service fail2ban restart

检查Nginx禁用的fail2ban状态

fail2ban客户端可用于显示它jail的统计信息

sudo fail2ban-client status nginx-forbidden

在虚拟机测试时,我设法获得了网关禁止。


Status for the jail: nginx-forbidden
|- filter
| |- File list: /var/log/nginx/wp-bullet.error.log /var/log/nginx/error.log
| |- Currently failed: 0
| `- Total failed: 3
`- action
 |- Currently banned: 1
 | `- IP list: 192.168.60.1
 `- Total banned: 1

你还可以列出iptables

sudo iptables -L -n

这显示了nginx禁止监狱的iptables链


Chain f2b-nginx-forbidden (2 references)
target prot opt source destination
REJECT all -- 192.168.0.1 0.0.0.0/0 reject-with icmp-port-unreachable
RETURN all -- 0.0.0.0/0 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0

任何在Nginx上扫描和触发403个禁止错误的机器人现在将被fail2ban自动禁止。

Zhongy0410 profile image