mirror of
https://github.com/fatedier/frp.git
synced 2026-05-15 16:15:49 -06:00
[GH-ISSUE #2529] 让后面的应用程序能获取到真实IP #2010
Labels
No labels
In Progress
WIP
WaitingForInfo
bug
doc
duplicate
easy
enhancement
future
help wanted
invalid
lifecycle/stale
need-issue-template
need-usage-help
no plan
proposal
pull-request
question
todo
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: github-starred/frp#2010
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @huangguiniab on GitHub (Aug 14, 2021).
Original GitHub issue: https://github.com/fatedier/frp/issues/2529
The solution you want
我想让后端的任何应用程序都能获得到真实IP
Alternatives considered
How to implement this function
这只是我的一个想法而已,大佬们觉得有没有可能付诸实现,这个是我从折腾NAT得到的灵感
首先用超级用户来运行frpc,frpc创建一张假网卡。
一个TCP连接传入frps,frps读取到IP来源位置,然后把IP来源和数据打包在一起,传递给frpc,frpc解析数据,从假网卡传入连接到后端应用,后面的应用程序会认为自己暴露在公网下,这样使得任何必须要识别来源IP的应用程序,比如BT下载,网页服务器,游戏服务器都可以通过frp代理。
往回传就给每一个IP都设置一个静态路由,这样操作系统就会把数据包发往假网卡,出口就不需要伪装了,因为怎么伪装出口的IP都变不了。
Application scenarios of this function
说实话,连我自己都觉得这个太过复杂,但是这样可以让任何,应用程序都可以拿到真正的来源IP,应该还会有更简单办法,但是我这个实在太复杂了,大佬们分析一下,有没有可能性
@fatedier commented on GitHub (Aug 16, 2021):
获取到真实IP 是一个非常常见的需求,X-Forward-For 以及 Proxy Protocol 等都是在网关层面解决类似问题的常见的方法。
如果有类似的需求,最好是能够对接这两种方案,这样可以适配更多的网关,而不仅仅是 frp。
@huangguiniab commented on GitHub (Aug 18, 2021):
我觉得您说的挺有道理的,但是您所说的协议也只支持http和h2,我的需求是开minecraft服务器,游戏的协议他原生就不支持这玩意,我的服务器插件都是靠IP地址来识别玩家名字的,现在我使用自建zerotier,因为它可以把IP报文一起给转发掉,但是这要求另外一边也要安装zerotier,这就很不舒服。现在的frp仅仅只是简单的接收tcp包,转发而已,不伪装自己的来源ip,我们的后端程序,他只认"来源IP",您应该能理解我的意思吧
@huangguiniab commented on GitHub (Aug 18, 2021):
您想一想,现在的frp,除了使用http协议那两个获取真正IP的方法,TCP隧道能有什么方法能获取真正ip的办法吗。我不是开发者,我无能为力,但是那些基于TCP的更底层的应用程序,他只认所谓的来源IP,这就是让我很头疼的地方
@fatedier commented on GitHub (Aug 18, 2021):
Proxy Protocol 可以支持 TCP,且是一个很通用的协议。
@fatedier commented on GitHub (Aug 18, 2021):
你前面的想法,可以通过自己实现一个本地的桥接应用,获取 Proxy Protocol 协议内容,之后去转发给你的本地的其他服务。