Настраиваем fail2ban и cloudflare для защиты от http флуда

Делать будем на примере панельки vestacp со стандартной связкой nginx + apache. В принципе различий между настройками в иных панельках особо нет, за исключением некоторых моментов с размещением лог файлов и конфигураций nginx или apache.

Цимес заключается в том, что если ваш сайт подключен через cloudflare, то http соединения с вашим сервером происходят  от серверов cloudflare. Однако при этом в логах вы видите реальный ip клиента. И даже если вы внесете в  бан файрвола на своем сервере любой ip из своих логов, эти клиенты всё равно будут подключаться без проблем. Как же это происходит? Загляните в свой /etc/nginx.conf и сразу поймете:

IP клиента передается в заголовке CF-Connecting-IP, его и пишет в лог ваш сервер при соединении с данными подсетями сервиса cloudflare. Кстати по ссылке вы можете увидеть все эти подсети.

Следовательно, банить клинтов нужно используя не только файрвол сервера, а также в первую очередь банить через файрвол cloudflare передавая ему по api конфигурацию бана. Для этого в директории /etc/fail2ban/action.d/ создадим соответствующий конфиг действий cloudflare.conf Кстати там уже есть данный файл, но он использует старое api, так что можно смело писать в него новый конфиг такого содержания:

свой api токен вы можете посмотреть в профиле аккаунта cloudflare

api cloudflare token
API token cloudflare

Теперь в директории /etc/fail2ban/filter.d/ создадим фильтр с названием http-ddos.conf и таким содержимым:

А в директории /etc/fail2ban/jail.d/ создадим конфиг http-ddos.conf

С шаблонами логов тут пришлось немного извратиться, поскольку vesta не добавляет access в названиях файлов. А там лежат ещё error логи, которые в данном случае, нам не нужны. А как прописать шаблон с исключением в данном конфиге я не знаю, ведь это не обычная регулярка. Можно конечно настраивать локально CustomLog в дерективах апача для каждого сайта и задать любые названия лог файлов с любыми префиксами, но тогда логи не просматриваются из панельки. И нужно тогда пилить ещё и панельку на строке:

Решил не заморачиваться и добавить шаблоны по доменным зонам.

  • findtime — это время в секундах по которому будет просматриваться совпадения
  • bantime — время бана
  • maxretry — максимальное количество совпадений за указанный период, после которого наступает банэ

Эти параметры нужно настраивать внимательно и индивидуально, чтобы не забанить лишних юзеров.

И теперь, для того, чтобы каждого клиента fail2ban не писал в свой лог, поменяем loglevel в файле /etc/fail2ban/fail2ban.conf указав loglevel = NOTICE По умолчанию там стоит INFO и в лог пишется каждое совпадение с шаблоном.

Выполним fail2ban-client -d для проверки конфигураций.

В vestacp ротация логов apache почему-то настроена в еженедельном режиме weekly. Это не есть хорошо и может сказаться на производительности при анализе fail2ban-ом больших файлов. Этот режим необходимо поменять на daily в файле /etc/logrotate.d/apache2 Если есть большие лог файлы на данный момент их нужно удалить  и перезапустить апач. Теперь перезапустим сервис systemctl restart fail2ban

Все подключенные джайлы можем видеть по команде fail2ban-client status  Всех забаненных по нашему вновь созданному файлу можем видеть по команде fail2ban-client status http-ddos а также в панельке cloudflare во вкладке firewall тут:

Firewall cloudflare
Firewall cloudflare

Бан и разбан происходит как на уровне iptables сервера, а также отправляется в бан файрвола сервиса cloudflare.