V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
牛客网
chinafengzhao
V2EX  ›  程序员

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

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

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

    这俩都不是同一个层次的东西
    eudore
        6
    eudore   9 天前   ❤️ 1
    涉及一个 http 里面的概念端对端跳对跳。

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

    而 Remote Address 是 tcp 连接到后端处理者的 tcp ip,通常是最近一跳的 ip 地址,如果经过了多层代理后这个 remoteaddr 是最近代理地址,而不是客户端地址了,服务端获取客户端 ip 一般就先检查 x-forwarded-for 然后才取 remoteaddr 。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2932 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 16ms · UTC 13:47 · PVG 21:47 · LAX 06:47 · JFK 09:47
    ♥ Do have faith in what you're doing.