Блог компании 3v-Hosting
Настройка защиты Fail2ban для сайта за CloudFlare
8 мин.
Многие владельцы сайтов вздыхают с облегчением, как только включают Cloudflare. Такие функции, как фильтрация трафика, защита от DDoS-атак и кэширование на границе, делают инфраструктуру более устойчивой. Однако есть один нюанс: CloudFlare скрывает реальные IP-адреса злоумышленников. Когда ваш сервер видит только IP-адреса CloudFlare, такие инструменты, как Fail2ban, не могут блокировать определенных клиентов.
Представьте, что ваш сайт WordPress подвергается брутфорс-атакам на страницу /wp-login.php. Cloudflare проксирует запросы, но ваш сервер видит только несколько узлов Cloudflare, которые делают десятки запросов. Fail2ban блокирует их и случайно блокирует также легитимный трафик. Это как закрыть всю станцию метро из-за того, что туда проник один карманник. Не самая умная стратегия.
Тогда возникает вопрос: как сделать Fail2ban снова полезным, когда сайт находится за CloudFlare?
Как Fail2ban работает без CloudFlare
Fail2ban — это сторожевой механизм, который проверяет логи вашего сервера. Он ищет подозрительные паттерны, такие как неудачные попытки входа по SSH, чрезмерное количество запросов к /xmlrpc.php и повторяющиеся ошибки в логах доступа Nginx. Если количество «нарушений» превышает определенный предел, Fail2ban добавляет нарушивший правила IP-адрес в правила брандмауэра.
Например, если кто-то совершает 20 неудачных попыток входа в SSH в течение одной минуты, Fail2ban вставляет правило iptables, чтобы заблокировать соединения с этого IP-адреса. Это похоже на то, как если бы швейцар заметил пьяного нарушителя порядка и вежливо выпроводил его на улицу.
Однако, если вы используете CloudFlare, швейцар больше не может видеть настоящее лицо — только маску в виде IP-адреса CloudFlare.
Проблема с IP-адресами CloudFlare
Каждый запрос к вашему серверу поступает из инфраструктуры CloudFlare. Вместо компьютера злоумышленника (203.0.113.45) в журналах вы видите дата-центр CloudFlare (172.71.150.2).
Если Fail2ban заблокирует этот адрес, он заблокирует сам CloudFlare, отрезав тысячи невинных пользователей вместе с злоумышленником. Это равносильно закрытию всего терминала аэропорта из-за того, что один пассажир вел себя неподобающим образом.
Решением является настройка вашего веб-сервера и Fail2ban для идентификации реального IP-адреса клиента. Здесь в игру вступают HTTP-заголовки и немного магии настройки.
Установление реального IP-адреса: настройка Nginx и Apache
CloudFlare добавляет к каждому запросу заголовок X-Forwarded-For или CF-Connecting-IP. Этот заголовок содержит фактический адрес клиента. Вы можете восстановить видимость, настроив веб-сервер так, чтобы он доверял этому заголовку.
Пример с Nginx
В Nginx вам понадобится модуль real_ip:
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
# … добавьте все подсети CloudFlare
real_ip_header CF-Connecting-IP;
Теперь в логах будет отображаться реальный IP-адрес посетителя. Для точности всегда используйте полный список подсетей CloudFlare, доступный на странице документации.
Пример с Apache
В Apache можно использовать mod_remoteip:
RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxy 103.21.244.0/22
После этого как в журналах доступа Apache, так и в фильтрах Fail2ban злоумышленники будут отображаться такими, какие они есть, а не скрытыми за CloudFlare.
Другие полезные статьи в нашем Блоге:
- Для каких задач подходит VPS-сервер
- Установка и использование Docker в Ubuntu 22.04
- Как узнать размер файлов или папок в Linux
- Выбор Веб-хостинга для стартапов с небольшим бюджетом
Настройка фильтров Fail2ban
Как только журналы очищены, Fail2ban снова вступает в игру.
Допустим, вы хотите защитить вход в WordPress:
[wordpress-login]
enabled = true
port = http,https
filter = wordpress-login
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 600
bantime = 3600
Здесь фильтр проверяет повторяющиеся неудачные попытки входа. С восстановленными реальными IP-адресами запрет работает правильно. Злоумышленники блокируются, а CloudFlare продолжает обслуживать легитимных посетителей.
Взаимодействие с брандмауэром CloudFlare
Можно спросить, зачем нужен Fail2ban, если CloudFlare уже предоставляет брандмауэр?
Ответ кроется в уровнях. CloudFlare защищает от крупномасштабных атак, но не знает специфики вашего приложения. Fail2ban, с другой стороны, может анализировать пользовательские журналы. Например, он может обнаруживать неудачные попытки входа администратора в Joomla или повторные сканирования 404 для /wp-config.php.
Это как сочетание городской полиции и соседского патруля. CloudFlare занимается беспорядками, а Fail2ban — подозрительными лицами, которые трясут ручку вашей двери.
Практический пример: защита Kubernetes Ingress
Теперь рассмотрим сценарий DevOps. У вас есть кластер Kubernetes с Nginx Ingress за брандмауэром CloudFlare. Боты пытаются взломать ваш CMS с помощью метода перебора. Включение real_ip в конфигурации Nginx Ingress и подключение логов к мониторинговому подсистему позволяет развернуть Fail2ban в качестве контейнера-сайдкара. Fail2ban сканирует логи и блокирует IP-адрес злоумышленника на уровне брандмауэра узла.
Этот гибридный подход гарантирует, что вы не полагаетесь только на правила Cloudflare, но также добавляете самозащиту на уровне кластера.
SEO и перспектива цифрового бизнеса
С точки зрения бизнеса, неспособность защитить ваш сайт от атак методом перебора — это не только нагрузка на процессор. Постоянные попытки генерируют ошибки, раздувают журналы и могут замедлять работу уровней кэширования. Время отклика сервера имеет значение для SEO — Googlebot не будет ждать вечно.
Например, владелец одного интернет-магазина заметил, что боты атаковали /wp-login.php сотни раз в минуту. Страницы начали загружаться медленно, и клиенты бросали свои корзины. После настройки Fail2ban с помощью заголовков Cloudflare нагрузка на сервер нормализовалась, и коэффициент конверсии восстановился.
В этом случае безопасность напрямую влияет на продажи.
Контрольный список лучших практик
- Всегда настраивайте веб-сервер так, чтобы он восстанавливал реальный IP-адрес клиента из заголовков CloudFlare.
- Обновляйте список диапазонов IP-адресов CloudFlare — в этом поможет автоматизация с помощью cron и curl.
- Тщательно тестируйте фильтры Fail2ban, чтобы не заблокировать легитимных пользователей.
- Комбинируйте Fail2ban с правилами CloudFlare: например, полностью заблокируйте доступ к /xmlrpc.php на уровне CloudFlare и используйте Fail2ban для защиты от брутфорса при входе в систему.
- Мониторинг логов после развертывания — иногда неправильно настроенное регулярное выражение может вызвать хаос.
Заключение
Fail2ban остается актуальным даже после переноса вашего сайта за CloudFlare. Вам просто нужно убедиться, что он идентифицирует реальных злоумышленников, а не прокси CloudFlare. Считайте это как чистку затуманенного окна: как только вы его вытрете, вы сможете увидеть, кто стоит за вашей дверью.
Сочетание глобального щита CloudFlare и локальной защиты Fail2ban создает сбалансированную систему безопасности. Она масштабируема, настраиваемая и эффективная. Для ИТ-специалистов и предпринимателей, реализующих серьезные цифровые проекты, такая настройка обеспечивает спокойствие — ваша инфраструктура останется быстрой, а SEO — неизменным, в то время как злоумышленники найдут только запертые ворота.