fail2ban 正则表达式嵌套或错误?
fail2ban regex nested or bug?
所以今天我试图为 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 等网站进行了测试,报告与这两种正则表达式匹配。
这个正则表达式:
^<HOST> -.*\"(c|b)|a
...与此相同:
a|^<HOST> -.*\"(c|b)
唯一的区别是尝试替代方案的顺序。如果正则表达式是最重要的,那么这应该匹配任何一种方式。但是,快速查看 fail2ban docs 会告诉我每个 failregex
都必须匹配与请求关联的主机 name/IP。你基本上有两个正则表达式(^<HOST> -.*\"(c|b)
和 a
),其中一个不包含 <HOST>
.
我不确定你想要完成什么,但如果你不能通过将管道放在括号内 ((a|b|c)
) 来完成它,你可能需要使用两个单独的正则表达式。
所以今天我试图为 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 等网站进行了测试,报告与这两种正则表达式匹配。
这个正则表达式:
^<HOST> -.*\"(c|b)|a
...与此相同:
a|^<HOST> -.*\"(c|b)
唯一的区别是尝试替代方案的顺序。如果正则表达式是最重要的,那么这应该匹配任何一种方式。但是,快速查看 fail2ban docs 会告诉我每个 failregex
都必须匹配与请求关联的主机 name/IP。你基本上有两个正则表达式(^<HOST> -.*\"(c|b)
和 a
),其中一个不包含 <HOST>
.
我不确定你想要完成什么,但如果你不能通过将管道放在括号内 ((a|b|c)
) 来完成它,你可能需要使用两个单独的正则表达式。