Kylaan

Back

记一次校内网 Minecraft 服务器的公网穿透折腾(阿里云 + FRP + Docker)

为何折腾?

我借助学校mc社团的服务器 [AMD Ryzen 9 9950X | Linux-x86_64-with-glibc2.36] 在学校的内网环境里搭建了一个 Minecraft 服务器(使用 MCSM 面板管理,Docker 容器化部署)。在校内大家可以通过内网 IP 直连,延迟极低。但问题来了:放假回家或者校外的朋友想玩怎么办?

起初我的设想极其“简单粗暴”:在阿里云服务器上安装学校的 atrust VPN 客户端,把云服务器伪装成校内机器。但实际操作中发现,在 Linux 命令行环境下运行这种重 GUI 依赖的专有 VPN 软件极其痛苦,且极不稳定。

经过一番研究(和 AI 的激辩),最终选择了更符合行业标准的 FRP (Fast Reverse Proxy) 内网穿透方案。 虽然可能会被网安办请喝茶…

环境

  • 服务端 (Public):阿里云 ECS (Alibaba Cloud Linux),拥有公网 IP,安装了宝塔面板。
  • 客户端 (Intranet):校内服务器,运行在 Docker 容器内的 Minecraft 实例。
  • 目标:通过访问 阿里云IP:25565 -> 自动转发 -> 校内服务器:25565

第一步:服务端配置 (阿里云 frps)

服务端只需要负责“监听”和“转发”。

  1. 下载对应架构的 FRP 包(通常是 linux_amd64),解压得到 frpsfrps.toml
  2. 配置 frps.toml
# frps.toml
bindPort = 7000           # frp 服务端监听端口,等待校内机器连接
auth.token = "[密钥]"  # 鉴权密钥,客户端和服务端必须一致
toml
  1. 部署运行: 为了稳定运行,我使用了宝塔面板的 “Go 项目管理” 功能:
  • 执行文件:选择 frps
  • 参数-c frps.toml
  • 端口7000
  • 开机自启:勾选 ✅
  1. 防火墙放行(关键!): 需要在阿里云控制台的安全组 宝塔面板的安全页面同时放行:
  • 7000 (FRP 通信端口)
  • 25565 (MC 游戏端口)

第二步:客户端配置 (校内 frpc)

在 MCSM 面板的文件管理中,将 frpc 二进制文件和 frpc.toml 上传到服务器根目录(和 server.jar 放在一起)。

配置 frpc.toml

# frpc.toml
serverAddr = "<ali_ip4>"    # 阿里云的公网IP
serverPort = 7000         # 对应 frps 的 bindPort
auth.token = "[密钥]"    # 必须和服务端一致

[[proxies]]
name = "mc-server-main"   # 代理名称,不能重复
type = "tcp"
localIP = "127.0.0.1"     # 因为 frpc 就在容器内部,直接填回环地址
localPort = 25565         # MC 容器内部的端口
remotePort = 25565        # 暴露给公网访问的端口
toml

第三步:踩坑与排查 (Connection Refused)

配置好后,我尝试启动,结果后台报错:

[W] connect to server error: dial tcp 172.17.0.1:7890: connect: connection refused
plaintext

原因分析: 我的校内服务器宿主机上可能挂了 Clash 或其他代理软件,并且设置了系统级的环境变量(http_proxy)。Docker 容器在启动时继承了这些环境变量。导致 frpc 启动时,傻乎乎地去连接 172.17.0.1:7890 这个代理地址,而不是直连阿里云。

解决方法: 在启动命令前,强制清空代理相关的环境变量。


第四步:最终的启动脚本 (run.sh)

这是最终的解决方案。我修改了服务器的启动脚本 run.sh,实现了:

  1. 自动启动 FRP:在开服前后台静默运行穿透服务。
  2. 环境隔离:使用 env -u 或变量置空法清除代理干扰。
  3. JVM 优化:集成了 Fabric/MCDR 所需的 Aikar’s flags 优化参数。
#!/bin/bash

# ===========================
# 1. 启动 FRP 内网穿透模块
# ===========================

# 确保 frpc 有执行权限
chmod +x ./frpc

# 启动 frpc 并挂起在后台
# 关键操作:http_proxy=... 强制清空代理变量,防止连接被宿主机代理拒绝;'&' 放到后台并行运行
echo "正在启动内网穿透..."
http_proxy= https_proxy= all_proxy= ./frpc -c frpc.toml > /dev/null 2>&1 &

# 等待 1 秒确保 frp 进程就绪
sleep 1

# ===========================
# 2. 启动 Minecraft Server (Fabric)
# ===========================

echo "正在启动 Minecraft 服务器..."

# 使用 Aikar's flags 进行 GC 优化
java -server -Xms4G -Xmx8G \
  -XX:+UseG1GC \
  -XX:+ParallelRefProcEnabled \
  -XX:MaxGCPauseMillis=130 \
  -XX:+UnlockExperimentalVMOptions \
  -XX:+DisableExplicitGC \
  -XX:+AlwaysPreTouch \
  -XX:G1NewSizePercent=30 \
  -XX:G1MaxNewSizePercent=40 \
  -XX:G1HeapRegionSize=8M \
  -XX:G1ReservePercent=20 \
  -XX:G1HeapWastePercent=5 \
  -XX:InitiatingHeapOccupancyPercent=15 \
  -XX:SurvivorRatio=32 \
  -XX:MaxTenuringThreshold=1 \
  -XX:+UseStringDeduplication \
  -Dfabric.development=false \
  -Dfile.encoding=UTF-8 \
  -jar fabric-server-launch.jar nogui "$@"
bash

第五步:配置域名解析

解析我的域名 mc.kylaan.top 到阿里云的公网 IP,然后在 Minecraft 客户端直接连接 mc.kylaan.top:<port> (25565端口可省略) 即可。

域名解析配置

  • 主机记录:mc
  • 记录类型:A
  • 记录值:<阿里云公网IP>
  • TTL:默认

效果

配置完成后,在公网使用 mc.kylaan.top阿里云IP:<port> 即可丝滑进入校内服务器,且无需对校内服务器的网络设置做任何系统层面的侵入式修改。后续可选择更多端口给不同实例。

Minecraft 服务器的公网穿透
https://kylaan.top/blog/mc-server/serverfrp
Author Kylaan
Published at 2026年1月15日
Comment seems to stuck. Try to refresh?✨