背景
有时候 Minecraft 服主的电脑没有公网 IP,或者家宽、校园网、NAT 环境不方便直接开放端口。这种情况下,可以用一台有公网入口的服务器运行 frps,再让服主本地运行 frpc,把本地游戏端口映射到服务器上。
这篇文章记录一套偏实用的联机穿透方案。示例以 Minecraft Java 版默认端口 25565 为主,但思路也适用于其他基于 TCP 的服务。
感谢开源项目 frp。
准备
需要准备:
- 一台可以被公网访问的服务器,用来运行
frps。 - 服主电脑上的
frpc客户端。 - 一个足够长、随机、不要泄露的
token。 - 服务器安全组、防火墙或 NAT 面板中可用的端口。
本文使用的 frp 版本是 v0.68.1。如果你使用其他版本,配置字段可能需要以对应版本文档为准。
服务端配置
服务端运行的是 frps,主要负责接收客户端连接,并把指定端口暴露给玩家。
下载 frp
先在服务器上下载 Linux amd64 版本:
cd /optwget https://github.com/fatedier/frp/releases/download/v0.68.1/frp_0.68.1_linux_amd64.tar.gztar -zxvf frp_0.68.1_linux_amd64.tar.gzmv frp_0.68.1_linux_amd64 frpcd /opt/frp进入目录后,至少应该能看到:
frpsfrps.toml
配置 frps
编辑服务端配置:
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 的示例:
ufw allow 7000/tcpufw allow 25565/tcpufw reload其中:
7000/tcp给frpc连接frps使用。25565/tcp给玩家连接游戏服务器使用。
如果服务器前面还有云厂商安全组或 NAT 面板,也要同步放行或映射这些端口。
临时启动测试
先手动启动一次,确认配置没有问题:
cd /opt/frp./frps -c ./frps.toml没有报错就说明服务端基本可用。这个窗口关闭后服务也会停止,所以正式使用时建议配置成 systemd 服务。
配置 systemd 服务
新建服务文件:
sudo vim /etc/systemd/system/frps.service写入:
[Unit]Description=frp serverAfter=network.target
[Service]Type=simpleExecStart=/opt/frp/frps -c /opt/frp/frps.tomlRestart=alwaysRestartSec=5
[Install]WantedBy=multi-user.target启动并设置开机自启:
sudo systemctl daemon-reloadsudo systemctl enable frpssudo systemctl start frps查看运行状态:
sudo systemctl status frps如果要看日志,可以使用:
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=服务器域名或者公网IPSERVER_PORT=frpc 连接 frps 的外网端口TOKEN=你的随机长密码LOCAL_PORT=25565REMOTE_PORT=25565PROXY_NAME=mc参数说明:
DOMAIN:服务器域名或公网 IP。SERVER_PORT:frpc连接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:
@echo offchcp 65001 >nultitle 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.exe、config.txt、start.bat 在同一个目录中。
使用流程
服主需要做:
- 解压或准备好
frp-client目录。 - 启动 Minecraft 服务端,确认本地
25565端口可用。 - 检查
config.txt里的服务器地址、端口和 token。 - 运行
start.bat。 - 保持
frpc.exe窗口不要关闭。
玩家需要做:
- 使用服务器域名或公网 IP 连接。
- 端口填写
REMOTE_PORT对应的外部端口。
如果有 NAT 面板或云厂商安全组,玩家最终使用的是映射后的公网端口,不一定是服务器内部的 25565。
多服主配置
如果同一台 frps 要给多个服主使用,需要保证每个客户端的 PROXY_NAME 和 REMOTE_PORT 不同。
服务端也要放宽 allowPorts:
allowPorts = [ { start = 25565, end = 25567 }, { single = 25580 }, { start = 25590, end = 25595 }]对应地,服务器防火墙、安全组和 NAT 面板也要开放这些端口。
客户端可以这样区分:
PROXY_NAME=mc-aREMOTE_PORT=25565PROXY_NAME=mc-bREMOTE_PORT=25566这样玩家连接时就通过不同端口进入不同服主的本地服务。
常见问题
Windows Defender 隔离 frpc
frpc.exe 可能会被 Windows Defender 警告或隔离。需要自行确认来源可信,然后到 Windows 安全中心的“病毒和威胁防护”里查看保护历史记录,并按需允许应用。
如果是给朋友分发客户端,建议说明文件来源、版本和校验方式,不要让对方盲目运行来路不明的可执行文件。
提示代理名已经存在
常见原因有两个:
- 同一个
frps上已经有客户端使用了相同的PROXY_NAME。 - 上一次测试时残留的
frpc进程还没有退出。
处理方式:
- 修改
config.txt里的PROXY_NAME,确保名称唯一。 - 检查任务管理器,关闭残留的
frpc.exe。 - 如果是开发或测试环境,确认旧客户端已经停止。
客户端连不上服务端
可以按这个顺序排查:
- 服务端
frps是否正在运行。 - 服务器是否开放了
bindPort,例如7000/tcp。 config.txt里的DOMAIN是否能解析到正确服务器。SERVER_PORT是否填写了正确的公网端口。- 客户端和服务端的
TOKEN是否完全一致。 - 云厂商安全组、服务器防火墙、NAT 面板是否都放行。
玩家进不来游戏
如果 frpc 已经连上,但玩家进不来,优先检查:
- Minecraft 服务端是否已经启动。
- 服主本地端口是否真的是
25565。 LOCAL_PORT是否和本地游戏端口一致。REMOTE_PORT是否在服务端allowPorts允许范围内。- 玩家连接的是否是公网映射后的端口。
安全注意事项
token不要使用短密码,也不要发到公开聊天或仓库里。- 服务端
allowPorts尽量只开放需要的端口。 - 不要把
frps的管理或服务端口随意暴露给不可信的人。 - 给他人分发
frpc.exe和start.bat前,最好注明来源、版本和用途。 - 如果只是临时联机,用完后可以停止
frpc,不需要一直保持穿透连接。
小结
这套方案的核心是:公网服务器运行 frps,服主本地运行 frpc,玩家连接公网服务器暴露出来的端口。
对 Minecraft 联机来说,最容易出问题的地方通常不是 frp 本身,而是端口映射链路:服务端 bindPort、远端 remotePort、安全组、防火墙、NAT 面板和玩家最终填写的端口必须对应起来。只要把这些关系理清楚,frp 穿透方案就比较稳定。