V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mostkia
V2EX  ›  问与答

FRP 内网穿透,如何获取到访客的真实的 IP 地址?

  •  
  •   mostkia · 2018-07-28 00:22:13 +08:00 · 5192 次点击
    这是一个创建于 2071 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,使用 FRP 内网穿透部署了服务器,使用良好,但最近发现有部分基于 IP 的功能出现了异常。

    排查后发现是 FRP 内网穿透导致的(原因是访客访问域名后,请求会经过 FRP 服务器周转到本地服务器的 127.0.0.1 地址上),导致网站程序获取的 IP 都是内网的 127.0.0.1,因此导致了错误的发生(我使用的是 Nginx 服务器)。

    访问了作者的 github 项目,希望能够找到解决方案,有是有,但写的比较模糊,不太看得懂,连接地址如下: https://github.com/fatedier/frp/blob/master/README_zh.md#%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E7%9C%9F%E5%AE%9E-ip

    请问有没有朋友也碰到过类似的问题?是否有良好的解决方案,谢谢~

    8 条回复    2019-11-12 16:30:55 +08:00
    billchenchina
        1
    billchenchina  
       2018-07-28 00:38:42 +08:00 via Android
    这个功能当时是我提出来的,这里做一下解释
    为了获取访客的真实 ip,需要进行以下操作

    frp 监听随机(自定)端口,用户访问的时候用 nginx 套反代,header 里面加上用户的真实 ip ( X-Forwarded-For )和一个自定的 token。

    在自己的站点获取用户 ip 的时候做出的改动:
    1. 检查 token 是否被设置且是否正确,如果没有被设置说明一定不来自 frp,这时的流量可以看作直接访问的流量,可以忽略掉或者保存真实 ip
    2. 如果 token 正确的话,则信任 header 里面的 X-Forwarded-For,把这个当做用户真实 ip
    t6attack
        2
    t6attack  
       2018-07-28 01:06:37 +08:00
    用 nginx 反向代理做负载均衡后,会遇到类似问题。
    你以关键词 “ nginx 负载均衡 真实 IP ” 搜索。就能搜到相关信息了。
    line
        3
    line  
       2018-07-28 01:38:56 +08:00 via iPhone
    tcp 协议也可以吗?
    shengyu
        4
    shengyu  
       2018-07-28 08:40:43 +08:00 via iPhone
    插个统计服务的 js 吧
    mostkia
        5
    mostkia  
    OP
       2018-07-28 09:30:14 +08:00 via Android
    @shengyu 恩,这也是一个解决的办法。 @line 我这边已经验证了官方的说法,的确只能通过 http 方式获取到 ip,加了 ssl 都不行。tcp 估计是不行的,不知道是不是有方法可以解决。
    mostkia
        6
    mostkia  
    OP
       2018-07-30 13:47:41 +08:00 via Android
    已经解决,但效果可能不太理想,后来恢复回滚到原来的样子了。。有需要的朋友依旧可以参考一下:

    1,frp 端口要事先改为非 80 和 443 以免和 nginx 冲突,比如 8080 端口。

    2,在 frp 前台服务器安装 nginx,然后再 frp 前套一个 nginx 反代,把证书和域名什么的都先绑定到前台服务器上,然后前台服务器全部将流量反代到 frp 的转发端口 127.0.0.1:8080 端口上,这样就能够拿到 ip 了,原理不太懂,但是貌似会降低速度。 @t6attack @billchenchina
    mostkia
        7
    mostkia  
    OP
       2018-07-30 13:56:26 +08:00 via Android
    缺点:
    1,两个 nginx(我内网的 web 服务器也是 nginx),配置
    冗余分散不好管理,而且容易出错。
    2,速度变慢,原因可能和反代有关。
    3,ie 浏览器莫名无法访问,原因未知,比较玄学的一
    个问题,可能下一位尝试者就不会碰到。

    不过貌似目前现有的资料都是类似的解决方案,还是希望作者能早日填坑吧。
    qingyuan0o0
        8
    qingyuan0o0  
       2019-11-12 16:30:55 +08:00
    提交外网获取到的 ip 为表单提交到 server,可行不?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2873 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:03 · PVG 21:03 · LAX 06:03 · JFK 09:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.