Главная > HOWTO > Настраиваем проброс IP клиентов за CloudFlare

Настраиваем проброс IP клиентов за CloudFlare

Многие для защиты и ускорения работы своего ресурса пользуются системой CloudFlare, однако при её использовании в логи веб-сервера пишутся IP адреса сети CloudFlare, а не настоящие IP пользователей. В данном HOWTO мы рассмотрим как это исправить.

Введение

CloudFlare — это распределённая по всему миру CDN (content delivery network), предоставляющая функции ускорения загрузки пользовательских сайтов за счёт кэширования и обеспечивающая фильтрацию трафика (на платных тарифных планах ещё и полноценную защиту от DDoS атак).

Для своей работы CloudFlare использует прокси-серверы, расположенные по всему миру, что скрывает настоящий IP, на котором располагается сервер.

Схема работы выглядит так: Клиент -> CloudFlare -> Сервер -> CloudFlare -> Клиент. Таким образом, в логах сервера вы увидите не реальный IP клиента, а IP одного из прокси-серверов CloudFlare. При этом CloudFlare передаёт настоящий IP-адрес клиента в отдельном HTTP-заголовке CF_CONNECTING_IP. Далее мы рассмотрим как настроить его обработку.

Настраиваем nginx (рекомендуемый способ)

Если у вас VPS/VDS или выделенный сервер и есть права root, то самый лучший способ — настроить веб-сервер nginx на забор реального IP из специального заголовка, отправляемого CloudFlare.

Для начала создайте в каталоге /etc/nginx/ (по умолчанию) файл cloudflare (нужно установить владельца и группу root) и пропишите в него следующие строки:

set_real_ip_from 204.93.240.0/24;
set_real_ip_from 204.93.177.0/24;
set_real_ip_from 199.27.128.0/21;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
real_ip_header CF-Connecting-IP;

Свежие пулы IP-адресов CloudFlare можно найти на официальном сайте: IPv4 и IPv6.

Теперь откройте главный конфиг nginx — файл nginx.conf и в секции http {} укажите:

include cloudflare;

Всё, настройка завершена. Для вступления изменений в силу перезапустите веб-сервер nginx.

Теперь в случае если IP-адрес клиента совпадает с IP адресами CloudFlare, nginx будет брать настоящий IP из заголовка CF_CONNECTING_IP.

Настраиваем через PHP (альтернативный способ)

Если у вас нет полного доступа к серверу (прав root), но вы хотите в своих скриптах или установленных движках видеть настоящий IP пользователя, то вставьте в главный скрипт (index.php или config.php) следующий код:

if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP']; }

Если вы уже настроили веб-сервер nginx по инструкции, опубликованной выше, то этот код использовать не требуется — всё уже работает так, как вам необходимо.

Категории:HOWTO Метки:, , ,
  1. MIKL
    29 июля 2015 в 16:16 | #1

    Почему-то второй способ не завелся.

  2. 29 июля 2015 в 20:00 | #2

    MIKL :

    Почему-то второй способ не завелся.

    Используйте основной. Уже несколько лет применяется нами и работает нормально.

  3. MIKL
    30 июля 2015 в 17:35 | #3

    Да из первым у меня проблемы: config nginx не заводиться и он падает. Ругаеться на строчку с инклудом.
    У меня CentOS причем использовал и относительный и абсолютные пути до инклуда.
    Ошибок в нем нет часом?

  4. 31 июля 2015 в 03:22 | #4

    MIKL :

    У меня CentOS причем использовал и относительный и абсолютные пути до инклуда.
    Ошибок в нем нет часом?

    У нас тоже на CentOS всё работает. Главный конфиг /etc/nginx/nginx.conf, а CF — /etc/nginx/cloudflare.

  5. MIKL
    31 июля 2015 в 11:45 | #5

    Всё моя невнимательность: в include cloudflare — буквы f пропустил.
    Спасибо!

  6. vetal
    12 декабря 2015 в 23:52 | #6

    Спасибо огромное! Очень пригодилось

  7. Andrey
    13 января 2016 в 03:34 | #7

    А как это-же сделать но с использованием Apache 2 ??

  8. 14 января 2016 в 15:13 | #8

    Andrey :

    А как это-же сделать но с использованием Apache 2 ??

    Штатно нет, но есть модуль mod_cloudflare. Лучшим решением будет поставить nginx фронтендом, а Apache поставить за него.

  9. АлександрАнатольевич.рф
    15 января 2016 в 16:39 | #9

    Еще Вы забыли сказать,
    что по-умолчанию этот модуль не собирается, его сборку необходимо разрешить с помощью конфигурационного параметра —with-http_realip_module

    Что собственно у меня так и было.

  10. 16 января 2016 в 03:04 | #10

    АлександрАнатольевич.рф :

    Еще Вы забыли сказать, что по-умолчанию этот модуль не собирается, его сборку необходимо разрешить с помощью конфигурационного параметра —with-http_realip_module

    Зависит от мейнтейнера дистрибутива GNU/Linux. В используемом мной nginx уже собран с этим модулем.

  11. Алекс
    4 октября 2016 в 21:02 | #11

    Спасибо, то что нужно.

Представьтесь, пожалуйста! Если ваш комментарий предполагает ответ, мы ответим на него в ближайшее время. Адрес электронной почты должен быть действительным.


Внимание! Запрещено публиковать любые ссылки в тексте комментария, иначе он сразу же будет помечен как нежелательный и не будет опубликован на сайте.