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

2018-07-28 00:22:13 +08:00
 mostkia

如题,使用 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

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

5227 次点击
所在节点    问与答
8 条回复
billchenchina
2018-07-28 00:38:42 +08:00
这个功能当时是我提出来的,这里做一下解释
为了获取访客的真实 ip,需要进行以下操作

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

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

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

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

不过貌似目前现有的资料都是类似的解决方案,还是希望作者能早日填坑吧。
qingyuan0o0
2019-11-12 16:30:55 +08:00
提交外网获取到的 ip 为表单提交到 server,可行不?

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

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

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

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

© 2021 V2EX