Как получить реальный IP адрес посетителя через Cloudflare

реальный IP адрес посетителя через Cloudflare

Настроили облачную защиту Cloudflare на своем домене? Теперь у всех посетителей сайта отображаются IP адреса Cloudflare. В данной статье я расскажу как получить реальный IP адрес посетителя через Cloudflare.

CloudFlare – это сервис по обслуживанию и обеспечению безопасности сайтов. В среднем, сайт с CloudFlare загружается вдвое быстрее, потребляет на 60% меньше трафика, получает на 65% меньше нагрузки на сервер и при этом является более защищенным.

По работе возникла проблема на одном из сайтов. В разделе «Вопрос-ответ» кто-то очень активно постил сотни вопросов и возникла необходимость заблокировать по IP адресу доступ к сайту.

Оказалось, что все посетители имели IP адреса Cloudflare. Изучив информацию в интернете и на Cloudflare, нашлось несколько вариантов как получить реальный IP адрес посетителя через Cloudflare.

Получить реальный IP адрес посетителя через Cloudflare с помощью Apache

Т.к. много людей задавали вопрос получения реальных IP через Cloudflare, то Cloudflare выпустил модуль mod_cloudflare для Apache, который регистрирует и отображает фактический IP-адрес посетителя, а не адрес CloudFlare. Скачать можно по ссылке: https://www.cloudflare.com/technical-resources/#mod_cloudflare

Получить реальный IP адрес посетителя через Cloudflare с помощью Nginx

В Nginx есть модуль ngx_http_realip_module, с помощью которого можно получить реальный IP адрес посетителей через Cloudflare.

Необходимо добавить в файл /etc/nginx/conf.d/cloudflare.conf следующий текст:

# Cloudflare Real IP
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 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 199.27.128.0/21;
 
# If IPv6 support:
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2c0f:f248::/32;
set_real_ip_from 2a06:98c0::/29;
 
# Real IP enable
real_ip_header CF-Connecting-IP;

Это ip подсети CloudFlare и при обращении клиента к вашему сайту с данных IP, реальный IP клиента будет взят из заголовка CF-Connecting-IP.

Список постоянно обновляющихся ip Cloudflare периодически желательно проверять и при необходимости дополнять ими свой файл cloudflare.conf

Обновляющийся список Cloudflare IP в текстовом формате для ipv4: https://www.cloudflare.com/ips-v4
Обновляющийся список Cloudflare IP в текстовом формате для ipv6: https://www.cloudflare.com/ips-v6

Получить реальный IP адрес посетителя через Cloudflare с помощью PHP

Ну и самый простой способ получения IP адрес — это с помощью PHP.

Cloudflare отправляет на ваш сервер дополнительные заголовки запросов, включая CF-Connecting-IP, которые мы можем сохранить в переменную, если они определены, используя этот простой однострочный код:

$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"])?$_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);

Дополнительные серверные переменные:

$_SERVER[«HTTP_CF_CONNECTING_IP»] — реальный IP-адрес посетителя

$_SERVER[«HTTP_CF_IPCOUNTRY»] — страна посетителя

$_SERVER[«HTTP_CF_RAY»] — см. описание здесь

вы можете использовать его следующим образом:

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

Если вы это сделаете, и валидность посещаемого IP-адреса важна, вам может потребоваться проверить, что $_SERVER[«REMOTE_ADDR»] содержит фактический действительный IP-адрес облачного флэш-памяти, потому что любой может подделать заголовок, если он смог напрямую подключиться на IP-адрес сервера.