Как я защитил сервер Fail2ban и перестал просыпаться по ночам
Первый звоночек
Как-то ночью я полез в логи сервера — и охренел. 1500 неудачных попыток входа по SSH за последние сутки. Кто-то из Китая долбился по дефолтному порту, перебирал root и admin. Спал я потом плохо — казалось, что вот-вот кто-то подберёт пароль.
Я тогда только начинал администрировать свой первый VPS. Думал, что сложный пароль — это всё, что нужно. Наивный.
Fail2ban тогда для меня был просто строчкой в мануалах. Типа «установи Fail2ban, он всё починит». Я не придавал значения, пока не увидел эти логи своими глазами.
Ставлю Fail2ban
Установка тривиальная:
sudo apt install fail2ban -y
После установки fail2ban сам создаёт правила iptables и начинает мониторить логи. Но по дефолту он настроен слабо — например, бан только на 10 минут, и только 5 неудачных попыток. Я усилил.
Создал локальный конфиг, который переопределяет дефолтный:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Поменял параметры: maxretry = 3, bantime = 86400 (сутки), findtime = 600. В три попытки за десять минут — баним на день. Жёстко, но эффективно.
Настройка под себя
Кроме SSH, я включил джейлы для nginx и WordPress. По логам видно, что боты долбятся и по вебу:
[nginx-http-auth]
enabled = true
[wordpress]
enabled = true
logpath = /var/log/auth.log
maxretry = 5
Отдельно настроил фильтр на wp-login.php — кто часто долбится на страницу входа, тот получает бан. WordPress сам по себе защищён, но дополнительные козыри в рукаве не помешают.
Тут я наступил на грабли. После включения джейла для nginx я забыл перезагрузить fail2ban и полчаса тупил — почему правила не применяются. Команда для перезапуска:
sudo systemctl restart fail2ban
После перезапуска проверил статус:
sudo fail2ban-client status
Увидел SSH, nginx-http-auth, wordpress — все активны. Выдохнул.
Первая блокировка
Через час после настройки fail2ban заблокировал первого нарушителя. Я проверил:
sudo fail2ban-client status sshd
В списке забаненных IP маячил адрес из Нидерландов. Приятное чувство — знать, что автоматика сработала, а я сплю спокойно.
Но была и ложная тревога. Однажды я сам себя забанил, когда тестировал новую конфигурацию SSH и несколько раз ошибся в пароле. Пришлось лезть через консоль Proxmox и разбанивать. С тех пор добавил свой IP в ignoreip:
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.0.0/24
Теперь локальная сетка и localhost вне подозрений.
Мониторинг через Telegram
Fail2ban умеет отправлять уведомления по email, но я человек простой — хочу в Telegram. Настроил action через curl и Telegram Bot API. В jail.local добавил:
action = %(action_mwl)s
telegram-notify
И создал скрипт-обёртку, который при каждом бане шлёт мне сообщение: «Забанен IP 1.2.3.4 за SSH-брутфорс». Теперь я знаю, сколько мусора отсекается, и сплю ещё крепче.
Кстати, уведомления я получаю всё тем же ботом, которого описал в предыдущей статье про Telegram-бота на Python. Там же всё и завязал.
Что дальше
Fail2ban научил меня одному: безопасность — это не «поставил и забыл». Раз в месяц я проверяю логи, смотрю, какие IP пытались пробиться, и при необходимости добавляю новые фильтры. Недавно добавил защиту на Postfix — почтовые боты тоже любят долбиться.
Уровень шума в логах упал процентов на 80. И главное — я перестал дёргаться по ночам. Теперь если кто-то ломится, fail2ban его отшибает за меня, а я узнаю об этом утром из уведомления.
Из полезного — почитай про recidive jail. Это когда одного и того же нарушителя банят повторно, уже на месяц. Я его включил, но пока не срабатывал — видимо, боты быстро переключаются на другие цели.
Расскажу подробнее, как Fail2ban изменил мою жизнь администратора сервера. Всё началось с первого звоночка. Как-то ночью я полез в логи сервера — и охренел. 1500 неудачных попыток входа по SSH за последние сутки. Кто-то из Китая долбился по дефолтному порту, перебирал root и admin. Спал я потом плохо — казалось, что вот-вот кто-то подберёт пароль. Это была паранойя, но не беспочвенная: брутфорс по SSH — это самая массовая атака в интернете, боты сканируют диапазоны IP и перебирают пароли круглосуточно. Не вы, так ваш сосед по подсети станет целью. Вопрос только времени, когда бот доберётся до вашего сервера.
Я тогда только начинал администрировать свой первый VPS. Думал, что сложный пароль — это всё, что нужно. Наивный. Сложный пароль защищает от угадывания, но не останавливает тысячи попыток в сутки. Каждая попытка — это нагрузка на сервер, каждый неверный вход — запись в лог. Fail2ban тогда для меня был просто строчкой в мануалах. Типа «установи Fail2ban, он всё починит». Я не придавал значения, пока не увидел эти логи своими глазами. Цифра 1500 в сутки меня отрезвила. Это же значит, что кто-то стучится в мою дверь каждую минуту. Пора было ставить замок.
Ставлю Fail2ban. Установка тривиальная: sudo apt install fail2ban -y. После установки fail2ban сам создаёт правила iptables и начинает мониторить логи. Но по дефолту он настроен слабо — например, бан только на 10 минут, и только 5 неудачных попыток. Десять минут — это как прикрыть дверь, не закрыв на замок: бот подождёт и вернётся. Я усилил настройки. Создал локальный конфиг, который переопределяет дефолтный: sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local, затем sudo nano /etc/fail2ban/jail.local. Поменял параметры: maxretry = 3, bantime = 86400 (сутки), findtime = 600. В три попытки за десять минут — баним на день. Жёстко, но эффективно.
Объясню, что значат эти параметры. maxretry — количество неудачных попыток до бана. bantime — время бана в секундах. findtime — окно времени, за которое считаются попытки. Мои настройки означают: если кто-то сделал три неудачные попытки входа за десять минут — его IP блокируется на сутки. Это баланс между защитой и удобством. Я сам не ошибаюсь в пароле три раза подряд, так что для меня эти правила не мешают. А для ботов — отличный барьер: день блокировки заставляет их переключаться на другие цели. Настройте параметры под себя, но помните: чем жёстче, тем надёжнее.
Настройка под себя. Кроме SSH, я включил джейлы для nginx и WordPress. По логам видно, что боты долбятся и по вебу: [nginx-http-auth] enabled = true, [wordpress] enabled = true, logpath = /var/log/auth.log, maxretry = 5. Отдельно настроил фильтр на wp-login.php — кто часто долбится на страницу входа, тот получает бан. WordPress сам по себе защищён, но дополнительные козыри в рукаве не помешают. Веб-брутфорс по странице входа — это классика: боты перебирают пароли админки. Fail2ban отсекает и это. Я закрыл и wp-login.php, и xmlrpc.php, куда часто стучатся спамеры.
Тут я наступил на грабли. После включения джейла для nginx я забыл перезагрузить fail2ban и полчаса тупил — почему правила не применяются. Классическая ошибка: конфиг поменял, а демон не перезапустил. Команда для перезапуска: sudo systemctl restart fail2ban. После перезапуска проверил статус: sudo fail2ban-client status. Увидел SSH, nginx-http-auth, wordpress — все активны. Выдохнул. Мораль простая: после любого изменения конфигурации перезапускайте сервис и проверяйте, что джейлы активны. Одна строчка проверки экономит полчаса нервов.
Первая блокировка. Через час после настройки fail2ban заблокировал первого нарушителя. Я проверил: sudo fail2ban-client status sshd. В списке забаненных IP маячил адрес из Нидерландов. Приятное чувство — знать, что автоматика сработала, а я сплю спокойно. Увидеть собственными глазами, как система ловит нарушителя — это лучшая проверка того, что всё настроено правильно. Но была и ложная тревога. Однажды я сам себя забанил, когда тестировал новую конфигурацию SSH и несколько раз ошибся в пароле. Пришлось лезть через консоль Proxmox и разбанивать. С тех пор добавил свой IP в ignoreip: [DEFAULT] ignoreip = 127.0.0.1/8 192.168.0.0/24. Теперь локальная сетка и localhost вне подозрений.
Про ignoreip стоит рассказать отдельно. Это белый список адресов, которые никогда не банятся. Очень удобно: ваш домашний IP, рабочий IP, локальная сеть — всё в списке. Если вы ошибётесь в пароле с рабочего компьютера — вас не забанят. Но не злоупотребляйте: слишком широкий ignoreip ослабляет защиту. Я добавил только localhost и свою локальную сеть. Кстати, если ваш IP динамический, придётся периодически обновлять список. Это мелочь, но она уберегает от ситуации «я сам себя забанил».
Мониторинг через Telegram. Fail2ban умеет отправлять уведомления по email, но я человек простой — хочу в Telegram. Настроил action через curl и Telegram Bot API. В jail.local добавил: action = %(action_mwl)s telegram-notify. И создал скрипт-обёртку, который при каждом бане шлёт мне сообщение: «Забанен IP 1.2.3.4 за SSH-брутфорс». Теперь я знаю, сколько мусора отсекается, и сплю ещё крепче. Кстати, уведомления я получаю всё тем же ботом, которого описал в предыдущей статье про Telegram-бота на Python. Там же всё и завязал. Уведомления в мессенджер — это куда удобнее почты: пришли на телефон, прочитал, не пропустил.
Что дальше. Fail2ban научил меня одному: безопасность — это не «поставил и забыл». Раз в месяц я проверяю логи, смотрю, какие IP пытались пробиться, и при необходимости добавляю новые фильтры. Недавно добавил защиту на Postfix — почтовые боты тоже любят долбиться. Уровень шума в логах упал процентов на 80. И главное — я перестал дёргаться по ночам. Теперь если кто-то ломится, fail2ban его отшибает за меня, а я узнаю об этом утром из уведомления. Защита почтового сервера тоже важна: почтовые боты долбятся на каждый открытый SMTP-порт.
Ещё одна вещь, которую я рекомендую — recidive jail. Это когда одного и того же нарушителя банят повторно, уже на месяц. Идея в том, что если бот уже был забанен, а после разбана снова пытается лезть — значит, он настроен агрессивно, и его нужно отсечь надолго. Я его включил, но пока он не срабатывал — видимо, боты быстро переключаются на другие цели. Но рецидивистов это останавливает надёжно. Включите recidive — это дополнительный уровень защиты без лишних хлопот.
Пара мыслей про общую безопасность SSH. Fail2ban — это отличная защита, но не единственная. Я рекомендую комплекс: сложный пароль или ключи, смена порта, запрет входа root напрямую. Fail2ban — это надёжный страж, но он не заменяет грамотную базовую настройку. Вместе они дают хороший уровень защиты. Плюс следите за обновлениями OpenSSH. Каждый из слоёв защиты делает взлом дороже и сложнее. Не надейтесь на одну вещь — комбинируйте.
Итог. Fail2ban — это инструмент, который за пару часов настройки избавляет вас от брутфорса навсегда. Блокирует, уведомляет, мониторит. Если у вас есть сервер, открытый в интернет — ставьте его обязательно. Это одна из самых простых и эффективных мер защиты. Мой совет: установите, настройте банджи, добавьте игнор для своих IP, подключите уведомления в Telegram — и спите спокойно. Как я. За два года работы fail2ban сэкономил мне бессонных ночей больше, чем я могу посчитать.