Назад | Перейти на главную страницу

nginx GEOIP за прокси-сервером cloudflare показывает неправильную страну (не конечного пользователя, но если прокси)

Я использую директивы geoip Cloudflare и nginx:

geoip_country /usr/local/share/GeoIP/GeoIP.dat;
geoip_city /usr/local/share/GeoIP/GeoLiteCity.dat;

Они собирают IP-адрес в порядке (как pipaddress поскольку запрос помечен как переадресованный в заголовке), но показывает страну как SG (расположение прокси-сервера cloudflare).

Есть ли вообще заголовок HTTP_X_FORWARDED_FOR установлен, чтобы получить страну конечного пользователя?

<?php
    if (getenv(HTTP_X_FORWARDED_FOR))
    {
        $pipaddress = getenv(HTTP_X_FORWARDED_FOR);
        $ipaddress = getenv(REMOTE_ADDR);
        echo "Your IP address is : ".$pipaddress. " (via proxy $ipaddress) " ;
    }
    else
    {
        $ipaddress = getenv(REMOTE_ADDR);
        echo "Your IP address is : $ipaddress";
    }

    $country = getenv(GEOIP_COUNTRY_NAME);
    $country_code = getenv(GEOIP_COUNTRY_CODE);
    echo "<br/>Your country : $country ( $country_code ) ";
?>

И /etc/nginx/fastcgi_params ниже:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_FILENAME    $request_filename;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# Set php-fpm geoip variables
fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3;
fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;
fastcgi_param GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;
fastcgi_param GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;
fastcgi_param GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;
fastcgi_param GEOIP_REGION $geoip_region;
fastcgi_param GEOIP_CITY $geoip_city;
fastcgi_param GEOIP_POSTAL_CODE $geoip_postal_code;
fastcgi_param GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;
fastcgi_param GEOIP_LATITUDE $geoip_latitude;
fastcgi_param GEOIP_LONGITUDE $geoip_longitude;

Ваш сервер nginx не может определить реальный IP-адрес запроса для передачи PHP. Обходной путь - использовать модуль Real IP Nginx.

Проверь это https://support.cloudflare.com/hc/en-us/articles/200170706-How-do-I-restore-original-visitor-IP-with-Nginx-

Просто добавьте этот фрагмент кода из ссылки в свой файл конфигурации и перезапустите nginx.

Расширение ответа от @the_nuts. Я собрал небольшой скрипт, который автоматически генерирует geoip_proxy Список инструкций на основе списков на странице Cloudflare:

#!/bin/sh
# /etc/nginx/geoip_update.sh
# Update GeoIP proxy list to the current list of cloudflare IP addresses

outfile=$(dirname "$0")/geoip_cloudflare.conf

echo "# Auto-generated by $0" > "$outfile"
(
    curl https://www.cloudflare.com/ips-v4
    curl https://www.cloudflare.com/ips-v6
) | while read ip; do
    echo "geoip_proxy $ip;"
done > "$outfile"
echo List updated.

Использование: запустите этот скрипт один раз, и он сгенерирует /etc/nginx/geoip_cloudflare.conf файл. Затем добавьте в свой http блок:

include /etc/nginx/geoip_cloudflare.conf;

При желании добавьте скрипт в cron для регулярного обновления списков IP-адресов. Не знаю, как часто они меняются.

Внимание: скрипт не очень оптимизирован, во время обновлений файл config / include на короткое время будет пустым. Если nginx будет перезапущен именно в это время, инструкции geoip_proxy не будут работать.

Правильный способ - установить диапазоны IP CloudFlare в качестве доверенных прокси, используя geoip_proxy директива. Никаких дополнительных модулей не требуется.

На сегодняшний день это приводит к следующему:

geoip_proxy 103.21.244.0/22;
geoip_proxy 103.22.200.0/22;
geoip_proxy 103.31.4.0/22;
geoip_proxy 104.16.0.0/12;
geoip_proxy 108.162.192.0/18;
geoip_proxy 131.0.72.0/22;
geoip_proxy 141.101.64.0/18;
geoip_proxy 162.158.0.0/15;
geoip_proxy 172.64.0.0/13;
geoip_proxy 173.245.48.0/20;
geoip_proxy 188.114.96.0/20;
geoip_proxy 190.93.240.0/20;
geoip_proxy 197.234.240.0/22;
geoip_proxy 198.41.128.0/17;
geoip_proxy 2400:cb00::/32;
geoip_proxy 2405:b500::/32;
geoip_proxy 2606:4700::/32;
geoip_proxy 2803:f800::/32;
geoip_proxy 2c0f:f248::/32;
geoip_proxy 2a06:98c0::/29;

Вы можете найти обновленный список IP-адресов CloudFlare здесь: https://www.cloudflare.com/ips/