Я просто попытался добавить новое правило fail2ban, которое должно сканировать журналы ошибок Apache2 на предмет подозрительных попыток доступа к файлам (люди, которые пытаются получить доступ к трем общим URL-адресам входа, которые не существуют, обычно не имеют добрых намерений).
Для этого я добавил новое правило в свой файл jail.local:
[apache-suspiciousfiles]
enabled = true
port = http,https
filter = apache-suspiciousfiles
banaction = iptables-allports
action = %(action_mwl)s
logpath = /var/log/apache2/error*.log
maxretry = 3
Однако это дало мне неожиданное сообщение об ошибке в моих журналах:
2014-02-10 13:28:51,450 fail2ban.jail : INFO Jail 'apache-suspiciousfiles' started
2014-02-10 13:28:51,690 fail2ban.actions.action: ERROR iptables -N fail2ban-apache-suspiciousfiles
iptables -A fail2ban-apache-suspiciousfiles -j RETURN
iptables -I INPUT -p tcp -j fail2ban-apache-suspiciousfiles returned 200
До этого я проверял фильтр с помощью fail2ban-regex, поэтому был совершенно уверен, что его там не было.
(Примечание: это «возвращено 200». Многие люди, кажется, испытывают проблемы с 100, но это примерно 200)
Я быстро поискал в Google и, похоже, никакой ответ мне не помог, поэтому я просто попробовал первое, что пришло мне в голову:
Я переименовал правило и сократил его название:
[apache-suspicious]
enabled = true
port = http,https
filter = apache-suspicious
banaction = iptables-allports
action = %(action_mwl)s
logpath = /var/log/apache2/error*.log
maxretry = 3
(Я переименовал правило с apache-suspiciousfiles в apache-suspicious)
Это действительно помогло мне. Теперь все запускается нормально, и мое правило работает.
Также происходит, если ваша конфигурация создает «multiport» и «all» вместе («all» можно использовать для обхода ботов, переключающихся с tcp на udp, что заполняет журналы сообщением «WARNING: ... уже заблокировано»).
$ sudo iptables -I INPUT -p all -m multiport --dports ssh -j fail2ban-ssh
iptables: multiport needs `-p tcp', `-p udp', `-p udplite', `-p sctp' or `-p dccp'
$ echo $?
2
$ cat fail2ban.log
iptables -I INPUT -p all -m multiport --dports ssh -j fail2ban-ssh returned 200
Для меня 200 было потому, что правило action.d, отправленное в iptables, не могло быть проанализировано.
Мое правило iptables action.d было следующим
[Definition]
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I INPUT -p <protocol> --dport <port> -j fail2ban-<name>
##comments and more actions removed for brevity
[Init]
name = default
#port = ssh
protocol = any
Обратите внимание, как закомментирована моя переменная порта! Я не знаю, какие iptables были бы загружены, я предполагаю, что он будет пустым. Независимо от его значения, это не будет известный порт, который мог бы понять iptables.
Мне пришлось отредактировать свое правило, чтобы удалить бит --dport, поскольку я на самом деле не собирался передавать порт, и тогда можно было загружать, не заставляя его возвращать 200.
Сегодня у меня такая же ошибка:
2017-04-05 23:00:27,123 fail2ban.jail [501]: WARNING Jail name 'wordpress-404-scanner' might be too long and some commands (e.g. iptables) might not function correctly. Please shorten
2017-04-05 23:00:27,455 fail2ban.actions.action[501]: ERROR iptables -N fail2ban-wordpress-404-scanner
iptables -A fail2ban-wordpress-404-scanner -j RETURN
iptables -I INPUT -p tcp -j fail2ban-wordpress-404-scanner returned 200
Было совершенно ясно заменить в /etc/fail2ban/jail.local:
action = iptables-allports[name=wordpress-404-scanner]
с участием:
action = iptables-allports[name=wordpress-404]
И теперь это работает!
В моем случае имя моего правила было достаточно коротким, но ошибка 200 сохранялась.
Моя ошибка заключалась в том, что я пытался заблокировать несколько портов с помощью iptables[]
действие, которое работает только для одного порта. Как только я изменил свое действие на использование iptables-multiport[]
, ошибка исчезла:
action = iptables[name=HTTPD, port="http,https", protocol=tcp] # < bad
action = iptables-multiport[name=HTTPD, port="http,https", protocol=tcp] # < good
ошибка исчезла.