服务器在手机上跑起来了,终端也出现了 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、不用动路由器、还能换服务器;但流量都过它,服务器一停玩家立刻进不来。
开始前:四样东西缺一不可#
一台有公网 IP 的机器:自己租的 VPS,或 SakuraFrp、ME Frp 这类平台。没有它,frp 无从谈起。
frpc 引擎:可在应用内下载,也可导入 arm64 版
libfrpc.so;没装就点启动会提示引擎未安装。一份 FRP 配置:自建要一段完整的
frpc.toml,可以手写,也可直接复制平台下发的成品。运行中的服务端:Termux 环境已初始化,终端出现
Done。服务端没起来,玩家连上也无人应答。
| 自建 frp(配置由你提供) | SakuraFrp / ME Frp(令牌) | |
|---|---|---|
| 公网服务器 | 自己的 frps,或平台 | 平台提供 |
| 要准备 | 一段 frpc.toml | 平台账号、令牌、一条隧道 |
| 在 Minexa 里填 | 整段 TOML(粘贴或导入) | 令牌,拉取并选中隧道 |
| 适合 | 已有配置,或想完全掌控 | 不想碰 TOML |
它指的是配置由你提供:一段完整的 frpc.toml,可以手写,也可以从 SakuraFrp、ME Frp 的隧道详情里复制粘贴或导入。不想碰 TOML 就用平台令牌模式,让应用替你拉取。
自建第一步:让 frps 跑起来#
这一节只针对“自己搭 frps”。用平台生成的 frpc.toml 时,平台已经跑着 frps,跳到下一节。
frps 需要两个对外端口:控制端口接 frpc(默认 7000),以及给玩家连的 remotePort。
# 写 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 必须落在允许范围内。
它是常驻进程,不是一个配完就完的文件。SSH 断开、服务器重启、进程被杀,隧道都会立刻失效。用 nohup、screen、tmux 或 systemd 让它常驻,并确认开机自启。
自建第二步:写一份 frpc.toml#
frp 从 v0.52 起把配置从 INI 换成了 TOML,Minexa 的自建模式只认 TOML 全文。
已经有好用的平台隧道、不想手写?直接跳到 从平台复制一份现成的 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 时用的端口每个字段都可能填错,对照检查:
| 字段 | 填什么 | 常见错误 |
|---|---|---|
serverAddr | frps 的公网 IP 或域名 | 填成手机的局域网 IP |
serverPort | frps 的 bindPort | 填成 remotePort |
auth.token | 与 frps 完全一致 | 多一个空格、换行或引号 |
[[proxies]] | 一条转发规则;多条写多段 | 写成 [proxies] 或漏掉 |
type | Java 填 tcp,基岩填 udp | Java 填成了 udp |
localIP | 127.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 之间来回切:
登录平台后台,进「管理隧道」:确认要给 MC 用的那条隧道是
TCP类型,#18这类编号和后面的端口记一下。点隧道右侧的「操作」:不要点隧道名字,要点卡片最右边那个操作按钮。
在菜单里选「获取配置文件 / 启动命令」:弹窗默认显示的是命令行,要手动切到「配置文件(TOML)」。
点右下角「复制」:复制到的是整段 TOML,不是某一项。

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

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

serverAddr = 开头一直到最后一行,不要带多余的换行或代码块符号粘贴完别急着关页面,对照下面三处扫一眼,能省掉后面一大半排查:
| 看哪一行 | 平台下发的值 | 你要做什么 |
|---|---|---|
localPort | 平台建隧道时填的本地端口 | 应该等于你服务端的端口,默认 25565;不一致就改成服务端真实端口 |
remotePort | 平台分配的端口,不一定是 25565 | 记下这个数字,玩家的地址是「域名:这个端口」 |
serverAddr | 平台节点域名 | 保持原样,不要改成手机 IP |
平台面板上的「在线」只代表隧道通了,玩家能不能进还是看服务端有没有 Done。启动后 FRP 卡上会显示公网地址,直接复制发给玩家即可;如果显示「无法显示公网地址,请前往 FRP 平台查看」,就到平台面板抄那条隧道的域名和端口。
ChmlFrp、StarryFrp、OpenFrp 这类平台都能生成 frpc.toml,做法基本一致:找到隧道详情里的「配置文件 / TOML」,复制全文。Minexa 认的是文件内容,不认平台名字。SakuraFrp 和 ME Frp 另有更直接的令牌方式,见 下面那一节。
在 Minexa 里填这份配置#
入口:更多 → 网络 → FRP 卡。
没有配置时点「创建 FRP 配置」;已有配置时点当前配置那一行,在弹窗里点「创建 FRP 配置」。
编辑页只有两块:
名称与类型和类型专属内容。名称随便起,重名只提醒不拦截。类型选
自建 frp,把整段 TOML 粘进frpc.toml 配置输入框,也可导入.toml文件。没有单独的“地址/端口/令牌”输入框,这些全在文本里。点「保存」,回网络页点「启动 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#
在 natfrp.com 注册,进用户面板拿到访问令牌。
新建配置,类型选
SakuraFrp,把令牌粘进「访问令牌(Token)」。点「拉取隧道列表」。没有隧道就点「创建隧道」:选节点、填名称、选
TCP或UDP、填本地端口(默认服务端端口)。本地地址由应用固定为127.0.0.1。选中一条隧道(前面有在线/离线指示灯),保存,回网络页点「启动 FRP」。
地址看 FRP 卡,或去平台面板核对。
ME Frp#
在 mefrp.com 注册,用户中心复制访问令牌。
先在网站建隧道:类型 TCP、本地地址
127.0.0.1、本地端口填服务端端口。应用里没有创建隧道的入口。回 Minexa,新建配置,类型选
ME Frp,粘令牌,点「拉取隧道列表」,选中隧道,保存并启动。
网络页的「免费 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 不同,自动对齐会提示“有多个不同的转发端口,没法自动对齐”,启动前自己确认两条都对得上服务端。
两条协议是分开的。先用基岩客户端实测;如果平台或隧道只给 TCP,基岩版只能换方案——局域网、支持 UDP 的 FRP,或别的通道。见 我该用哪种联机方式。
安全与失败排查#
auth.token 是 frps 的钥匙。拿到 serverAddr 和 token 的人,能在你的服务器上建自己的隧道、占你的带宽,甚至把流量转到别的机器。
token 只留在服务器和你自己手里,不发群里、不截图、不提交到公开仓库。怀疑泄漏就两边同时换掉;平台令牌同理,它代表你的账号额度。
只映射 MC 端口,不要把 RCON(默认
25575)、FTP(2121)、MCP(8931)、ADB(5555)一起映射出去。开白名单、保留正版验证,隧道只解决“能不能连”,不解决“谁能进”。
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 那一个端口被映射出去。