关于 HTTP 中的 Remote Address 和 proxy_add_x_forwarded_for 问题?

2020-10-18 18:05:23 +08:00
 chinafengzhao
在 HTTP 中,如果没有反向代理和正向代理的情况,我们可以很容易在服务端取到客户端访问者的 IP 地址。

按照 https://imququ.com/post/x-forwarded-for-header-in-http.html 这篇博客中提到。我在自己的公网服务器上部署了一个 nodejs 的 HTTP 应用。用来打印客户端所在的公网 IP 。

我们知道,大部分终端设备上网,都是 NAT 上网,都是动态 IP,我在自己电脑上同时访问我自己公网服务器的 nodejs 应用。以及访问 http://httpbin.org/ip,百度搜索 IP 。

这三个 IP 都不同,有没有网络大神解释一下这个现象啊?
1394 次点击
所在节点    程序员
6 条回复
Mitt
2020-10-18 18:18:11 +08:00
理论上这三个都应该是同一个 ip,确认你本地没有受代理影响,服务器是直连而没有走独立 ip 负载
virusdefender
2020-10-18 21:20:03 +08:00
啥运营商,移动之类的 ip 各种飘很正常
opengps
2020-10-18 22:21:32 +08:00
你自己 web 程序获取的,按理说应该是准的,不过如果跟公网其他工具都不同,可能你用的方式有问题。
x-forward 是转发时候传递的,不经过代理应该就是用户接入公网环节的 IP,不过这个容易有假
访问公网工具查看的,需要确认下对方的方法是不是准确,我网站也有,一般来说是准的
Leigg
2020-10-19 07:39:16 +08:00
后两个一般都是一样的
julyclyde
2020-10-19 10:30:14 +08:00
remote addr 是 TCP 连接的“对方”的 IP 地址
如果对方在 NAT 后面,当然就是 NAT 的出口地址

x-forwarded-for 是一串 HTTP 代理服务器传递的信息

这俩都不是同一个层次的东西
eudore
2020-10-19 11:27:36 +08:00
涉及一个 http 里面的概念端对端跳对跳。

从服务的入口 nginx 开始,到处理后端一般会经过多个反向代理,在每一个反代会将上一个代理或客户端的地址加入 x-forwarded-for 里面,可以看到自己的流量经过了那些节点,第一个一般是客户端真实 ip,有的直接在最外层设置 Real-Ip 这个 header 记录客户端真实 ip 。

而 Remote Address 是 tcp 连接到后端处理者的 tcp ip,通常是最近一跳的 ip 地址,如果经过了多层代理后这个 remoteaddr 是最近代理地址,而不是客户端地址了,服务端获取客户端 ip 一般就先检查 x-forwarded-for 然后才取 remoteaddr 。

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

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

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

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

© 2021 V2EX