内网穿透 + Minecraft 局域网联机:一次 frp 部署记录
朋友从公网连进了我的本机 MC 世界——链路是通的,坑却踩在了最意想不到的地方。
目标:让朋友通过公网 IP 连进我在本机开的 Minecraft 局域网世界。
工具:frp(frps 部署在自己的 VPS 上,frpc 跑在本地 Windows)。
结果:链路跑通,本机双开验证成功,但发现 VPS 在海外导致延迟偏高,留待后续换国内服务器优化。
一、需求背景
想和朋友远程联机玩 MC,但不想租用现成的联机服务器(比如蓝盾、SakuraFrp 之类的第三方),于是决定自己动手:用 frp 做内网穿透,把本机 MC 的局域网端口映射到自己的 VPS 公网端口上。
核心链路是这样的:
朋友 / 第二台设备
│
↓
VPS 公网 IP:27891 ← frps(自己的 VPS)
│
↓ frp 隧道
frpc(本地 Windows)
│
↓
127.0.0.1:25565 ← Minecraft 局域网世界
二、环境
| 角色 | 位置 | 说明 |
|---|---|---|
| frps(服务端) | 自己的 VPS | Ubuntu,systemd 管理,frp 0.71.0 |
| frpc(客户端) | 本地 Windows | D:\frp\frpc.exe |
| MC 服务 | 本地 Windows | 游戏内「对局域网开放」,监听 25565 |
注:我的 VPS 在新加坡,这是后面延迟高的根源,这是真没办法了我说。
三、服务端部署(frps)
在 VPS 上安装 frp,配置 frps.toml:
# /etc/frp/frps.toml
bindPort = 7000 # frpc 连接 frps 用的端口
auth.token = "<你的token>" # 认证 token,两端必须一致
注册成 systemd 服务并启动:
sudo systemctl enable frps
sudo systemctl start frps
sudo systemctl status frps # 确认 active (running)
⚠️ 重要提醒:VPS 的云厂商控制面板里一般还有一层安全组 / 防火墙,除了系统内放行,还要在面板里放行
bindPort(7000)和后面要用的映射端口(0721),否则外面连不进来。
四、客户端部署(frpc)
本地 Windows 配置 frpc.toml:
# D:\frp\frpc.toml
serverAddr = "<你的VPS公网IP>"
serverPort = 7000
auth.token = "<你的token>" # 与 frps 一致
[[proxies]]
name = "mc" # 隧道名称,自定义
type = "tcp"
localIP = "127.0.0.1" # 本机 MC 监听地址
localPort = 25565 # 本机 MC 端口
remotePort = 0721 # 映射到公网的端口
启动:
D:\frp\frpc -c D:\frp\frpc.toml
看到 [mc] start proxy success 就说明隧道建立了。此时 frps 侧日志会显示:
[mc] tcp proxy listen port [0721]
new proxy [mc] type [tcp] success
五、踩坑记录(重点)
这段才是本文真正有价值的部分——一开始死活连不上,排查了半天,最后发现跟网络完全无关。
坑 1:以为「对局域网开放」端口是固定的
原版 MC 游戏里点「对局域网开放」,端口是随机分配的(聊天栏会显示「已在端口 XXXX 上开放」),并不能直接指定成 25565。
我这次实际显示的是 25565,用 netstat -ano | findstr 25565 也确认了监听存在:
TCP 0.0.0.0:25565 0.0.0.0:0 LISTENING 22844
但如果你遇到端口随机的情况,要么记下聊天栏显示的那个随机端口去改 frpc 配置,要么用 LAN Server Properties 之类的模组把端口固定下来。
坑 2:本机连自己的公网 IP(NAT 回环)
一开始我从本机去连 公网IP:27891,担心会遇到 NAT 回环(hairpin NAT)——内网设备访问自己的公网地址,数据包要「出网再绕回来」,很多路由器不支持,导致连不上。
这个坑其实没踩到,实测这条路是通的(后来证明 VPS 是独立公网 IP,回环没问题)。但排查时它很干扰判断,值得记一笔:测试穿透是否成功,最好用另一条网络(比如手机热点)来连,而不是从本机连自己的公网 IP。
坑 3(真正的关键):同名账号冲突,报「该名称已被占用」
这是最终真相。
我在本机开了两个 MC 实例来测试:A 开房间,B 用 公网IP:27891 连。结果 B 报 「该名称已被占用」(英文版 That name is already taken)。
这个报错恰恰说明——链路已经通了!数据包成功穿过了 frp 到达 MC A,MC A 也响应了,只是因为它发现「有个同名玩家已经在线」,把 B 踢掉了。
原因:两个实例登录的是同一个账号,玩家名和 UUID 完全相同,MC 服务端不允许同名玩家同时在线。
解决办法:给第二个实例换个名字。用第三方启动器(PCL2 / HMCL / BakaXL)以离线模式登录,用户名填个不同的(比如
xxx2),再连就进去了。「对局域网开放」的世界默认不验证正版,离线改名实例可以直接进。
复盘一下:这个坑的迷惑性在于,它看起来像「连不上」,其实是「连上了但被拒」。排查时如果只盯着网络层(端口、防火墙、回环),会一直找不到原因。
六、验证结果
✅ frpc 日志出现
start proxy success,frps 日志出现listen port [27891]
✅ 本机双开,第二个实例换名后成功连入
✅ 整条链路公网IP:27891 → frps → frpc → 127.0.0.1:25565打通
七、遗留问题:延迟
当前 VPS 在新加坡,国内连过去物理距离远,MC 这种实时游戏对延迟很敏感,所以玩起来偏卡。
后续计划:换一台国内服务器(同省 / 同运营商最佳),延迟能压到十几毫秒。需要注意:
- 国内服务器开公网端口,正规途径需要备案;
- 安全组记得放行 7000 和 27891;
- 原版 MC 局域网是 TCP,目前用
type = "tcp"就够,不必折腾 UDP。
八、总结
- frp 部署本身不难,难的是排查方向——这次真正的障碍是 MC 的账号同名机制,而不是网络。
- 报错要看本质:「该名称已被占用」= 连上了但被同名检测拒绝,别把它当成网络不通。
- 测试穿透用独立网络(手机热点)最可靠,别只在本机自连自测。
- 海外 VPS 做游戏联机延迟是硬伤,真要玩还是得上国内服务器。
希望这篇记录能帮你少走弯路。但最近我们学校企业微信说学校算力平台少用 frp ,向日葵远程这些,不然容易被攻击😅,不过目前那个算力平台我用得不算太多啊,不过后面等我把ai生图从本地部署转移到服务器上去的时候,估计就可以美美出图了😋
有一说一我觉得这个真挺有用的,尤其是我们宿舍现在已经所有人都在玩mc了😋
——鱼小鳄Sugary
——2026年9月10日
💬 评论 (0)