Блог компанії 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.

 

 

 

 

Налаштування фільтрів 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 продовжує обслуговувати легітимних відвідувачів.

 


 

Інші корисні статті у нашому Блозі:


    - Для яких завдань підходить VPS-сервер

    - Встановлення та використання Docker в Ubuntu 22.04

    - Як дізнатися розмір файлів або папок у Linux

    - Вибір веб-хостингу для стартапів з невеликим бюджетом

 


 

 

Взаємодія з брандмауером 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 — незмінним, в той час як зловмисники знайдуть тільки зачинені ворота.