Após algumas iterações com fail2ban-regex
, acho que o que acontece é que o fail2ban tenta escolher a data a partir da própria linha de log, antes de testá-la em seu padrão de filtro.
$ line='0.0.0.0 - - [06/Apr/2017:07:45:42 +0000] "POST /xmlrpc.php'
Com .*
no lugar do registro de data e hora, ele corresponde, mas, como você percebeu, a procura explícita de um número no início do registro de data e hora não corresponde:
$ ./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
Mas veja isto:
$ ./fail2ban-regex "$line" '<HOST> - - \[ \+0000\].*POST /xmlrpc' |grep ^Lines
Lines: 1 lines, 0 ignored, 1 matched, 0 missed
Eu removi todo o timestamp do padrão, em vez disso, esperei que ele estivesse vazio (há apenas o indicador de fuso horário). Ele ainda corresponde, insinuando que o fail2ban na verdade remove o registro de data e hora antes de testar o padrão na configuração.
Assim, talvez seja melhor deixar essa parte fora do padrão de filtro e corresponder a qualquer coisa no lugar do carimbo de data / hora:
<HOST> - - \[.*?\] "POST /xmlrpc.php HTTP/1.0" 200
Como uma nota secundária, o seu RE original tem um +
sem aspas, onde o registro de data e hora começa, o sinal de mais significa "pelo menos uma repetição do elemento anterior", então você precisa escapar dele.