Как заставить работать fail2ban failregex (проблема с. *?)?

Я бы хотел заблокировать через fail2ban любого, кто генерирует оба этих типа строк в моем файле nginx error.log:

2019/12/15 20:12:12 [error] 640#640: *6 open() "/data/xxxxxx.com/www/50x.html" failed (2: No such file or directory), client: 35.187.45.148, server: xxxxxx.com, request: "GET /external.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock", host: x.x.x.x
2019/12/16 13:42:59 [crit] 647#647: *41 connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 35.233.78.55, server: xxxxxx.com, request: "GET /external.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "x.x.x.x"

Я думал, что эти строки сработают:

open (). * client: ‹HOST>

connect () к. * client: ‹HOST>

Но они, по-видимому, этого не делают (проверено с помощью fail2ban-regex). Вот мой полный фильтр:

[Definition]
failregex = open() .* client: < HOST >  
            connect() to .* client: < HOST >   
            FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: < HOST >

datepattern = {^LN-BEG}

Примечание: последний (FastCGI ...) работает. Что-то не так с ". *"?


person C DV    schedule 29.01.2020    source источник


Ответы (1)


Круглые скобки () являются метасимволами регулярного выражения, что означает, что они имеют особое значение в регулярном выражении. Например, вот что на самом деле соответствует вашему первому регулярному выражению:

open .* client:

То есть () на самом деле представляют собой группу захвата нулевой ширины, и поэтому они ничем не сопоставимы. Поскольку вы пытаетесь сопоставить open, за которым следует пробел, вам не удается найти совпадение. Вот исправленная версия:

[Definition]
failregex = open\(\) .* client: < HOST >  
            connect\(\) to .* client: < HOST >   
            FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: < HOST >

datepattern = {^LN-BEG}

Обратите внимание, что если мы хотим сопоставить буквальные скобки, мы должны экранировать их с помощью обратной косой черты.

person Tim Biegeleisen    schedule 29.01.2020