Site icon IT Blog

Подключение Cloudflare proxy

Cloudflare proxy даже на бесплатном тарифном плане позволяет фильтровать некоторый бот трафик, особенно если активировать Bot Fight режим и прочие функции по безопасности и блокировке уязвимостей. Cloudflare proxy также позволяет скрыть реальный IP адрес веб сервера.

Подключить Cloudflare proxy очень просто, нужно зарегистрироваться и перенести DNS записи домена на обслуживание на DNS сервера Cloudflare, на момент написания статьи я перенес нескольких сайтов от Godaddy и Hetzner на Cloudflare и включил для них proxy, регистратор домена при этом не изменяется, просто нужно в настройках регистратора доменного имени указать DNS сервера Cloudflare и продублировать там все DNS записи (после миграции, у некоторых доменных регистраторов они могут быть удалены, ведь они перестанут использоваться), поэтому перед переносом я экспортировал резервную копию записей в текстовые файлы. При необходимости можно вернуть все как было. Записи NS Godaddy и Hetzner я удалил в Cloudflare.

Замечу что блокировать трафик через iptables станет невозможным, так как после включения proxy, физически запросы будут приходить от Cloudflare proxy серверов. Но реальный IP пользователей будет указан в заголовке CF-Connecting-IP, что нужно настроить в конфигурации веб сервера, и тогда IP пользователей будет отображаться в запросах и логах как и раньше. После этого можно блокировать запросы через конфигурацию веб сервера или лучше через панель Cloudflare — Security — Security rules, и там добавить правило Block в котором перечислить Source IP, чтобы запросы не доходили до веб сервера.

На некоторых сайтах были атаки и Cloudflare имеет отличную функцию «Under Attack Mode», ее минус только в том что она включается глобально для домена и всех поддоменов, но я покажу как включить ее вручную например для одного поддомена, для этого создадим Security rules в панели Cloudflare, это приведет к показу JS страницы и проверки браузера (вместо JS Challenge можно Managed Challenge что немного слабее):

Expression: http.host eq "sub.ixnfo.com"
Action: JS Challenge

Можно исключить из проверки указанные сети:

(http.host eq "sub.ixnfo.com")
and not (ip.src in {10.0.0.0/8 172.16.0.0/12})

Еще пример блокировки спам ботов на поддомен из IPv6 сети:

Rule name: IPv6_Spam_Challenge
Expression: (ip.src in {::/0} and http.host eq "sub.ixnfo.com")
Action: Managed Challenge

На бесплатном тарифном плане, если включен Bot Fight режим, Security rules не действуют на Bot Fight режим, например если вы хотите API запросы вашего приложения исключить из блокировок Bot Fight mode, в этом случае придется отключить Bot Fight mode или оплатить тарифный план.
Также на бесплатном плане есть ограничение на отправку файлов, на север можно отправить файл не более 100 мегабайт, что может быть критично для облачных хранилищ например, на скачивание нет ограничений на размер файла.

Также хочу заметить, если используются сертификаты от Let’s Encrypt, то их автопродление перестанет работать, ведь IP адрес будет уже не сервера, а Cloudflare. Это решается настройкой автопродления через записи DNS, что не безопасно, так как API ключи Cloudflare с правами на изменение DNS записей домена будут храниться на сервере. Cloudflare также предлагает свой сертификат на 15 лет, но он работает только для связи сервера с Cloudflare и не подходит для показа пользователям, что является отличным решением если Cloudflare proxy вы не собираетесь отключить.

Очень редко у Cloudflare бывали перебои в работе, статус решения проблем можно посмотреть тут cloudflarestatus.com.

Пример Managed Challenge для админ панели WordPress:

(http.request.uri.path contains "/wp-admin/" and not http.request.uri.path contains "/wp-admin/admin-ajax.php")
or (http.request.uri.path in {"/wp-login.php" "/xmlrpc.php" "/wp-signup.php" "/wp-register.php"})
or (http.request.uri.path contains "/wp-json/wp/v2/users")
or (http.request.uri.query contains "action=lostpassword")

Пример Managed Challenge для phpBB форума с исключением поисковых ботов:

(http.request.uri.path contains "/viewtopic.php" 
or http.request.uri.path contains "/download/file.php"
or http.request.uri.path contains "/search.php")
and not cf.client.bot

Пример для указанного домена с исключением поисковых ботов и страны:

http.host eq "ixnfo.com" and not cf.client.bot and ip.geoip.country ne "US"

Смотрите также мою статью:
Настройка CF-Connecting-IP заголовка

Exit mobile version