Добавить поддержку CloudFlare для Fail2Ban и определить реальный IP в Apache 2.x. При использовании CDN сервиса CloudFlare, использование Fail2Ban связано с определёнными сложностями, среди которых определение реального IP и собственно выбор способа блокировки.
Когда Fail2Ban определяет наличие некоторых условий (запись в лог. файле), то он может выполнять некоторые действия, среди которых такие шаблоны действий (action) как hostsdeny.conf, iptables.conf, pf.conf и другие.
Почти во всех действиях Fail2Ban главным критерием является IP адрес, который нам нужно заебанить на некоторое время, чтобы не нахлобучивал наш сервер;)
Если сервер находится за CDN сервисом CloudFlare, то все посетители будут приходить с IP диапазона CDN сети CloudFlare. Для определения реального IP адреса посетителя, пришедшего через CDN сеть CloudFlare, на веб-сервере Apache 2.x должен быть установлен mod_cloudflare.
Для ОС Linux доступны готовые бинарные сборки модуля, но в случае использования ОС BSD типа нам нужно будет самостоятельно скомпилировать и установить mod_cloudflare. Страница загрузки модуля: Logging Real Visitor IP Addresses: mod_cloudflare for Apache httpd
Если мы используем BSD, тогда скачиваем исходный код mod_cloudflare.c и компилируем модуль:
Теперь...
Когда сервер определяет реальный IP адрес посетителей приходящих с IP диапазона CDN сети CloudFlare мы можем с этим IP что-то сделать, но только не блокировать его в брандмауэре. Fail2Ban может заблокировать IP с помощью iptables.conf или pf.conf, но это не будет работать - заблокированный IP будет продолжать получать доступ к веб-серверу и неважно будет это Apache или Nginx, а всё потому, что брандмауэры не в состоянии определять реальный IP посетителей приходящих с IP диапазона CDN сети CloudFlare!
Для того, чтобы все "пидрулинщики" пидрулинящие к нашему серванту со злыми помыслами были успешно заебанены, то нам нужно заебанивать их на стороне самого CDN сервиса CloudFlare используя API: CloudFlare Client API Documentation
Хотя "Client API Documentation" и допускает использование методов GET/POST, но на практике работает только метод POST, а при использовании GET можем получить что-то типа:
# E_INVLDINPUT You must include an `a' parameter, with a value of DIUP|wl|chl|nul|ban|comm_news |devmode|sec_lvl|ipv46|ob|cache_lvl|fpurge_ts|async|mirage2|img.q|pre_purge|mini fy|stats|direct|zone_check|zone_ips|zone_errors|zone_agg|zone_search|zone_grab|z one_ss|vote_ss|audit_list|app|rec_set|rec_del|ip_lkup|set|strack_get|sslvemail_g uess|app_req|app_req_list|app_version|custom_cert_set|custom_cert_purge|custom_c ert_load_multi|custom_cert_load|errinfo_look|ersubmit|zoneupload|fillforme|sys_s tatus|user_delve|user_notification_remove|pref_set|zone_file_purge|zone_file_ref resh|zone_settings Additionally, email and tkn parameters are required.
Независимо от того, используем мы GET в браузере или мы используем "curl -s ...". Раньше использовался адрес вида "https://www.cloudflare.com/api.html?...", хотя он и сейчас живой, а нынче ему на смену пришёл "https://www.cloudflare.com/api_json.html".
Для того чтобы добавить поддержку cloudflare для Fail2Ban создадим шаблон действия, vi /etc/fail2ban/action.d/cloudflare.conf, с таким вот содержимым:
# Fail2Ban configuration file # # Author: Charles Chou # Modified: Norman Yee # fix original cloudflare-blacklist.conf # $Revision$ # https://www.cloudflare.com/docs/client-api.html # Your API key is: https://www.cloudflare.com/my-account [Definition] # Option: actionstart # Notes.: command executed once at the start of Fail2Ban. # Values: CMD # actionstart = # Option: actionstop # Notes.: command executed once at the end of Fail2Ban # Values: CMD # actionstop = # Option: actioncheck # Notes.: command executed once before each actionban command # Values: CMD # actioncheck = # Option: actionban # Notes.: command executed when banning an IP. Take care that the # command is executed with Fail2Ban user rights. # Tags: <ip> IP address # <failures> number of failures # <time> unix timestamp of the ban time # Values: CMD # # Old API URL #actionban = curl -s "https://www.cloudflare.com/api.html?a=ban&key=<ip>& \ u=<account>&tkn=<token>" # actionban = curl https://www.cloudflare.com/api_json.html -d "tkn=<token>" \ -d "email=<account>" -d "a=ban" -d "key=<ip>" # Option: actionunban # Notes.: command executed when unbanning an IP. Take care that the # command is executed with Fail2Ban user rights. # Tags: <ip> IP address # <failures> number of failures # <time> unix timestamp of the ban time # Values: CMD # # Old API URL #actionunban = curl -s "https://www.cloudflare.com/api.html?a=nul&key=<ip>& \ u=<account>&tkn=<token>" # actionunban = curl https://www.cloudflare.com/api_json.html -d "tkn=<token>" \ -d "email=<account>" -d "a=nul" -d "key=<ip>" [Init] # Option: account # Notes.: In the actionban and actionunban sections, # replace CLOUDFLARE_LOGIN with your CloudFlare login email # Values: your CloudFlare account # account = example@example.com # Option: token # Notes.: In the actionban and actionunban sections, # replace CLOUDFLARE_API_TOKEN with your API key # Values: Your CloudFlare API key # token = Your API key here
Главная тема статьи "Поддержка CloudFlare для Fail2Ban" раскрыта - на этом всё, финита:)