Безопасность · 10 min read · Oct 23, 2025
Установка и использование Fail2ban на Debian 12

Fail2ban отслеживает журналы на предмет неудачных попыток входа и временно блокирует IP-адрес источника, склонного к ошибкам, от доступа к хосту. Это защита от атак методом подбора паролей. Очень полезно иметь fail2ban на хостах, открытых для Интернета.
Версия fail2ban на Debian 12 — 1.0.2.
root@posti:~# fail2ban-client version
1.0.2Чтобы узнать, работает ли fail2ban в данный момент, отправьте на сервер команду ping с помощью fail2ban-client. Сервер fail2ban отвечает «pong», если он работает.
root@posti:/etc/fail2ban# fail2ban-client ping
Server replied: pong
root@posti:/etc/fail2ban#Как это работает
Fail2ban собирает фильтры, действия и отслеживаемые файлы в тюрьму. Несколько тюрем поставляются с дистрибутивом. Их необходимо включить, чтобы они начали работать. Фильтр определяет, как обнаруживать ошибки аутентификации. Действие определяет, как происходит блокировка и разблокировка.
Попытки вторжения вызывают блокировку, если в течение времени поиска (findtime) обнаружено не менее maxretry ошибок входа с одного и того же IP-адреса. Затем IP блокируется на время bantime секунд. После того как блокировка действовала в течение bantime секунд, блокировка снимается, и IP снова может получить доступ к хосту. Fail2ban может обрабатывать как IPv4, так и IPv6.
Больше информации можно прочитать в файлах в каталоге /usr/share/doc/fail2ban/.
Настройка Fail2ban
На системах Debian GNU/Linux fail2ban устанавливается по умолчанию с включенной тюрьмой sshd с разумными настройками. Это делается в файле /etc/fail2ban/jail.d/defaults-debian.conf. Это единственная тюрьма, работающая по умолчанию. Другие тюрьмы должны быть включены системным администратором.
Итак, если вы хотите только отслеживать входы по ssh и блокировать неправомерных злоумышленников, дополнительная конфигурация не требуется.
К сожалению, на Debian 12 fail2ban может не работать с настройками по умолчанию. Debian 12 пометил пакет rsyslog как необязательный, что означает, что он может не быть установлен, поэтому журналы собираются только в journald [wiki.debian.org/Rsyslog].
На системах ISPConfig fail2ban работает, так как автоподборщик ISPConfig устанавливает rsyslog, а учебник по Perfect server от ISPConfig инструктирует установить rsyslog.
С rsyslog файлы журналов появляются в каталоге /var/log/ - таким образом, конфигурация по умолчанию fail2ban находит файлы журналов. Если rsyslog не установлен, конфигурацию fail2ban необходимо изменить, чтобы она читала журналы из системного журнала systemd. Добавьте в секцию jail.local по умолчанию backend = systemd, вот так
[DEFAULT]
backend = systemdВключение тюрьмы
Документация рекомендует помещать все собственные изменения в файлы .local. Это предотвращает проблемы, когда файлы, предоставленные дистрибутивом, обновляются или изменяются обслуживающим персоналом [Читать файл /usr/share/doc/fail2ban/README.Debian.gz].
В качестве примера, включение тюрьмы pure-ftpd осуществляется добавлением в файл /etc/fail2ban/jail.local (создайте файл, если его еще нет) строк
[pure-ftpd]
enabled = trueИмя тюрьмы в квадратных скобках начинает секцию для настроек этой тюрьмы.
Когда вы закончите с изменениями, принудительно перечитайте конфигурационные файлы с помощью команды
systemctl reload fail2banТеперь тюрьма должна работать, что можно проверить с помощью fail2ban-client:
root@posti:/etc/fail2ban# fail2ban-client status pure-ftpd
Status for the jail: pure-ftpd
|- Filter
| |- Currently failed: 0
| |- Total failed: 106
| `- File list: /var/log/syslog
`- Actions
|- Currently banned: 0
|- Total banned: 4
`- Banned IP list:
root@posti:/etc/fail2ban# Поскольку jail.local имеет только настройку «enabled» для этой тюрьмы, все остальные настройки являются настройками по умолчанию из дистрибутива. Обычно они имеют хорошие значения, поэтому дальнейшая конфигурация не требуется. Если необходимо, секция jail.local для этой тюрьмы может содержать настройки, которые переопределяют то, что было установлено в .conf файлах.
Этот пример изменяет findtime, maxretry и bantime для тюрьмы pure-ftpd:
[pure-ftpd]
enabled = true
findtime = 2h
maxretry = 6
bantime = 1dFail2ban-client показывает время в секундах, но время можно вводить в конфигурационных файлах в более удобном формате, например 10h вместо 36000 секунд. man jail.conf в главе «ФОРМАТ СКОРОТЫ ВРЕМЕНИ» объясняет удобные форматы ввода времени.
fail2ban-client имеет опцию для преобразования из удобного формата времени в секунды.
# fail2ban-client --str2sec 1d3h7m
97620Следите за журналами
Чтобы определить, какие тюрьмы следует активировать, следите за журналами, создаваемыми службами, работающими на хосте. Полезно использовать инструмент, который создает сводки журналов, например logwatch или pflogsumm. Чтение сырых журналов требует много времени и является утомительным.
Проверьте, доступна ли тюрьма для службы, работающей на хосте, возможно, прочитав jail.conf.
Как только журналы покажут что-то интересное или тревожное, пришло время исследовать. Например, pflogsumm отправил электронное письмо с резюме с такими строками:
136 unknown[91.224.92.40]: SASL LOGIN authentication failed: UGFzc3...
136 hostname srv-91-224-92-40.serveroffer.net does not resolve to a...
123 unknown[193.32.162.23]: SASL LOGIN authentication failed: UGFzc...
123 hostname mail.whatami.co does not resolve to address 193.32.162.23Это показывает, что IP 91.224.92.40 не удалось войти 136 раз, и еще один подобный случай. Fail2ban должен был предотвратить так много попыток. Чтобы увидеть, почему этого не произошло, проверьте журнал fail2ban.
root@posti:/etc/apt/apt.conf.d# grep 91.224.92.40 /var/log/fail2ban.log | head
2024-02-18 00:01:38,718 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:01:38
2024-02-18 00:11:50,261 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:11:50
2024-02-18 00:21:54,337 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:21:54
2024-02-18 00:32:14,232 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:32:14
2024-02-18 00:42:37,921 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:42:37
2024-02-18 00:53:06,796 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:53:06
2024-02-18 01:03:35,293 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:03:35
2024-02-18 01:14:03,765 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:14:03
2024-02-18 01:24:24,628 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:24:24
2024-02-18 01:34:43,876 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:34:43
root@posti:/etc/apt/apt.conf.d#Этот IP пытается подключиться с интервалами около 10 минут, и тюрьма fail2ban postfix-sasl обнаруживает его.
Хорошо бы выяснить, принадлежит ли этот IP, возможно, законному пользователю хоста, который просто имеет старый пароль на смартфоне или другом устройстве, пытающемся подключиться с регулярными интервалами. Я использую geoiplookup, он показывает, из какой страны IP. Мои пользователи из моей страны, поэтому иностранные пользователи, как правило, являются злоумышленниками. geoiplookup поставляется с пакетами Debian geoip-database и geoip-bin.
$ geoiplookup 91.224.92.40
GeoIP Country Edition: LT, LithuaniaЧтобы выяснить, почему IP не был заблокирован, проверьте findtime этой тюрьмы:
root@posti:/etc/apt/apt.conf.d# fail2ban-client get postfix-sasl findtime
600
root@posti:/etc/apt/apt.conf.d#Я недавно видел эти медленные атаки, злоумышленник знает, что findtime составляет 10 минут, поэтому пытается избежать блокировки, пытаясь войти с более длительными интервалами. Это сработало в этом случае. Чтобы неудачные входы вызывали блокировки, увеличьте findtime для тюрьмы, например, до 10 часов. Добавьте в файл jail.local в секции [postfix-sasl]:
findtime = 10hЗатем после systemctl reload fail2ban тюрьма будет иметь более длительный findtime:
root@posti:/etc/fail2ban# fail2ban-client get postfix-sasl findtime
36000
root@posti:/etc/fail2ban#Другой способ, которым злоумышленники пытаются взломать, — это настойчивость. Даже если злоумышленник заблокирован, просто подождите, пока блокировка закончится, и продолжайте угадывать пароль. Время блокировки можно сделать более длительным, но это создает проблемы для законных пользователей, которые могут ошибиться с паролем и затем не могут получить доступ к своей учетной записи, пока не истечет время блокировки. Существует тюрьма для рецидивистов, называемая recidive. Она работает, отслеживая повторные блокировки для IP в журнале fail2ban, а затем блокирует на длительное время, например, на неделю.
Следующий список взят из отчета logwatch:
--------------------- pam_unix Begin ------------------------
sshd:
Authentication Failures:
unknown (212.70.149.150): 59 Time(s)Поиск этого IP в файле журнала показывает:
2024-02-21 03:42:39,121 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:42:38
2024-02-21 03:42:39,508 fail2ban.actions [895]: NOTICE [sshd] Ban 212.70.149.150
2024-02-21 03:52:38,386 fail2ban.actions [895]: NOTICE [sshd] Unban 212.70.149.150
2024-02-21 03:54:33,560 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:54:33
2024-02-21 03:54:35,364 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:54:35
2024-02-21 04:00:37,017 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:00:36
2024-02-21 04:00:39,021 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:00:38
2024-02-21 04:06:43,036 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:06:42
2024-02-21 04:06:45,039 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:06:44
2024-02-21 04:06:45,426 fail2ban.actions [895]: NOTICE [sshd] Ban 212.70.149.150
2024-02-21 04:16:44,302 fail2ban.actions [895]: NOTICE [sshd] Unban 212.70.149.150
2024-02-21 04:19:04,868 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:19:04Fail2ban работает как задумано, находя неправильные входы и выдавая блокировку на 10 минут. Во время этой блокировки злоумышленник не может получить доступ к этому хосту, но продолжает после снятия блокировки. Это, похоже, случай серьезной попытки взлома. Решение — включить тюрьму recidive с низким maxretry и длительным bantime.
Мне нравится использовать короткую начальную блокировку, скажем, 10 минут. Если реальный пользователь был заблокирован, он просто ждет это время, надеюсь, используя это время, чтобы найти правильный пароль, а затем попробовать снова. Те, кто снова блокируются в тот же день, блокируются на неделю. Значения по умолчанию для тюрьмы recidive можно найти в файле jail.conf, там bantime составляет 1 неделю и findtime 1 день, это кажется мне приемлемым. Но я устанавливаю maxretry на 2, чтобы злоумышленники блокировались быстрее. Я добавил в файл jail.local:
[recidive]
enabled = true
maxretry = 2Блокировки дольше 1 недели, на мой взгляд, нецелесообразны. В конечном итоге старый IP-адрес блокируется или попадает в черный список повсюду, поэтому злоумышленник получает новый IP. Старый IP передается какому-то невиновному новому пользователю Интернета, который не должен быть наказан за плохие поступки предыдущего владельца этого IP.
Устранение неполадок
После загрузки ОС или перезапуска fail2ban состояние восстанавливается, поэтому блокировки продолжаются до истечения времени блокировки. Таким образом, тестирование и устранение неполадок могут включать перезапуски.
Чтобы протестировать конфигурацию, есть тестовая опция:
fail2ban-server --testЧтобы узнать, заблокирован ли IP, последние версии fail2ban могут сделать
# fail2ban-client banned 43.131.9.186
[['recidive']]Команда показывает список тюрем, в которых данный IP в настоящее время заблокирован.
Старые версии fail2ban не имеют этой команды. Тестирование каждой тюрьмы по одной можно сделать так:
# fail2ban-client status recidive | tr " " "\n" | grep 43.163.219.232
43.163.219.232Если вывод показывает IP, значит, он был в списке заблокированных IP-адресов. Команда tr используется для разбивки списка заблокированных IP-адресов (это одна длинная строка) на один IP на строку.
Чтобы увидеть, что происходило с данным IP, найдите его в fail2ban.log:
root@posti:/etc/mysql# grep 43.131.9.186 /var/log/fail2ban.log | cut --characters=-80
2024-03-06 09:00:40,295 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:02:53,954 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:02:55,958 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:34,193 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:36,195 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:36,388 fail2ban.actions [3574846]: NOTICE [sshd] Ban 43
2024-03-06 09:04:36,626 fail2ban.filter [3574846]: INFO [recidive] Fo
2024-03-06 09:14:35,180 fail2ban.actions [3574846]: NOTICE [sshd] Unban
2024-03-06 09:15:10,073 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:16:55,919 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:16:58,522 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:18:44,972 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:20:30,018 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:20:30,499 fail2ban.actions [3574846]: NOTICE [sshd] Ban 43
2024-03-06 09:20:30,620 fail2ban.filter [3574846]: INFO [recidive] Fo
2024-03-06 09:20:30,899 fail2ban.actions [3574846]: NOTICE [recidive] Ba
2024-03-06 09:20:32,021 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:30:29,289 fail2ban.actions [3574846]: NOTICE [sshd] UnbanПодробный вывод конфигурации fail2ban показывает настройки для проверки:
# fail2ban-client -vvv -dБелый список собственных IP-адресов
Возможно, ваши собственные хосты блокируются, или вы хотите убедиться, что некоторые иностранные хосты никогда не блокируются, даже если они ведут себя плохо. Эти IP-адреса можно внести в белый список. По умолчанию ничего не находится в белом списке, вы можете проверить это с помощью:
root@posti:~# fail2ban-client get sshd ignoreip
No IP address/network is ignored
root@posti:~Настройка ignoreip может быть установлена в каждом разделе тюрьмы, но лучше установить ее в секции DEFAULT, чтобы она затрагивала все тюрьмы. Возможно, лучше установить игнорирование для внутренней подсети, чтобы все ваши собственные хосты избегали блокировок. Это из начала jail.local:
[DEFAULT]
ignoreip = 92.237.123.96/27Секция по умолчанию может содержать другие настройки, которые влияют на все тюрьмы. Например, findtime = 10h можно добавить туда.
Ручная блокировка
Чтобы протестировать, что происходит при блокировке, установите блокировку вручную. Сначала протестируйте с тюрьмой с коротким временем блокировки, чтобы вы в конечном итоге вернулись, если случайно заблокируете себя. Например
# fail2ban-client set sshd banip 8.8.4.4>Если какой-то IP ведет себя плохо, но вы не можете заставить fail2ban обнаружить это и выдать блокировки, установка ручной блокировки в тюрьме recidive избавит этот IP на неделю.
# fail2ban-client set recidive banip 8.8.4.4Блокировка подсети работает с использованием нотации CIDR:
fail2ban-client set recidive banip 5.188.87.0/24Ручная разблокировка
Удаление блокировки возможно, но учитывайте, что если плохое поведение продолжится, IP снова будет заблокирован. Поэтому вам следует выяснить, что происходит (например, прочитав журналы), и исправить плохое поведение.
# fail2ban-client set recidive unbanip 8.8.4.4IP может быть заблокирован в нескольких тюрьмах. Чтобы разблокировать IP во всех тюрьмах, используйте
# fail2ban-client unban 8.8.4.4Однако я редко нуждаюсь в этом. У меня время блокировки 10 минут, кроме тюрьмы recidive, которая имеет 1 неделю, поэтому я разблокирую только IP из тюрьмы recidive, другие тюрьмы уже истекли. Если вы не используете тюрьму recidive, IP может быть заблокирован в нескольких тюрьмах одновременно, поэтому это полезно.
Чтобы разблокировать все IP-адреса из всех тюрем, выполните
fail2ban-client unban --allЗаключение
Fail2ban усложняет угадывание паролей, но не полностью предотвращает попытки взлома хоста. Для SSH принуждение к использованию SSH-ключей обеспечивает большую защиту, предотвращая вход с паролем. Для других служб многофакторная аутентификация предотвращает вход, если известен только пароль.
Get new posts in your inbox
No spam. Unsubscribe anytime.