Реальный IP посетителя за Cloudflare или балансировщиком
Как сервер за прокси может безопасно получить реальный IP посетителя: Nginx, Node.js и PHP.
Почему IP отличается
Когда перед сайтом стоит Cloudflare, балансировщик нагрузки или Nginx, подключения к вашему серверу приходят от этого прокси, и вы видите IP прокси вместо IP посетителя. IP посетителя находится в заголовке, который добавляет прокси.
Cloudflare
Cloudflare передаёт один IP посетителя в заголовке CF-Connecting-IP. Чтобы убедиться, что запрос действительно пришёл от Cloudflare, доверяйте этому заголовку только если IP подключения входит в опубликованные диапазоны IP Cloudflare (cloudflare.com/ips).
X-Forwarded-For
Когда запрос проходит через несколько прокси, X-Forwarded-For собирает их IP через запятую. Первым значением считается посетитель, но посетитель может вписать его сам, поэтому отсчитывайте с конца от значения, которое последним добавил ваш прокси, и берите значение из позиции, которой можно доверять.
Nginx
С модулем real_ip перечислите диапазоны ваших прокси в set_real_ip_from и задайте real_ip_header равным CF-Connecting-IP или X-Forwarded-For. После этого логи и приложение будут получать IP посетителя.
Node.js и PHP
В Express задайте app.set("trust proxy", число прокси), и req.ip станет IP посетителя. В PHP используйте $_SERVER["HTTP_CF_CONNECTING_IP"] только если $_SERVER["REMOTE_ADDR"] является вашим собственным прокси.
Проверка
Если после настройки IP, который записывает ваш сайт, совпадает с IP на главной странице IPinfoBox, всё работает.
Проверьте свой IP и местоположение прямо сейчас.
Проверить мой IP