【问题标题】:fail2ban regex nested or bug?fail2ban 正则表达式嵌套还是错误?
【发布时间】:2016-08-14 00:41:01
【问题描述】:

所以今天我试图为 fail2ban 过滤器组合一些正则表达式。这就是我注意到 fail2ban 在正则表达式模式中嵌套 OR'ing 存在一些问题的地方。

输入字符串:127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a

模式:^<HOST> -.*\"(c|b)|a

这是一个例子:

$ fail2ban-regex "127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] \"a" '^<HOST> -.*\"(c|b)|a'

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

Use   failregex line : ^<HOST> -.*\"(c|b)|a
Use      single line : 127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a


Results
=======

Failregex: 0 total

Ignoreregex: 0 total

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

Lines: 1 lines, 0 ignored, 0 matched, 1 missed
|- Missed line(s):
|  127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a
`-

我注意到如果您运行正则表达式模式a|(c|b),这实际上会成功并报告匹配,但是我需要能够检查第一个 OR 的两侧以查看第一个条件是否匹配(对于例如,如果 HTTP 请求类型不是 POST 或 GET),则忽略正则表达式模式的其余部分,否则在第一个 OR 之后运行剩余的正则表达式模式。另一件事是分组似乎并不重要,因为它似乎总是只在最外层 OR 的第一部分匹配。

这里我们得到一个匹配:

$ fail2ban-regex "127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] \"a" '^<HOST> -.*\"a|(c|b)'

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

Use   failregex line : ^<HOST> -.*\"a|(c|b)
Use      single line : 127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] ^<HOST> -.*\"a|(c|b)
`-

Ignoreregex: 0 total

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

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

我说这可能是一个错误,因为我对 regex101.com 和 debuggex.com 等网站进行了测试,报告与这两种正则表达式模式匹配。

【问题讨论】:

  • 您在\"a" 上的转义看起来不完整或不正确;这样做的目的是什么?
  • 这是一个 bash 字符串。例如,我不能echo """,那就是echo "\""
  • 也许将原始(输入)字符串添加到您的问题中;这可能会有所帮助。
  • String added (:. 另外现在我决定将过滤器分成 2 个,这样我就可以继续执行它,但现在我很好奇这是否是引擎 fail2ban 使用的错误.
  • 通常我认为你不需要将正则表达式放在fail2ban的引号中;无论如何,另一个问题 - 为什么(c|b)的捕获组,然后a在它之外?为什么不直接做[abc]?

标签: regex fail2ban


【解决方案1】:

这个正则表达式:

^<HOST> -.*\"(c|b)|a

...与此相同:

a|^<HOST> -.*\"(c|b)

唯一的区别是尝试替代方案的顺序。如果正则表达式很重要,那么这应该匹配任何一种方式。但是,快速查看fail2ban docs 告诉我每个failregex 都必须匹配与请求关联的主机名/IP。那里基本上有两个正则表达式(^&lt;HOST&gt; -.*\"(c|b) 和 a),其中一个不包含 &lt;HOST&gt;。

我不确定您要完成什么,但如果您不能通过将管道放在括号内 ((a|b|c)) 来完成,您可能需要使用两个单独的正则表达式。

【讨论】:

  • 多个正则表达式模式确实有效,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多