首页 > 解决方案 > 在 Nginx 上运行 fail2ban-regex 时了解 fail2ban 测试输出

问题描述

我正在运行 Nginx 的 Ubuntu 18.04 Digital Ocean droplet 上设置 fail2ban。

我按照本教程进行设置,并按照本教程创建自定义过滤器以捕获对禁止 URL 的请求。

这是我的过滤器:

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

ignoreregex =

这是我试图捕捉的示例日志文件条目的样子:

2020/03/09 12:18:08 [error] 14843#14843: *8 access forbidden by rule, client: xx.xx.xx.xx, server: xx.xx.xx.xx, request: "GET /var/ HTTP/1.1", host: "xxx.xxx.xxx.xx"

这是我正在运行的测试:

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

这是输出:

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

Use   failregex filter file : nginx-forbidden, basedir: /etc/fail2ban
Use         log file : /var/log/nginx/error.log
Use         encoding : UTF-8


Results
=======

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

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [200] {^LN-BEG}ExYear(?P<_sep>[-/.])Month(?P=_sep)Day(?:T|  ?)24hour:Minute:Second(?:[.,]Microseconds)?(?:\s*Zone offset)?
|  [254] ExYear(?P<_sep>[-/.])Month(?P=_sep)Day(?:T|  ?)24hour:Minute:Second(?:[.,]Microseconds)?(?:\s*Zone offset)?
`-

Lines: 1060 lines, 0 ignored, 131 matched, 929 missed
[processed in 0.47 sec]

Missed line(s): too many to print.  Use --print-all-missed to print all 929 lines

查看我的日志文件,大约有 1060 行,其中 200 行包含日期。在这 200 个中,131 个包含“禁止”,所以我认为它可能有效,但我不确定。

以下是我的问题:

1) 什么是“日期模板命中”?它们是否以预期格式的日期开头?因此,它们是否是应该匹配的日志条目的“候选人”?

2)“忽略”和“错过”有什么区别?

3) 有没有办法查看 131 个“匹配”条目,以便我可以检查它们看起来像我想要捕捉的内容?

4)过滤器中的正则表达式在哪里说client: <HOST>,那是什么匹配?它是日志条目中的“客户端”IP 地址,还是行尾的“主机”条目?

一旦您知道这些术语的含义,答案可能就很明显了,但是对于我的无知,我找不到任何足够简单的解释。

标签: nginxfail2ban

解决方案


为时已晚,但...

  1. fail2ban 通过尝试将日期与默认日期模式(模板)进行匹配来搜索日志中的日期。如果你有一个命中,那么一个日期是匹配的。在您的示例中,总共找到/匹配了两种不同的日期格式(一种格式的 200 个日期和另一种格式的 254 个日期)。

  2. 忽略的行是与您匹配的行ignoreregex(如果存在)(在您的情况下没有)。遗漏的行是那些没有被任何failregexor匹配的行ignoreregex

  3. --print-all-matched标志添加到您的 fail2ban-regex 命令

  4. client: <HOST>,将匹配client: xx.xx.xx.xx,您的日志行中的部分。<HOST>是与主机名或 IP 地址匹配的预定义正则表达式的别名。


推荐阅读