Logo
概览
使用 frp 搭建 Minecraft 服务器穿透联机方案

使用 frp 搭建 Minecraft 服务器穿透联机方案

2026年5月18日
3 分钟阅读

背景

有时候 Minecraft 服主的电脑没有公网 IP,或者家宽、校园网、NAT 环境不方便直接开放端口。这种情况下,可以用一台有公网入口的服务器运行 frps,再让服主本地运行 frpc,把本地游戏端口映射到服务器上。

这篇文章记录一套偏实用的联机穿透方案。示例以 Minecraft Java 版默认端口 25565 为主,但思路也适用于其他基于 TCP 的服务。

感谢开源项目 frp

准备

需要准备:

  • 一台可以被公网访问的服务器,用来运行 frps
  • 服主电脑上的 frpc 客户端。
  • 一个足够长、随机、不要泄露的 token
  • 服务器安全组、防火墙或 NAT 面板中可用的端口。

本文使用的 frp 版本是 v0.68.1。如果你使用其他版本,配置字段可能需要以对应版本文档为准。

服务端配置

服务端运行的是 frps,主要负责接收客户端连接,并把指定端口暴露给玩家。

下载 frp

先在服务器上下载 Linux amd64 版本:

Terminal window
cd /opt
wget https://github.com/fatedier/frp/releases/download/v0.68.1/frp_0.68.1_linux_amd64.tar.gz
tar -zxvf frp_0.68.1_linux_amd64.tar.gz
mv frp_0.68.1_linux_amd64 frp
cd /opt/frp

进入目录后,至少应该能看到:

  • frps
  • frps.toml

配置 frps

编辑服务端配置:

Terminal window
vim /opt/frp/frps.toml

可以先写成下面这样:

bindPort = 7000
auth.method = "token"
auth.token = "这里换成一串很长的随机密码"
allowPorts = [
{ start = 25565, end = 25565 }
]

几个关键参数:

7000 = frpc 连接 frps 使用的端口
25565 = 玩家连接 Minecraft 服务器使用的端口
token = 服务端和客户端必须一致的认证密码

allowPorts 用来限制客户端只能映射指定端口,避免对方随意占用服务器端口。这里允许映射的端口只有 25565

开放服务器端口

不同服务商的安全组、防火墙和 NAT 面板不完全一样。下面是 ufw 的示例:

Terminal window
ufw allow 7000/tcp
ufw allow 25565/tcp
ufw reload

其中:

  • 7000/tcpfrpc 连接 frps 使用。
  • 25565/tcp 给玩家连接游戏服务器使用。

如果服务器前面还有云厂商安全组或 NAT 面板,也要同步放行或映射这些端口。

临时启动测试

先手动启动一次,确认配置没有问题:

Terminal window
cd /opt/frp
./frps -c ./frps.toml

没有报错就说明服务端基本可用。这个窗口关闭后服务也会停止,所以正式使用时建议配置成 systemd 服务。

配置 systemd 服务

新建服务文件:

Terminal window
sudo vim /etc/systemd/system/frps.service

写入:

[Unit]
Description=frp server
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target

启动并设置开机自启:

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable frps
sudo systemctl start frps

查看运行状态:

Terminal window
sudo systemctl status frps

如果要看日志,可以使用:

Terminal window
journalctl -u frps -f

客户端配置

客户端运行的是 frpc。它负责连接公网服务器上的 frps,并把本机游戏端口转发出去。

准备目录

在服主电脑上准备一个目录,例如 frp-client

frp-client
├─ frpc.exe
├─ frpc.toml
├─ config.txt
└─ start.bat

其中:

  • frpc.exe 是 frp Windows 客户端程序。
  • frpc.toml 可以由 start.bat 自动生成。
  • config.txt 存放域名、端口、token 等配置。
  • start.bat 用来读取配置、解析域名并启动客户端。

编写 config.txt

frp-client/config.txt 中写入:

DOMAIN=服务器域名或者公网IP
SERVER_PORT=frpc 连接 frps 的外网端口
TOKEN=你的随机长密码
LOCAL_PORT=25565
REMOTE_PORT=25565
PROXY_NAME=mc

参数说明:

  • DOMAIN:服务器域名或公网 IP。
  • SERVER_PORTfrpc 连接 frps 的端口,和服务端 bindPort 对应;如果经过 NAT 面板,要填 NAT 映射后的外部端口。
  • TOKEN:和服务端 auth.token 完全一致。
  • LOCAL_PORT:服主电脑本地游戏服务端口,Minecraft Java 默认是 25565
  • REMOTE_PORT:玩家从公网访问时使用的远端端口,也要在服务端 allowPorts 中允许。
  • PROXY_NAME:代理名称,同一个 frps 下必须唯一。

编写 start.bat

下面这个脚本会读取 config.txt,解析域名,然后自动生成 frpc.toml 并启动 frpc.exe

Terminal window
@echo off
chcp 65001 >nul
title frp 联机穿透客户端
echo 正在读取配置...
for /f "tokens=1,2 delims==" %%a in (config.txt) do (
set %%a=%%b
)
echo.
echo 正在解析域名:%DOMAIN%
echo.
for /f "tokens=2 delims=[]" %%i in ('ping -n 1 %DOMAIN% ^| findstr "["') do set SERVER_IP=%%i
if "%SERVER_IP%"=="" (
echo 域名解析失败,正在尝试使用 PowerShell 解析...
for /f %%i in ('powershell -NoProfile -Command "(Resolve-DnsName %DOMAIN% -Type A -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty IPAddress)"') do set SERVER_IP=%%i
)
if "%SERVER_IP%"=="" (
echo.
echo 解析失败:%DOMAIN%
echo 请检查网络、DNS,或者把 config.txt 里的 DOMAIN 改成服务器公网 IP。
echo.
pause
exit /b
)
echo 解析成功:%DOMAIN% = %SERVER_IP%
echo.
echo 正在生成 frpc.toml...
(
echo serverAddr = "%SERVER_IP%"
echo serverPort = %SERVER_PORT%
echo.
echo auth.method = "token"
echo auth.token = "%TOKEN%"
echo.
echo [[proxies]]
echo name = "%PROXY_NAME%"
echo type = "tcp"
echo localIP = "127.0.0.1"
echo localPort = %LOCAL_PORT%
echo remotePort = %REMOTE_PORT%
) > frpc.toml
echo.
echo 正在启动 frp 客户端...
echo 请确认游戏服务端已经启动。
echo.
frpc.exe -c frpc.toml
echo.
echo frp 已退出。
pause

运行前确认 frpc.execonfig.txtstart.bat 在同一个目录中。

使用流程

服主需要做:

  1. 解压或准备好 frp-client 目录。
  2. 启动 Minecraft 服务端,确认本地 25565 端口可用。
  3. 检查 config.txt 里的服务器地址、端口和 token。
  4. 运行 start.bat
  5. 保持 frpc.exe 窗口不要关闭。

玩家需要做:

  1. 使用服务器域名或公网 IP 连接。
  2. 端口填写 REMOTE_PORT 对应的外部端口。

如果有 NAT 面板或云厂商安全组,玩家最终使用的是映射后的公网端口,不一定是服务器内部的 25565

多服主配置

如果同一台 frps 要给多个服主使用,需要保证每个客户端的 PROXY_NAMEREMOTE_PORT 不同。

服务端也要放宽 allowPorts

allowPorts = [
{ start = 25565, end = 25567 },
{ single = 25580 },
{ start = 25590, end = 25595 }
]

对应地,服务器防火墙、安全组和 NAT 面板也要开放这些端口。

客户端可以这样区分:

PROXY_NAME=mc-a
REMOTE_PORT=25565
PROXY_NAME=mc-b
REMOTE_PORT=25566

这样玩家连接时就通过不同端口进入不同服主的本地服务。

常见问题

Windows Defender 隔离 frpc

frpc.exe 可能会被 Windows Defender 警告或隔离。需要自行确认来源可信,然后到 Windows 安全中心的“病毒和威胁防护”里查看保护历史记录,并按需允许应用。

如果是给朋友分发客户端,建议说明文件来源、版本和校验方式,不要让对方盲目运行来路不明的可执行文件。

提示代理名已经存在

常见原因有两个:

  • 同一个 frps 上已经有客户端使用了相同的 PROXY_NAME
  • 上一次测试时残留的 frpc 进程还没有退出。

处理方式:

  1. 修改 config.txt 里的 PROXY_NAME,确保名称唯一。
  2. 检查任务管理器,关闭残留的 frpc.exe
  3. 如果是开发或测试环境,确认旧客户端已经停止。

客户端连不上服务端

可以按这个顺序排查:

  1. 服务端 frps 是否正在运行。
  2. 服务器是否开放了 bindPort,例如 7000/tcp
  3. config.txt 里的 DOMAIN 是否能解析到正确服务器。
  4. SERVER_PORT 是否填写了正确的公网端口。
  5. 客户端和服务端的 TOKEN 是否完全一致。
  6. 云厂商安全组、服务器防火墙、NAT 面板是否都放行。

玩家进不来游戏

如果 frpc 已经连上,但玩家进不来,优先检查:

  • Minecraft 服务端是否已经启动。
  • 服主本地端口是否真的是 25565
  • LOCAL_PORT 是否和本地游戏端口一致。
  • REMOTE_PORT 是否在服务端 allowPorts 允许范围内。
  • 玩家连接的是否是公网映射后的端口。

安全注意事项

  • token 不要使用短密码,也不要发到公开聊天或仓库里。
  • 服务端 allowPorts 尽量只开放需要的端口。
  • 不要把 frps 的管理或服务端口随意暴露给不可信的人。
  • 给他人分发 frpc.exestart.bat 前,最好注明来源、版本和用途。
  • 如果只是临时联机,用完后可以停止 frpc,不需要一直保持穿透连接。

小结

这套方案的核心是:公网服务器运行 frps,服主本地运行 frpc,玩家连接公网服务器暴露出来的端口。

对 Minecraft 联机来说,最容易出问题的地方通常不是 frp 本身,而是端口映射链路:服务端 bindPort、远端 remotePort、安全组、防火墙、NAT 面板和玩家最终填写的端口必须对应起来。只要把这些关系理清楚,frp 穿透方案就比较稳定。