Согласно документации, установка bantime в jail на отрицательное значение должна привести к постоянному бану. Однако после этого следующее поведение изменится по сравнению с установкой bantime на положительное целое число:
1) ipset list
не показывает хэш-таблицу fail2ban-sshd
2) firewall-cmd --direct --get-all-rules
пусто
3) /var/log/fail2ban.log
становится одной строкой. интересная запись
sshd[25772]: Неверный пользователь ubuntu с 93.174.89.88 порт 37477', 'ip': '93.174.89.88', 'ipmatches': at 0x7f4588f9dc08>, 'ipfailures': at 0x7f4588f9daa0>, 'time': 1536301842.088076, 'failures': 1443, 'ipjailfailures': at 0x7f4588f9dd70>})': Ошибка блокировки 93.174.89.88
4) /var/log/messages
имеет следующее
firewalld[916]: ПРЕДУПРЕЖДЕНИЕ: '/usr/sbin/iptables-restore --wait=2 -n' не удалось: iptables-restore v1.4.21: Set fail2ban-sshd не существует.#012#012Произошла ошибка в строке: 2#012Попробуйте 'iptables-restore -h' или 'iptables-restore --help' для получения дополнительной информации. firewalld[916]: ОШИБКА: COMMAND_FAILED
Единственная команда, которая работает как и ожидалось, это fail2ban-client status sshd
, однако IP-адреса, которые показаны как забаненные, все равно пытаются подключиться. Я думаю, что корень всех проблем в том, что ipset не создается по какой-то причине, когда целое число отрицательное.
Есть идеи? Также, команда fail2ban-client reload
имеет тот же эффект, что и systemctl restart fail2ban.service
при применении новой конфигурации?
В моем случае /etc/fail2ban/jail.d/local.conf
[sshd]
enabled = true
bantime = -1
findtime = 3600
maxretry = 5
action = %(action_)s
решение1
Это была ошибка в старых версиях fail2ban. С тех пор она была исправлена, но если ваш дистрибутив Linux все еще поставляет эту старую версию, вам также может понадобиться обходной путь.
TheПроблема с GitHubкоторый объясняет проблему и ее исправление, а также включает обходной путь:
Это исправлено в новых версиях. Для версии 0.9 вы можете просто перезаписать параметр bantime (timeout) в действии внутри тюрьмы (параметр timeout для постоянного правила ipset равен 0).
[sshd] bantime = -1 action = %(banaction)s[name=%(__name__)s, bantime=0, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
решение2
ipset может иметь минимальный тайм-аут 0 или максимальный тайм-аут 2147483 см.http://ipset.netfilter.org/ipset.man.html
timeout Все типы наборов поддерживают необязательный параметр timeout при создании набора и добавлении записей. Значение параметра timeout для команды create означает значение timeout по умолчанию (в секундах) для новых записей. Если набор создан с поддержкой timeout, то тот же параметр timeout можно использовать для указания нестандартных значений timeout при добавлении записей. Нулевое значение timeout означает, что запись добавляется в набор навсегда. Значение timeout уже добавленных элементов можно изменить, повторно добавив элемент с помощью параметра -exist. Наибольшее возможное значение timeout составляет 2147483 (в секундах).
значение, которое используется для создания тайм-аута ipset, — это значение конфигурации bantime. Поскольку в значении конфигурации bantime указано -1, в вашей системе возникает ошибка при создании ipset для тюрем fail2ban, поскольку ipset не создается, поскольку по сути вы заставляете систему выполнять что-то вроде этого:
ipset create fail2ban-sshd hash:ip timeout -1
Допустимый диапазон значений тайм-аута составляет 0–2147483 секунд. После этого без ipset с именем fail2ban-sshd запустится что-то вроде:
firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 0 -p tcp -m multiport --dports http,https -m set --match-set fail2ban-sshd src -j REJECT --reject-with icmp-port-unreachable
или:
iptables -t filter -I INPUT_direct 1 -p tcp -m multiport --dports http,https -m set --match-set fail2ban-sshd src -j REJECT --reject-with icmp-port-unreachable
определенно потерпит неудачу, так как не было создано ни одного ipset с именем fail2ban-sshd. Вам необходимо изменить время запрета -1 на 0.