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

2022-03-24 20:22:45 +08:00
 LeeReamond

现在单节点普遍的部署方式是由 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 ,但是业务很多组件都是按默认大家通用的做法来写的,如果要改业务的话感觉要改的地方有点太多了

1744 次点击
所在节点    问与答
9 条回复
also24
2022-03-24 20:26:25 +08:00
icy37785
2022-03-24 20:29:22 +08:00
这个不是搜索一下就能给你好几个方案的嘛。比如用 ngx_http_realip_module 模块
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
2022-03-24 20:33:26 +08:00
X-Forwarded-For 是由多个代理 ip 组成的, 按逗号分隔, 第一个 ip 就是用户 ip
silverfox
2022-03-24 22:58:39 +08:00
LeeReamond
2022-03-24 23:03:36 +08:00
@also24
@cweijan proxy_set_header 可以设置 header ,但怎么读取其他 header 的值?
LeeReamond
2022-03-24 23:05:30 +08:00
@silverfox 这个方案也可以,看起来是直接替换反代 IP ,但似乎与 cf 服务器绑定了
cweijan
2022-03-24 23:47:29 +08:00
@LeeReamond 反正在 Java 界的话, 用 nginx 通过请求头获取 IP 是共识.
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;
}

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

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

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

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

© 2021 V2EX