Настройка правил Fail2Ban для SSH и веб-сервера
Fail2Ban: Как защитить SSH и веб-сервер от брутфорса за 30 минут
Представьте: вы уезжаете в отпуск, а ваш дом остаётся без сигнализации. Воры могут подобрать ключ к двери или разбить окно. Так же и с сервером: если не закрыть "двери" (SSH, админки сайтов), боты будут атаковать его 24/7, пока не подберут пароль. Fail2Ban — это ваша сигнализация, которая блокирует злоумышленников после первых же попыток взлома.
В этом уроке вы научитесь: ✅ Настраивать Fail2Ban для защиты SSH (чтобы никто не подобрался к вашему серверу по паролю). ✅ Блокировать атаки на веб-сервер (Nginx/Apache), включая брутфорс админок WordPress, ботов, сканирующих уязвимости. ✅ Поймёте, как кастомизировать правила под свои нужды и избежать ложных срабатываний.
1. Что такое Fail2Ban и почему он нужен
Fail2Ban — это программа, которая мониторит логи сервера (файлы, куда записываются все действия) и блокирует IP-адреса, если замечает подозрительную активность. Например:
- Многократные неудачные попытки входа по SSH.
- Массовые запросы к /wp-admin/ (админка WordPress).
- Сканирование уязвимостей (например, запросы к
/phpmyadmin/setup.php).
Как это работает?
- Fail2Ban читает логи (например,
/var/log/auth.logдля SSH или/var/log/nginx/access.logдля веб-сервера). - Ищет шаблоны атак (например, строку
"Failed password for root"). - Блокирует IP на заданное время (по умолчанию — 10 минут) с помощью iptables (встроенный фаервол Linux).
Аналогия: Представьте, что у вас на двери стоит камера. Если кто-то пытается подобрать ключ 3 раза подряд, камера отправляет сигнал охране, и они блокируют этого человека на сутки.
2. Установка Fail2Ban
На Debian/Ubuntu
sudo apt update && sudo apt install fail2ban -y
На CentOS/RHEL
sudo yum install epel-release -y && sudo yum install fail2ban -y
Проверка работы
sudo systemctl status fail2ban
Если видите active (running), значит, Fail2Ban запущен.
3. Базовая настройка для SSH
3.1. Конфигурационные файлы
Fail2Ban использует два типа файлов:
/etc/fail2ban/jail.conf— основной конфиг (не редактируйте его напрямую!)./etc/fail2ban/jail.local— ваш кастомный конфиг (создаётся вручную).
Важно: Все изменения вносите в
jail.local— так они не слетят при обновлении Fail2Ban.
3.2. Создаём jail.local
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
3.3. Настраиваем защиту SSH
Найдите секцию [sshd] и измените её так:
[sshd]
enabled = true # Включаем защиту
port = ssh # Порт SSH (по умолчанию 22)
filter = sshd # Правило для фильтрации логов
logpath = /var/log/auth.log # Путь к логу (для Ubuntu/Debian)
maxretry = 3 # Сколько попыток разрешено до блокировки
bantime = 1h # Время блокировки (1 час)
findtime = 10m # Время, за которое считаются попытки (10 минут)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 # IP, которые никогда не блокируются (ваш локальный и доверенные)
Пояснения:
maxretry=3— после 3 неудачных попыток входа IP блокируется.bantime=1h— блокировка на 1 час (можно увеличить до1d— сутки).ignoreip— добавьте сюда свой статический IP (если есть), чтобы не заблокировать себя.
3.4. Перезапускаем Fail2Ban
sudo systemctl restart fail2ban
3.5. Проверяем статус блокировок
sudo fail2ban-client status sshd
Вывод должен быть примерно таким:
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 15
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 3
`- Banned IP list: 185.22.44.11
4. Настройка защиты для веб-сервера (Nginx/Apache)
4.1. Создаём фильтр для атак на веб-сервер
Fail2Ban не знает, как обрабатывать логи Nginx/Apache "из коробки". Нам нужно создать правило.
Для Nginx
-
Создаём файл фильтра:
sudo nano /etc/fail2ban/filter.d/nginx-botsearch.conf -
Вставляем правило (блокирует сканирование уязвимостей):
[Definition] failregex = ^<HOST> .* "(GET|POST|HEAD).*(etc/passwd|wp-login\.php|\.env|phpmyadmin|admin|login|sql|backup|config)" ignoreregex =Что блокирует это правило?
- Запросы к
/etc/passwd(попытка доступа к системным файлам). /wp-login.php(брутфорс WordPress)./phpmyadmin,/admin(сканирование админок).
- Запросы к
-
Создаём джейл (правило блокировки) в
jail.local:[nginx-botsearch] enabled = true port = http,https filter = nginx-botsearch logpath = /var/log/nginx/access.log maxretry = 2 bantime = 24h
Для Apache
Аналогично, но путь к логу другой:
logpath = /var/log/apache2/access.log # Для Debian/Ubuntu
# или
logpath = /var/log/httpd/access_log # Для CentOS/RHEL
4.2. Защита от брутфорса WordPress
Если у вас WordPress, добавьте правило для /wp-login.php:
-
Создаём фильтр:
sudo nano /etc/fail2ban/filter.d/wordpress.conf -
Вставляем:
[Definition] failregex = ^<HOST> .* "POST .*wp-login\.php" ignoreregex = ^<HOST> .* "POST .*wp-login\.php.* 200"Логика: Блокируем все POST-запросы к
wp-login.php, кроме тех, что завершились успехом (200 OK). -
Добавляем джейл в
jail.local:[wordpress] enabled = true port = http,https filter = wordpress logpath = /var/log/nginx/access.log maxretry = 3 bantime = 6h
4.3. Применяем изменения
sudo systemctl restart fail2ban
Проверяем статус:
sudo fail2ban-client status nginx-botsearch
sudo fail2ban-client status wordpress
5. Продвинутые настройки
5.1. Белый список (ignoreip)
Добавьте в jail.local свои IP, чтобы не блокировать себя:
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 111.222.333.444
Как узнать свой IP? Зайдите на 2ip.ru или выполните:
curl ifconfig.me
5.2. Настройка уведомлений по email
Если хотите получать письма о блокировках:
- Установите
sendmail(или другой MTA):sudo apt install sendmail -y - Добавляем в
jail.local:destemail = ваш@email.com sender = fail2ban@ваш-сервер.com action = %(action_mwl)s - Перезапускаем Fail2Ban.
5.3. Постоянная блокировка для опасных IP
Если какой-то IP постоянно атакует, добавьте его в черный список навсегда:
sudo iptables -A INPUT -s 185.22.44.11 -j DROP
Чтобы правило сохранилось после перезагрузки:
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
6. Мониторинг и отладка
6.1. Просмотр заблокированных IP
sudo fail2ban-client status sshd
sudo iptables -L -n | grep DROP
6.2. Разблокировать IP вручную
sudo fail2ban-client set sshd unbanip 185.22.44.11
6.3. Логи Fail2Ban
Если что-то не работает, смотрите логи:
sudo tail -f /var/log/fail2ban.log
6.4. Тестирование правил
Попробуйте подключиться по SSH с другого IP и намеренно введите неверный пароль 3 раза. Через минуту IP должен заблокироваться.
7. Типичные ошибки и их решения
| Проблема | Решение |
|---|---|
| Fail2Ban не блокирует IP | Проверьте путь к логу (logpath) в jail.local. Убедитесь, что логи пишутся (например, tail -f /var/log/auth.log). |
| Ложные срабатывания | Увеличьте maxretry или добавьте исключения в ignoreregex. |
| Не приходят email-уведомления | Проверьте работу sendmail (echo "Test" | mail -s "Test" ваш@email.com). |
| После перезагрузки правила сбрасываются | Установите iptables-persistent (см. раздел 5.3). |
Практика для закрепления
Упражнение 1: Базовая защита SSH
- Установите Fail2Ban на тестовый сервер.
- Настройте
jail.localдля SSH с параметрами:maxretry = 2bantime = 30m- Добавьте свой IP в
ignoreip.
- Попробуйте подключиться по SSH с другого устройства и намеренно введите неверный пароль 2 раза.
- Проверьте, заблокировался ли IP (
sudo fail2ban-client status sshd).
Упражнение 2: Защита веб-сервера
- Создайте правило для блокировки сканирования
/phpmyadmin. - Протестируйте, открыв в браузере
http://ваш-сервер/phpmyadmin(IP должен заблокироваться после 2-х запросов). - Проверьте логи Nginx/Apache (
tail -f /var/log/nginx/access.log).
Упражнение 3: Настройка уведомлений
- Настройте отправку email при блокировке (см. раздел 5.2).
- Заблокируйте свой тестовый IP и проверьте, пришло ли письмо.
Упражнение 4: Анализ логов
- Посмотрите логи Fail2Ban (
/var/log/fail2ban.log). - Найдите строки с
Ban— это заблокированные IP. Сколько атак было за последние сутки?
Вопрос для размышления
Почему не стоит ставить bantime навечно (например, bantime = -1)?
Подсказка: Подумайте о динамических IP провайдеров и возможных ложных срабатываниях.
Итоги
Теперь ваш сервер защищён от: ✔ Брутфорса SSH (никто не подберёт пароль). ✔ Сканирования уязвимостей (боты не найдут дыры в веб-сервере). ✔ Атак на админки (WordPress, phpMyAdmin и др.).
Следующий шаг: Настройте двухфакторную аутентификацию (2FA) для SSH и обновите все пароли на сложные (или используйте ключи SSH вместо паролей). Это сделает ваш сервер практически непробиваемым.
Вопросы? Пишите в комментариях — разберём любые сложные моменты! 🚀
Генератор паролей с длинной 64 символа
Женская одежда с бахромой
Кадастровые работы в Бийске
Как Aptum хостинг помогает малым бизнесам в управлении CRM-системами
Как выбрать планировку сайта для блогов на DreamHost
Как выбрать Vdsina вечный хостинг для своего проекта
Казань окна VEKA - профессионализм и опыт
Курьерская вода
Новостройки Оренбурга: недвижимость с отличной ценой
Онлайн чат-партнерство
Пиломатериалы для возведения бани
Почему VDSina — лучший выбор хостинга
Секреты Вконтакте: тонкости и хитрости
Скидки до 50% на тур в Коста-Рике
Видеочат рулетка бесплатно