Блог компании 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 — неизменным, в то время как злоумышленники найдут только запертые ворота.