Не работает автоматический забан по ip на Астериск-сервере

Есть вот такой изолятор в файле /etc/fail2ban/jail.conf:

[asterisk-iptables]
enabled  = true
port     = 5060,5061
filter   = asterisk-iptables
logpath  = /var/log/asterisk/messages
maxretry = 3
bantime = 86400
findtime = 3600

# action_  = %(default/action_)s[name=%(name)s-tcp, protocol="tcp"]
#           %(default/action_)s[name=%(name)s-udp, protocol="udp"]

# action   = iptables-allports[name=ASTERISK, protocol=all]
#           sendmail-whois[name=ASTERISK, dest=root, sender=fail2ban@asterisk]
# ignoreip = 91.202.196.1/24

Такой конфиг asterisk-iptables.conf:

[Definition]

failregex = NOTICE.* .*: Request 'INVITE' from '.*' failed for '<HOST>:.*' (.*) - Failed to authenticate

ignoreregex =

И вот такой результат при тестах:

[admin@sp-sip asterisk]$ sudo fail2ban-regex /var/log/asterisk/messages /etc/fail2ban/filter.d/asterisk-iptables.conf /etc/fail2ban/filter.d/asterisk-iptables.conf



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

Use   failregex filter file : asterisk-iptables, basedir: /etc/fail2ban
Use ignoreregex line : /etc/fail2ban/filter.d/asterisk-iptables.conf
Use         log file : /var/log/asterisk/messages
Use         encoding : UTF-8

Results 
=======

Failregex: 1114 total
|-  #) [# of hits] regular expression
|   1) [1114] NOTICE.* .*: Request 'INVITE' from '.*' failed for '<HOST>:.*' (.*) - 
Failed to authenticate
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [117830] {^LN-BEG}ExYear(?P<_sep>[-/.])Month(?P=_sep)Day(?:T|  
?)24hour:Minute:Second(?:[.,]Microseconds)?(?:\s*Zone offset)?
`-

Lines: 117849 lines, 0 ignored, 1114 matched, 116735 missed
[processed in 11.85 sec]

Missed line(s): too many to print.  Use --print-all-missed to print all 116735 lines

И вот такая строка в логе, которая в Java совпадает с моим регексом, проверено:

[2022-04-27 10:04:58] NOTICE[159776] res_pjsip/pjsip_distributor.c: Request 'INVITE' from '<sip:[email protected]>' failed for '20.123.206.66:58326' (callid: 1811757767-2092425293-280147249) - Failed to authenticate

Есть отдельное правило для ручного бана, все нарушители с такими айпишниками из логов исчезают.

Насколько я понимаю, fail2ban ищет содержание регекса из фильтра в строке лога, а не полное совпадение этой строки с регексом, после чего вытаскивает оттуда переменную HOST и добавляет ее в список блокировки.

Почему нарушители не блокируются автоматически?

Для попадания под фильтр с параметром

maxretry = 3 

нужно именно три строки, идущих подряд? Или достаточно того, чтобы они просто встретились в логе за определенное время, вне зависимости от порядка? Вообще как часто fail2ban сканирует заданный log-файл?


Ответы (1 шт):

Автор решения: sebres

И вот такая строка в логе, которая в Java совпадает с моим регексом, проверено

Нет, не совпадает - NOTICE .* ... ожидает пробел после NOTICE, в строчке же стоит NOTICE[159776]. Кроме того весь RE очень не аккуратный ("уязвим" из-за множественных catch-all и отсутствия якорей).

Для строки из примера можно использовать что-нибудь подобное:

failregex = ^(?:\[\]\s+)?NOTICE\b[^:]*: Request 'INVITE' from '[^']*' failed for '<ADDR>:\d+' \([^\)]*\) - Failed to authenticate

нужно именно три строки, идущих подряд?

Нет, достаточно maxretry попыток с одного адреса за время findtime.

Вообще как часто fail2ban сканирует заданный log-файл?

Он не сканирует весь файл, а только его часть, являющуюся новой после последнего срабатывания. Происходит это от нескольких миллисекунд до 1 секунды после записи строк в лог-файл (в зависимости от нагрузки и типа backend).

Перезагрузка fail2ban также не приведет к полному сканированию лог-файла - см. RFE #2909.

→ Ссылка