Не работает автоматический забан по 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 шт):
И вот такая строка в логе, которая в 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.