Minexa说明书
进阶网络与联机

frp 内网穿透:原理、自建与托管平台

没有公网 IP 也能让朋友进来:frp 把手机端口“借”到一台有公网的服务器上;三种配置方式与避坑。

服务器在手机上跑起来了,终端也出现了 Done,你把 192.168.1.23:25565 发给朋友,他那边却一直停在“正在连接”。这不是服务端的问题——你们不在同一个 Wi-Fi,而你家宽带没有公网 IP。

frp 解决的就是这一步:借一台有公网 IP 的机器做“门面”,玩家连它,它再把流量转回你的手机。手机全程只向外发起连接,所以不需要公网 IP,也不用动路由器。家宽普遍是 CGNAT 的今天,这是最通用的方案。

自己租服务器跑 frps,或用 SakuraFrp、ME Frp 这类平台;两条路的入口都是同一个 FRP 卡。

本页要点
  • 一句话原理:手机上的 frpc 主动连出去,公网上的 frps 替它接客。

  • 玩家连的是 frps 的端口,不是手机的端口,这两个数字别搞混。

  • 自建模式只认一整段 frpc.toml,旧教程里的 .ini 写法在这里无效。

  • 同一时间只能跑一条 FRP;隧道只解决“能不能连”,不解决“谁能进”。

frp 到底在做什么#

先分清两个名字,它们和 Minecraft 的“服务端/客户端”不是一回事:

  • frps:跑在公网服务器上的那一半,负责接客。

  • frpc:跑在你手机上的那一半,主动去连 frps。

文本
玩家 ──TCP──> frps(公网服务器 :25565)
                 │  手机先前主动建立的控制连接
                 ▼
              frpc(你的手机)──TCP 127.0.0.1:25565──> Minecraft 服务端

关键在“手机主动连出去”。家里的 NAT 不允许外面随便连进来,但允许你连出去;这条出站连接一旦建立,frps 就能顺着它把玩家的数据送回来。所以家里不用端口映射,CGNAT 也拦不住。

代价是多绕一跳。延迟取决于服务器离你和玩家多远;能带多少人,取决于服务器带宽和你家宽带的上行——上行通常远小于下行,这是长期开服最容易被忽略的瓶颈。

和端口映射、IPv6 有什么不同#

差别在谁来当入口:

方式入口需要什么代价
端口映射你家路由器公网 IPv4暴露家庭 IP,要配路由器
IPv6 直连你家宽带双方都有 IPv6、防火墙放行地址会变,朋友不一定有
frp一台公网服务器服务器 + 引擎 + 配置多绕一跳,受服务器带宽限制

端口映射和 IPv6 是把门直接开到你家,frp 是在外面设一个传达室:不用公网 IP、不用动路由器、还能换服务器;但流量都过它,服务器一停玩家立刻进不来。

开始前:四样东西缺一不可#

  1. 一台有公网 IP 的机器:自己租的 VPS,或 SakuraFrp、ME Frp 这类平台。没有它,frp 无从谈起。

  2. frpc 引擎:可在应用内下载,也可导入 arm64 版 libfrpc.so;没装就点启动会提示引擎未安装。

  3. 一份 FRP 配置:自建要一段完整的 frpc.toml,可以手写,也可直接复制平台下发的成品。

  4. 运行中的服务端:Termux 环境已初始化,终端出现 Done。服务端没起来,玩家连上也无人应答。

自建 frp(配置由你提供)SakuraFrp / ME Frp(令牌)
公网服务器自己的 frps,或平台平台提供
要准备一段 frpc.toml平台账号、令牌、一条隧道
在 Minexa 里填整段 TOML(粘贴或导入)令牌,拉取并选中隧道
适合已有配置,或想完全掌控不想碰 TOML
「自建 frp」不等于必须自己写配置

它指的是配置由你提供:一段完整的 frpc.toml,可以手写,也可以从 SakuraFrp、ME Frp 的隧道详情里复制粘贴或导入。不想碰 TOML 就用平台令牌模式,让应用替你拉取。

自建第一步:让 frps 跑起来#

这一节只针对“自己搭 frps”。用平台生成的 frpc.toml 时,平台已经跑着 frps,跳到下一节。

frps 需要两个对外端口:控制端口接 frpc(默认 7000),以及给玩家连的 remotePort。

TOMLfrps.toml
# 写 127.0.0.1 会导致 frpc 永远连不上
bindAddr = "0.0.0.0"

# 控制端口:frpc 连这里,云服务器安全组要放行 TCP 7000
bindPort = 7000

# 钥匙,frpc 必须用同一串
auth.method = "token"
auth.token = "换成你自己的长随机字符串"
  • bindAddr:一般写 0.0.0.0;写成 127.0.0.1 只有本机能连。

  • bindPort:控制端口,它不是玩家连接的端口,玩家连的是 remotePort。

  • auth.token:用一长串随机字符,不要用 123456,不要跨服务器复用。

  • vhostHTTPPort、vhostHTTPSPort 给网页服务用,MC 用不到,不必配。

启动方式是 ./frps -c frps.toml,再用 ss -lnt | grep 7000 确认端口已经在监听。

放行防火墙这一步别忘:云厂商的安全组和系统自带防火墙是两套东西,都要开——入站 TCP 7000 给 frpc,入站 TCP 25565(或你的 remotePort)给玩家。frps 若配了 allowPorts,remotePort 必须落在允许范围内。

frps 要一直活着

它是常驻进程,不是一个配完就完的文件。SSH 断开、服务器重启、进程被杀,隧道都会立刻失效。用 nohup、screen、tmux 或 systemd 让它常驻,并确认开机自启。

自建第二步:写一份 frpc.toml#

frp 从 v0.52 起把配置从 INI 换成了 TOML,Minexa 的自建模式只认 TOML 全文。

已经有好用的平台隧道、不想手写?直接跳到 从平台复制一份现成的 TOML,那里有逐张截图的四步。

TOMLfrpc.toml
# frps 的公网 IP 或域名,不是你手机的地址
serverAddr = "203.0.113.10"
# frps 的 bindPort
serverPort = 7000
# 必须和 frps 里的 auth.token 完全一致
auth.method = "token"
auth.token = "和服务器上那串一模一样"

[[proxies]]
name = "minexa-java"      # 这条规则的名字,不要重复
type = "tcp"              # Java 用 tcp,基岩用 udp
localIP = "127.0.0.1"     # 和服务端在同一台手机
localPort = 25565         # 服务端真实端口
remotePort = 25565        # 玩家连接 frps 时用的端口

每个字段都可能填错,对照检查:

字段填什么常见错误
serverAddrfrps 的公网 IP 或域名填成手机的局域网 IP
serverPortfrps 的 bindPort填成 remotePort
auth.token与 frps 完全一致多一个空格、换行或引号
[[proxies]]一条转发规则;多条写多段写成 [proxies] 或漏掉
typeJava 填 tcp,基岩填 udpJava 填成了 udp
localIP127.0.0.1填公网 IP 或别的机器
localPort服务端真实端口填成 remotePort 或旧端口
remotePort玩家要连的端口被占用、未放行

remotePort 是“公网那一侧的端口”:想让玩家连 你的服务器:25565 就写 25565;被别的程序占了就换 25566,再让玩家连新端口。另外,旧配置里可能有 autoTLS,新版引擎不认识会报 json: unknown field "autoTLS" 退出;Minexa 写入运行配置前会静默删掉它,不用你手动加。

写完先自测:同一台手机的客户端连 127.0.0.1:25565 能进,说明服务端没问题,再去开隧道。

不想手写:从平台复制一份现成的 TOML#

上面那份 frpc.toml 是手写的。如果你已经在 OpenFrp、SakuraFrp 这类平台建好了隧道,可以直接把平台生成的配置复制过来,一个字都不用改——这也是「自建 frp」最省事的用法:配置由平台生成,你只负责搬运。

以 OpenFrp 为例,整个动作只有四步,全程在浏览器和 Minexa 之间来回切:

  1. 登录平台后台,进「管理隧道」:确认要给 MC 用的那条隧道是 TCP 类型,#18 这类编号和后面的端口记一下。

  2. 点隧道右侧的「操作」:不要点隧道名字,要点卡片最右边那个操作按钮。

  3. 在菜单里选「获取配置文件 / 启动命令」:弹窗默认显示的是命令行,要手动切到「配置文件(TOML)」。

  4. 点右下角「复制」:复制到的是整段 TOML,不是某一项。

OpenFrp 管理隧道页面,操作菜单里高亮「获取配置文件 / 启动命令」
图 1:点隧道卡片右侧的「操作」,在弹出的菜单里选「获取配置文件 / 启动命令」(不是「通过客户端一键启动」)

弹窗打开后先看顶部有两个标签:命令行 和 配置文件(TOML)。新手最容易卡在这里:默认停在「命令行」,粘进 Minexa 会报格式错误。上面那条红色警告是平台对所有人的统一提醒,说配置文件更适合有经验的用户,不影响你复制。

OpenFrp 获取配置弹窗,TOML 内容与右下角复制按钮
图 2:先切到「配置文件(TOML)」标签,确认看到 serverAddr、[[proxies]] 这些行,再点右下角的蓝色「复制」

回到 Minexa:更多 → 网络 → FRP 卡 → 「创建 FRP 配置」,配置名称随便起(例如“自建 frp 配置”),配置类型选 自建 frp,把刚才复制的整段内容粘进中间的大输入框,最后点「保存」。

Minexa 新建 FRP 配置页面,类型选中自建 frp,粘贴框内为 frpc.toml 内容
图 3:类型必须选「自建 frp」;粘贴时从 serverAddr = 开头一直到最后一行,不要带多余的换行或代码块符号

粘贴完别急着关页面,对照下面三处扫一眼,能省掉后面一大半排查:

看哪一行平台下发的值你要做什么
localPort平台建隧道时填的本地端口应该等于你服务端的端口,默认 25565;不一致就改成服务端真实端口
remotePort平台分配的端口,不一定是 25565记下这个数字,玩家的地址是「域名:这个端口」
serverAddr平台节点域名保持原样,不要改成手机 IP

平台面板上的「在线」只代表隧道通了,玩家能不能进还是看服务端有没有 Done。启动后 FRP 卡上会显示公网地址,直接复制发给玩家即可;如果显示「无法显示公网地址,请前往 FRP 平台查看」,就到平台面板抄那条隧道的域名和端口。

换了平台怎么办

ChmlFrp、StarryFrp、OpenFrp 这类平台都能生成 frpc.toml,做法基本一致:找到隧道详情里的「配置文件 / TOML」,复制全文。Minexa 认的是文件内容,不认平台名字。SakuraFrp 和 ME Frp 另有更直接的令牌方式,见 下面那一节。

在 Minexa 里填这份配置#

入口:更多 → 网络 → FRP 卡。

  1. 没有配置时点「创建 FRP 配置」;已有配置时点当前配置那一行,在弹窗里点「创建 FRP 配置」。

  2. 编辑页只有两块:名称与类型 和类型专属内容。名称随便起,重名只提醒不拦截。

  3. 类型选 自建 frp,把整段 TOML 粘进 frpc.toml 配置 输入框,也可导入 .toml 文件。没有单独的“地址/端口/令牌”输入框,这些全在文本里。

  4. 点「保存」,回网络页点「启动 FRP」。

启动时应用会把运行期副本里的 localPort 对齐到服务端真实端口,保存的原文不变,所以 TOML 里写了旧端口也不用慌。但 localIP 指向别的主机、或有多个不同转发端口时它改不了,会提示你手动核对。

成功后 FRP 卡上出现「公网地址」,点复制发给玩家。该地址只在运行中显示,停止后地址立即失效,别存下来反复发。显示「无法显示公网地址,请前往 FRP 平台查看公网地址」时,去平台面板看实际的域名和端口。

地址怎么发给玩家#

  • Java 版:只发 主机:端口,如 frp.example.com:25565,不要带 tcp://、引号或方括号。

  • 基岩版:客户端通常分“地址”和“端口”两栏分别填;只有一栏时才写 主机:端口。

  • remotePort 不是 25565 时,端口必须一起发,否则玩家默认连 25565 然后超时。

  • 不要发 127.0.0.1 或 192.168.x.x,那在朋友那边指他自己的设备。

还有一条硬规则:同一时间只跑一条 FRP。自建、SakuraFrp、ME Frp 共用同一个 frpc 进程,换一条会先停旧的。STUN 和 EasyTier 是独立通道,可与 FRP 同时开。

不想自建:SakuraFrp 与 ME Frp#

平台把 frps 那半边包了:注册账号、建一条隧道,把访问令牌填进 Minexa,应用去拉平台已经生成好的 frpc 配置。

SakuraFrp#

  1. 在 natfrp.com 注册,进用户面板拿到访问令牌。

  2. 新建配置,类型选 SakuraFrp,把令牌粘进「访问令牌(Token)」。

  3. 点「拉取隧道列表」。没有隧道就点「创建隧道」:选节点、填名称、选 TCP 或 UDP、填本地端口(默认服务端端口)。本地地址由应用固定为 127.0.0.1。

  4. 选中一条隧道(前面有在线/离线指示灯),保存,回网络页点「启动 FRP」。

  5. 地址看 FRP 卡,或去平台面板核对。

ME Frp#

  1. 在 mefrp.com 注册,用户中心复制访问令牌。

  2. 先在网站建隧道:类型 TCP、本地地址 127.0.0.1、本地端口填服务端端口。应用里没有创建隧道的入口。

  3. 回 Minexa,新建配置,类型选 ME Frp,粘令牌,点「拉取隧道列表」,选中隧道,保存并启动。

免费平台卡里的 5 家,不是都能直接配

网络页的「免费 FRP 平台」列了 OpenFrp、ChmlFrp、StarryFrp、SakuraFrp、ME Frp 五家,但能填令牌、直接拉取隧道的只有 SakuraFrp 和 ME Frp;另外三家点「打开官网」只是跳转网站。免费额度、限速、并发、是否支持 UDP 都由平台决定,以平台为准。

隧道显示“在线”只说明 frpc 和平台通了。玩家能不能进,还要看服务端在跑、端口对、白名单放行。

基岩版:UDP 能不能走 FRP#

Java 版走 TCP 25565,基岩版走 UDP 19132。frp 本身支持 type = "udp" 的代理,但“frp 支持”不等于“你这条隧道支持”。

  • 自建:再加一段 [[proxies]],type = "udp"、localPort = 19132,frps 和云安全组放行对应 UDP。

  • SakuraFrp:应用内建隧道可选 TCP 或 UDP,但平台和节点是否允许 UDP 以平台为准。

  • ME Frp:隧道在网站建,类型由平台决定。

  • Minexa 不会把 UDP 自动变成 TCP,基岩客户端连 TCP 端口一定失败。

想同时开两个版本就写两条代理,两条的 localPort 不同,自动对齐会提示“有多个不同的转发端口,没法自动对齐”,启动前自己确认两条都对得上服务端。

不要假设“Java 通了基岩就通”

两条协议是分开的。先用基岩客户端实测;如果平台或隧道只给 TCP,基岩版只能换方案——局域网、支持 UDP 的 FRP,或别的通道。见 我该用哪种联机方式。

安全与失败排查#

auth.token 是 frps 的钥匙。拿到 serverAddr 和 token 的人,能在你的服务器上建自己的隧道、占你的带宽,甚至把流量转到别的机器。

  1. token 只留在服务器和你自己手里,不发群里、不截图、不提交到公开仓库。怀疑泄漏就两边同时换掉;平台令牌同理,它代表你的账号额度。

  2. 只映射 MC 端口,不要把 RCON(默认 25575)、FTP(2121)、MCP(8931)、ADB(5555)一起映射出去。

  3. 开白名单、保留正版验证,隧道只解决“能不能连”,不解决“谁能进”。

公网上没有“没人会扫到”这回事

25565 和常见 remotePort 会被自动扫描。没有白名单的离线服,可能几小时内就被陌生人进入、破坏。token 泄漏更糟:你的服务器会变成别人免费的跳板,流量和后果都算在你头上。

现象更像哪一环处理
提示 frpc 引擎未安装引擎应用内下载 frpc,或导入 arm64 版 libfrpc.so
无法连接 frp 服务端连不上 frps核对 serverAddr/serverPort、frps 是否在跑、安全组
认证失败:Token 与服务端不匹配认证两边逐字符核对 token,注意空格和换行
运行中但没有公网地址配置或平台TOML 补 remotePort;平台配置去面板看
玩家连接被拒绝remotePort端口被占或没放行,换端口并同步地址
玩家一直超时转发链服务端是否 Done、localPort 是否对、手机是否休眠
平台隧道显示离线平台侧去平台面板看隧道状态与节点维护
基岩版连不上UDP隧道类型和平台是否真的支持 UDP

排查顺序固定为:服务端有 Done 且本机自连能进 → FRP 状态“运行中” → 公网地址是这次启动后新显示的 → 用流量测 remotePort → 最后才看白名单、正版验证和客户端版本。

上机自查
  • FRP 卡状态是“运行中”,且显示的公网地址是这次启动后新出现的。

  • 玩家拿到的地址里带端口,且没有 tcp:// 前缀。

  • 同一台手机上用 127.0.0.1:端口 能进,证明服务端本身没问题。

  • 关掉 Wi-Fi 用流量能连上公网地址,不是只在局域网内通。

  • 白名单已开启,只有 MC 那一个端口被映射出去。

下一步#

读到这儿了,给你点个赞。如果这页内容帮你解决了问题,说明说明书的方向是对的;如果发现错误、过时信息或看不懂的地方,欢迎到 GitHub Issues 告诉我们。

⚡ 回到极速开服 📖 查术语表