fail2ban正则expression式不匹配

我必须承认,正则expression式对我来说一直是一个弱点。 我从来没有坐下来,花了足够的时间学习他们有效地使用它们。 不过,我真的为此感到不知所措。 我试图做一个自定义的failregex阻止人们试图利用任何xmlrpc.php错误(他们是不断暴力企图这样做)。

我正在使用fail2ban v0.9.3,在Ubuntu 16.04.2上使用Apache 2.4.18。

这是我的正则expression式:

<HOST> - - \[\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2} +\d{4}\] "POST /xmlrpc.php HTTP/1.0" 200

这是一个示例行,它不匹配(IPreplace为0):

0.0.0.0 - - [06/Apr/2017:07:45:42 +0000] "POST /xmlrpc.php HTTP/1.0" 200 752 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

我不明白为什么它不匹配。 据我所知,这应该是一个完全匹配。 任何人都可以点亮一下吗?

另外,如果时区偏移符合+和a – 符号,这将是很好的…我想用HTTP/1.\d{1}代替HTTP/1.0 HTTP/1.\d{1}它应该匹配1.0和1.1,正确?

提前致谢!

编辑:在与fail2ban-regex命令行玩弄后,我已经find了与<HOST> - - \[它将匹配所有行的正则expression式。 但是,第二个我将它改为<HOST> - - \[\d{2}它根本不匹配任何行。 这似乎没有道理!

编辑2:那么,在此期间,我正在使用<HOST> - - \[.* "POST /(xmlrpc|wp-login).php HTTP/1.\d" 200并且匹配我想要的行。 然而,我仍然很想知道为什么我的原始的不匹配,因为我宁愿使用一个更具体的正则expression式比我现在使用的更广泛的正则expression式。

经过fail2ban-regex的几次迭代后,我认为fail2ban会尝试从日志行本身中挑选date,然后再根据filter模式进行testing。

 $ line='0.0.0.0 - - [06/Apr/2017:07:45:42 +0000] "POST /xmlrpc.php' 

.*代替时间戳,它匹配,但正如你注意到的那样,在时间戳开始时明确地寻找一个数字是不匹配的:

 $ ./fail2ban-regex "$line" '<HOST> - - \[.*\].*POST /xmlrpc' |grep ^Lines Lines: 1 lines, 0 ignored, 1 matched, 0 missed $ ./fail2ban-regex "$line" '<HOST> - - \[\d+.*\].*POST /xmlrpc' |grep ^Lines Lines: 1 lines, 0 ignored, 0 matched, 1 missed 

但看看这个:

 $ ./fail2ban-regex "$line" '<HOST> - - \[ \+0000\].*POST /xmlrpc' |grep ^Lines Lines: 1 lines, 0 ignored, 1 matched, 0 missed 

我从模式中删除整个时间戳,而不是期待它是空的 (只有时区指标)。 它仍然匹配,暗示fail2ban实际上在对configuration中的模式进行testing之前删除了时间戳。

所以,最好把这个部分从滤镜模式中取出来,并且匹配任何东西来代替时间戳:

 <HOST> - - \[.*?\] "POST /xmlrpc.php HTTP/1.0" 200 

作为一个方面说明,你的原始RE有一个没有加上引号+的时间戳开始,加号意味着“至less有一个重复的前一个元素”,所以你需要逃避它。

试试这个正则expression式 – 我用regexr.comtesting了它,它肯定是匹配的:

 <HOST> - - \[\d{2}\/\w{3}\/\d{4}(:\d{2}){3} \+0000\] "POST \/xmlrpc.php HTTP\/1.0" 200 

其中一个问题是不能避开斜线 – 这需要完成。

编辑(我看到你的编辑后):我试着简化了一下,想出了这匹配:

 failregex = ^<HOST> - - \[.*\] "POST \/xmlrpc.php.*$ 

这不完全是你想要的,但它的工作原理