Назад | Перейти на главную страницу

Правило fail2ban приводит к сообщению об ошибке «iptables вернул 200»

Я просто попытался добавить новое правило 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

ошибка исчезла.