kotadminСегодня расскажу как получить реальный IP посетителя вашего сайта, если сайт «спрятан» за Cloudflare. Что такое Cloudflare я, думаю, все знают, но на всякий случай напомню, что это CDN-прокси, позволяющий решать много интересных задач. От кэширования сайта и ускорения его быстродействия, до предотвращения DDoS атак на сервер и скрытие реального IP сервера. На «темной» стороне используется, в основном, как раз для скрытия IP сайта/сервера.
Допустим, вы уже добавили свой сайтик в Cloud и передали ему управление DNS. Теперь посетитель при заходе на ваш сайт проходит вот такую цепочку: Посетитель — Cloud — Сервер — Cloud — Посетитель. Поскольку Clodflare по сути является проксирующим сервером, то и возвращать он будет IP своих серверов, коих у него штук 20 имеется. Таким образом получается, что вместо реальных IP посетителей ваших сайтов вы будете видеть один из прокси-IP Cloudflare. На это можно было бы и забить, но иногда реальный IP необходим. Например, для бана по IP, или для трейд-скриптов, или для учета голосования.

Итак, как получить настоящий IP посетителя на сервере за Cloudflare?

Первым делом нужно знать, что при ответе на запрос проксирующий сервер передает HTTP-параметр CF_CONNECTING_IP, в котором и передает реальный IP посетителя. С этим параметром мы и будем работать, передавая его в nginx и обрабатывая на сервере.

Обрабатываем CF_CONNECTING_IP в nginx

1. Для этого мы создадим файл cfreal в папке самого nginx — /etc/nginx/cfreal (путь для RedHat, CentOS и шляпоподобных ОС) с вот таким содержанием:

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 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;
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;
real_ip_header CF-Connecting-IP;

IP в файле — это IP прокси-серверов Cloudflare, IPv4 и IPv6. Этот пул адресов обновляем и лежит на сайте самого CF. Вот тут лежат IPv4, а вот тут IPv6. Можно, например, написать sh для автоматического обновления, но на практике — адреса меняются/добавляются не так часто.

2. Добавляем в основной конфиг nginx, в секцию http {} (до закрывающего } ) вызов созданного нами файла:

include cfreal;

3. Перезагружаем nginx:

service nginx restart (для CentOS до 6.х включительно)
systemctl restart nginx.service (для Centos от 7.0)

Это все)
Теперь мы можем видеть реальные IP пользователей и обрабатывать их в каком-либо скрипте, если есть такая необходимость.
А завтра мы научимся пересобирать nginx без помощи администратора и отключать показ сайта для неугодных нам стран).


8 Comments

  1. Че это тебя понесло ? :)

  2. Ну не то чтиво что ты обычно даёшь :)

    • ClockWorkOrange

      видимо, ты не читал меня в 2010-12 годах) 50%,а то и больше было именно таких How to

  3. отлично :)

    >А завтра мы научимся пересобирать nginx без помощи администратора и отключать показ сайта для неугодных нам стран).

    продолжай в том же духе ;)

    • ClockWorkOrange

      сейчас позавтракаю и начну ваять пост)

  4. Спасибо. Работает.

Комментарии закрыты, так как статья древняя.

Close