在Nginx中配置fail2ban以禁止403禁止的请求

要拒绝Nginx中的特定路径或URL以保护内容,可以使用fail2ban拒绝对Nginx的403请求。 例如,如果您使用插件重命名了登录页面,则通常,黑客机器人在尝试登录时会收到403禁止错误。 同样,如果您完全禁用xmlrpc.php。

本指南将向您展示如何使用fail2ban通过IPTables在服务器级别自动禁止bot。 注意不要阻止Google或其他搜索引擎将您的网站编入索引!

在Nginx 403禁止中配置fail2ban拒绝请求

安装概述

  • 生成日志数据
  • 配置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.andreyex.ru, request: "GET /wp-login.php HTTP/1.1", host: "guides.andreyex.ru", 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.andreyex.ru, request: "GET /wp-login.php HTTP/1.1", host: "guides.andreyex.ru", 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: <HOST>, .*$

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: <HOST>, .*$
`-

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

在Fail2ban中对Nginx中的拒绝请求进行监禁

确保您在Fail2ban中有一个监狱文件夹

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

创建用于HTTP身份验证的Nginx jail Fail2ban配置文件

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

现在我们知道我们将入狱,请检查Fail2ban语法以确保一切正常

sudo fail2ban-client -d

如果您没有看到任何错误(确定警告),则可以重新启动fail2ban

service fail2ban restart

检查Nginx状态是否在fail2ban中被禁止

Fail2ban客户端可用于显示其拘留场所的统计信息

sudo fail2ban-client status nginx-forbidden

在虚拟机上进行测试时,我设法获得了被禁止的网关。

Status for the jail: nginx-forbidden
|- filter
|  |- File list:        /var/log/nginx/andreyex.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中被禁止。

Sidebar