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

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

  •  
  •   chinafengzhao · 2020-10-18 18:05:23 +08:00 · 1386 次点击
    这是一个创建于 1285 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 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  
       2020-10-18 18:18:11 +08:00 via iPhone
    理论上这三个都应该是同一个 ip,确认你本地没有受代理影响,服务器是直连而没有走独立 ip 负载
    virusdefender
        2
    virusdefender  
       2020-10-18 21:20:03 +08:00
    啥运营商,移动之类的 ip 各种飘很正常
    opengps
        3
    opengps  
       2020-10-18 22:21:32 +08:00
    你自己 web 程序获取的,按理说应该是准的,不过如果跟公网其他工具都不同,可能你用的方式有问题。
    x-forward 是转发时候传递的,不经过代理应该就是用户接入公网环节的 IP,不过这个容易有假
    访问公网工具查看的,需要确认下对方的方法是不是准确,我网站也有,一般来说是准的
    Leigg
        4
    Leigg  
       2020-10-19 07:39:16 +08:00 via Android
    后两个一般都是一样的
    julyclyde
        5
    julyclyde  
       2020-10-19 10:30:14 +08:00
    remote addr 是 TCP 连接的“对方”的 IP 地址
    如果对方在 NAT 后面,当然就是 NAT 的出口地址

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

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

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

    而 Remote Address 是 tcp 连接到后端处理者的 tcp ip,通常是最近一跳的 ip 地址,如果经过了多层代理后这个 remoteaddr 是最近代理地址,而不是客户端地址了,服务端获取客户端 ip 一般就先检查 x-forwarded-for 然后才取 remoteaddr 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5636 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:34 · PVG 10:34 · LAX 19:34 · JFK 22:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.