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

用了阿里云 cdn 后, nginx 下方的服务如何获取真实 ip? 不太懂 nginx 的配置

  •  
  •   find456789 · 2021-08-18 23:58:28 +08:00 · 1573 次点击
    这是一个创建于 1198 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我不太懂 ngxin 的配置,半斤八两,网上搜了一些资料,似乎还是有些迷糊


    我的环境是这样的:

    我用的 Python, 然后外面套了一个 nginx, 然后接入了阿里云的 cdn

    流量是先到 阿里云 cdn, 再到我的 nginx, 最后到我的 Python web 服务


    用了阿里云的 cdn 后, 无法简单快速的 到真实的 ip,

    搜索后发现 在 nginx 里添加 一段配置代码,似乎勉强可以

    proxy_set_header Host $host;   
    proxy_set_header Ali-CDN-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
    

    但是我加了这个代码后, 在客户端的 headers 里,ali-cdn-real-ip 获取的并不是客户端的真实 ip,而是阿里云 cdn 的 ip (每次刷新会变)

    只有 headers 里的 x-forwarded-for 获取的第一个 ip 是客户端真实 ip (没有重新拨号的情况下,刷新也不会改变)


    我想问问,阿里云为什么要搞一个 Ali-CDN-Real-IP, 为什么无法用 x-real-ip 获取到真实 ip 呢

    阿里云是自己搞了一套标准吗? 它为什么不遵守行业标准, 让 x-real-ip 获取的就是客户端的真实 ip 呢?

    我该怎么让 获取真实 ip 这个流程更具有鲁棒性呢?(比如我下次可能换腾讯云的 cdn,或者其他 cdn,是否有一个标准,可以让我更换 cdn 厂家后,我不用改配置文件,也可以获取到 真实的客户端 ip )

    谢谢

    7 条回复    2021-08-19 12:47:59 +08:00
    find456789
        1
    find456789  
    OP
       2021-08-19 00:19:28 +08:00
    搞定了, 删除配置里的
    ```
    proxy_set_header Ali-CDN-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    ```

    header 里默认就有 Ali-CDN-Real-IP , 用 Ali-CDN-Real-IP 就可以获取到真实 ip


    ---

    真不知道,为什么阿里云要搞这么复杂, 而且文档也不好找, 我祝福阿里云能倒闭
    pupboss
        2
    pupboss  
       2021-08-19 01:48:26 +08:00 via iPhone
    从头到尾没觉得阿里云有什么问题。上了 CDN 本来你就拿不到 IP,因为客户没直接访问你
    proxy_add_x_forwarded_for 是可以拿到途经 IPs,但是也可以伪造
    CDN 直接接触客户出口 IP,阿里云用自定义的头给你返回真实 IP,你说他自己实现一套标准祝他倒闭
    那你觉得阿里云是应该覆盖你哪个请求头呢?覆盖了你会不会又说阿里云不遵守行业规则
    pupboss
        3
    pupboss  
       2021-08-19 01:57:05 +08:00 via iPhone   ❤️ 1
    手机回复,忘了一段,x-real-ip 有他自己的作用,他代表的是连接到本机的地址,在你的例子中,他就应该是 CDN 的 IP,这个不可伪造,而且他的定义是在 nginx 上获取连接到你机器的 IP 。阿里云如果覆盖了他才是不合规范
    swulling
        4
    swulling  
       2021-08-19 03:13:37 +08:00 via iPhone
    这几个都是非标准的 http header 。

    其中 forward for 勉强有一个事实标准,所以应该以此为准
    yeqizhang
        5
    yeqizhang  
       2021-08-19 08:45:50 +08:00 via Android
    阿里云可能真的文档不好找吧。但是你如果搞清楚了$remote_addr 是啥就不会去抄那些错误的配置了
    ch2
        6
    ch2  
       2021-08-19 11:46:58 +08:00
    用了 CDN 就只能通过他们私有的请求头获取你想要的信息
    julyclyde
        7
    julyclyde  
       2021-08-19 12:47:59 +08:00
    @pupboss X-系列谈不上规范
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1318 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:55 · PVG 01:55 · LAX 09:55 · JFK 12:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.