Правильный ip адрес посетителя REMOTE_ADDR c CloudFlare

Добавлено: 02.09.2017

CloudFlare - очень полезный сервис. О нём я как-нибудь расскажу отдельно. А пока небольшая заметка для тех, кто уже подключил его к своему сайту.

Если нужен реальный IP адрес посетителя в переменной REMOTE_ADDR, то нужно в nginx.conf в секции server{} или http{} добавить строки:

# для cloudflare
real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;

Если у вас обычный хостинг, а не vps и не выделенный сервер, то надо попросить техподдержку добавить эти строки. В случае с моим хостингом они сделали это за пару минут. 

Разумеется, при работе Nginx в связке с Apache для того, чтобы в REMOTE_ADDR попадал ip адрес клиента, но не самого Nginx, нужно задать такое поведение строками:

proxy_set_header    X-Real-IP       $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;

После этого переменная REMOTE_ADDR будет получать правильный IP адрес.

Есть ещё варианты с перечислением IP диапазонов CloudFlare, например:

# для cloudflare
real_ip_header X-Forwarded-For;
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;

Но тут могут возникнуть проблемы. CloudFlare развивается и IP адреса могут меняться, поэтому старые руководства могут стать неактуальны. Первый же вариант будет работать всегда, даже если вы поменяете CloudFlare на другой балансировщик нагрузки.