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

2018-09-05 07:46:14 +08:00
 baskice
遇到个非常奇怪的状况,

我这边有负载均衡的 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 ?
1671 次点击
所在节点    问与答
4 条回复
miyuki
2018-09-05 07:54:32 +08:00
可能是出于防止用户故意设置原因

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

信息实在是太少了。
baskice
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
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 这种思路

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/486218

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX