You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx技术问题:如何获取真实客户端ISP而非反向代理ISP

反向代理后Nginx无法获取真实客户端ISP的排查与解决建议

问题背景

我有一台基于Nginx的后端Web服务器,部署在反向代理之后。目前已成功获取客户端IP与所属国家,但无法获取客户端ISP信息,仅能看到反向代理的ISP。出于安全需求,我需要获取真实客户端的ISP,推测问题出在后端Nginx配置上,恳请协助排查并提供建议。

部署架构

Client <---> Domain <---> Cloudflare <---> Reverse Proxy <---> Backend Server

Note: Cloudflare is optional. I can remove it if needed.

后端Nginx相关配置

#ISP CONFIGURATION

    server {
        listen 8805;
        root /home/directory1/directory2/isp/;
        location / {
            allow 127.0.0.1;
            deny all;
        }
        location ~ \.php$ {
            limit_req zone=one burst=8;
            try_files $uri =404;
            fastcgi_index index.php;
            fastcgi_pass php;
            include fastcgi_params;
            fastcgi_buffering on;
            fastcgi_buffers 96 32k;
            fastcgi_buffer_size 32k;
            fastcgi_max_temp_file_size 0;
            fastcgi_keep_conn on;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SCRIPT_NAME $fastcgi_script_name;

        }
    }
}

补充说明

已尝试多款反向代理工具,结果一致。了解到同类架构的服务器可实现该功能,因此认为存在可行方案。优先希望得到Caddy或Nginx Proxy Manager的相关建议,对这两款工具更为熟悉,但任何相关帮助均十分感谢。


排查与解决步骤

1. 核心问题定位

你能获取客户端IP和国家,说明反向代理已传递真实IP头(如X-Forwarded-For、CF-Connecting-IP),但ISP信息获取失败的原因是后端服务/模块在查询ISP时,使用了反向代理的IP而非真实客户端IP。

2. 后端Nginx基础配置调整

如果使用ngx_http_geoip2_module等模块获取ISP,需先确保Nginx正确识别真实客户端IP:

  • 在http块中添加以下配置(根据是否使用Cloudflare选择对应规则):

针对Cloudflare场景

# 配置Cloudflare所有IP段(可从官方获取完整列表)
set_real_ip_from 173.245.48.0/20;
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 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;

# 指定从Cloudflare的专属头获取真实IP
real_ip_header CF-Connecting-IP;

针对普通反向代理场景

# 替换为你的反向代理服务器IP/子网
set_real_ip_from 192.168.1.100/32;
# 从X-Forwarded-For头获取真实IP
real_ip_header X-Forwarded-For;
# 当X-Forwarded-For包含多个IP时,取最原始的客户端IP
real_ip_recursive on;

配置完成后,$remote_addr将被替换为真实客户端IP,此时geoip2模块查询ISP时会使用该IP。

3. Caddy配置方案

作为反向代理传递真实IP

your-domain.com {
    reverse_proxy 后端服务器IP:8805 {
        # 传递真实客户端IP到后端
        header_up X-Forwarded-For {remote_host}
        header_up X-Real-IP {remote_host}
    }
}

直接用Caddy获取ISP并传递到后端

需先安装geoip插件,然后配置:

your-domain.com {
    geoip {
        # 替换为你的GeoIP2-ISP数据库路径
        database /usr/share/GeoIP/GeoIP2-ISP.mmdb
        # 将ISP信息通过自定义头传递给后端
        header X-Client-ISP {isp}
    }
    reverse_proxy 后端服务器IP:8805
}

后端PHP可通过$_SERVER['HTTP_X_CLIENT_ISP']直接获取ISP信息。

4. Nginx Proxy Manager(NPM)配置方案

  1. 进入目标代理主机的高级选项卡
  2. 添加以下自定义Nginx配置:
# 若使用Cloudflare,替换为Cloudflare IP段;否则用反向代理IP
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
# ... 补充其他Cloudflare IP段

# Cloudflare场景用CF-Connecting-IP,普通代理用X-Forwarded-For
real_ip_header CF-Connecting-IP;
real_ip_recursive on;
  1. 确保后端Nginx的geoip2模块已正确配置,使用$remote_addr查询ISP数据库。

5. PHP脚本层面的验证与调整

如果ISP信息是通过PHP脚本查询的,需确保脚本使用真实客户端IP:

// 优先获取Cloudflare传递的真实IP,其次是X-Forwarded-For,最后是REMOTE_ADDR
$client_ip = $_SERVER['HTTP_CF_CONNECTING_IP'] ?? 
             ($_SERVER['HTTP_X_FORWARDED_FOR'] ? explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0] : 
             $_SERVER['REMOTE_ADDR']);

// 使用MaxMind GeoIP2库查询ISP
require_once 'vendor/autoload.php';
use MaxMind\Db\Reader;

$reader = new Reader('/usr/share/GeoIP/GeoIP2-ISP.mmdb');
$record = $reader->get($client_ip);
$isp = $record['isp'];
$reader->close();

内容的提问来源于stack exchange,提问作者Ani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:16:09