Как получить реальный 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-адрес сервера.