V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeeReamond
V2EX  ›  问与答

Nginx 能否实现将 Cloudflare 代理的 IP 替换为用户 IP?

  •  
  •   LeeReamond · 2022-03-24 20:22:45 +08:00 · 1765 次点击
    这是一个创建于 1004 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在单节点普遍的部署方式是由 Nginx 接入,然后静态资源 nginx 负责,动态内容反代到业务节点。这种情况下业务节点为了读取真实访问 IP 通常的做法是推送 X-forward-for 扩展头。

    但是在接入 cf 代理后,nginx 收到的 X-forward-for 头内存储的信息是 cf 节点的 IP ,而 cf 节点会将用户 ip 再多存在一个 x-cloudflare-userip←类似的这种头里。nginx 有办法实现将后者推到业务的时候自动将 x-cloudflare-userip 的内容替换到 X-forward-for 里吗?

    业务上也可以修改读取头的部位来获取真实 IP ,但是业务很多组件都是按默认大家通用的做法来写的,如果要改业务的话感觉要改的地方有点太多了

    9 条回复    2022-03-25 00:23:57 +08:00
    icy37785
        2
    icy37785  
       2022-03-24 20:29:22 +08:00 via iPhone
    这个不是搜索一下就能给你好几个方案的嘛。比如用 ngx_http_realip_module 模块
    cweijan
        3
    cweijan  
       2022-03-24 20:31:55 +08:00
    可以的, 我前段时间也遇到了这个问题, 查了下资料, 代理网站会将用户真实 ip 放在请求头 proxy_add_x_forwarded_for, 这是一种通用标准
    ```nginx
    location /{
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    ```
    cweijan
        4
    cweijan  
       2022-03-24 20:33:26 +08:00
    X-Forwarded-For 是由多个代理 ip 组成的, 按逗号分隔, 第一个 ip 就是用户 ip
    silverfox
        5
    silverfox  
       2022-03-24 22:58:39 +08:00
    LeeReamond
        6
    LeeReamond  
    OP
       2022-03-24 23:03:36 +08:00
    @also24
    @cweijan proxy_set_header 可以设置 header ,但怎么读取其他 header 的值?
    LeeReamond
        7
    LeeReamond  
    OP
       2022-03-24 23:05:30 +08:00
    @silverfox 这个方案也可以,看起来是直接替换反代 IP ,但似乎与 cf 服务器绑定了
    cweijan
        8
    cweijan  
       2022-03-24 23:47:29 +08:00
    @LeeReamond 反正在 Java 界的话, 用 nginx 通过请求头获取 IP 是共识.
    sixgodf
        9
    sixgodf  
       2022-03-25 00:23:57 +08:00
    浏览器 --> 代理上网 (可能)--> DNS 解析 --> CDN 节点(可能) --> WEB 数据处理 --> 数据吐到浏览器渲染展示,X-Forwarded-For : 用户 IP, 代理服务器 1-IP, 代理服务器 2-IP, 代理服务器 3-IP, ….不管客户端请求经过了层层代理和多重 CDN ,都能得到用户“真实 IP”

    map $http_x_forwarded_for $clientRealIp {
    "" $remote_addr;
    ~^(?P<firstAddr>[0-9\.|:|a-f\.|:|A-F\.|:]+),?.*$ $firstAddr;
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3652 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 10:38 · PVG 18:38 · LAX 02:38 · JFK 05:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.