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

遇到个怪事儿即便初始层处理了,多层代理后的 nginx 总是把 cloudflare ip 视作真实 ip

  •  
  •   baskice · 2018-09-05 07:46:14 +08:00 · 1736 次点击
    这是一个创建于 2271 天前的主题,其中的信息可能已经有所发展或是发生改变。
    遇到个非常奇怪的状况,

    我这边有负载均衡的 nginx 一个,后接内容缓存层,然后是和 php 一起逻辑处理层的 nginx。
    最开始这个负载均衡的 nginx 已经设置过 set_real_ip_from 的 cloudflare 全 ip 段。
    我这里可以肯定的是到最后逻辑处理层的 ngxin,输出的 X-Forwarded-For: 是 [真实访客 IP, 127.0.0.1 ] 。这个真实访客 ip 和 CF-Connecting-IP 是一致的。

    尽管最后一层的 nginx 设置了
    set_real_ip_from 127.0.0.1;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    但 php 输出访客 ip 却总是 cloudflare 的 ip。
    唯一能避免的办法是在最后逻辑层的 nginx 上也设置 set_real_ip_from 把 cloudflare 的全部 ip 段都加入。

    我就特别想不明白,最后一层的 nginx 到底是怎么获得 cf 的 ip 的。以及它为什么不把 X-Forwarded-For 排头的用户 ip 认作真实 ip ?
    4 条回复    2018-09-05 10:14:03 +08:00
    miyuki
        1
    miyuki  
       2018-09-05 07:54:32 +08:00 via Android
    可能是出于防止用户故意设置原因

    正常来说,在 php 层都会设置允许使用 X Forwarded For 的可信代理段
    oott123
        2
    oott123  
       2018-09-05 08:40:05 +08:00 via Android
    php 获取 ip 是用哪个字段?不一定是 xff 吧。底下的 nginx 拿的 $remote_addr 是啥?可能是 X-Real-IP 吗?一路上的 nginx 都是怎么配置的?

    信息实在是太少了。
    baskice
        3
    baskice  
    OP
       2018-09-05 08:59:44 +08:00
    @oott123 底下的 nginx 拿的 $remote_addr 是缓存层的内网 ip。
    X-Real-IP 没有设置。

    最外面的 nginx 做 proxy 分流量到缓存层,缓存层什么都不动转给逻辑层这样。

    发现不认 xff 的原因是逻辑层 nginx 的 set_real_ip_from 内网范围写错。导致逻辑层 nginx 完全不信任前面给来的 xff。修正后 xff 已经生效了。

    但是我还是不知道到底是什么地方把 cf 的 ip 传给了最后面。
    oott123
        4
    oott123  
       2018-09-05 10:14:03 +08:00
    但你还是没说 php 是怎么拿 ip 的。REMOTE_ADDR ?还是某个 HTTP 头?
    如果是 REMOTE_ADDR,nginx 是怎么传这个环境变量的?一般而言,是 $remote_addr,但这并不绝对,fcgi 的参数也是可以改的。

    既然你的 PHP 拿到了奇怪的信息,不应该这里开始追查吗? php -> php-fpm -> nginx -> 上游 nginx 这种思路
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2653 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:22 · PVG 19:22 · LAX 03:22 · JFK 06:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.