🎮 Minecraft Java 服务端:PVE 容器部署 + 内网云隧道公网联机
在 PVE LXC 容器中部署 Minecraft Java 版服务端,通过内网云 nssh 隧道实现公网联机,局域网 + 公网双通道访问。
架构总览

| 通道 | 访问方式 | 延迟 | 适用场景 |
|---|---|---|---|
| 🏠 局域网直连 | 192.168.2.68:25565 | <1ms | 家里玩 |
| 🌐 公网穿透 | yourdomain.gz2.neiwangyun.net:25565 | 20-50ms | 外面玩 |
一、资源规划
PVE 容器配置
| 配置项 | 值 | 说明 |
|---|---|---|
| 节点 | xingbox (192.168.2.7) | PVE 集群 |
| VMID | 211 | 容器编号 |
| 模板 | CT122 (Debian12) | 预装 Docker |
| IP | 192.168.2.68 | 静态 IP |
| CPU | 2 核 | MC 单线程为主 |
| 内存 | 4096 MB | Java 堆 3GB + 系统 1GB |
| 磁盘 | 20 GB | 系统 + 世界存档 |
软件版本
| 软件 | 版本 | 说明 |
|---|---|---|
| 系统 | Debian 12 (bookworm) | 轻量稳定 |
| Java | 21.0.7 (Adoptium Temurin) | Paper 1.21+ 必须 |
| 服务端 | Paper 1.21.11 build 69 | 高性能 MC 服务端 |
| 隧道 | nssh_client v0.15.6 | 内网云穿透客户端 |
二、创建 PVE 容器
2.1 克隆模板
# 克隆 CT122 模板为 CT211
curl -sk -X POST \
-H "Authorization: PVEAPIToken=root@pam!token=secret" \
-d '{"newid":211,"hostname":"mc-java-server","full":1}' \
"https://192.168.2.3:8006/api2/json/nodes/xingbox/lxc/122/clone"
2.2 配置资源
# 设置 CPU、内存、网络
curl -sk -X PUT \
-H "Authorization: PVEAPIToken=root@pam!token=secret" \
-d '{"cores":2,"memory":4096,"net0":"name=eth0,bridge=vmbr0,ip=192.168.2.68/24,gw=192.168.2.1,type=veth"}' \
"https://192.168.2.3:8006/api2/json/nodes/xingbox/lxc/211/config"
2.3 启动并验证
# 启动
curl -sk -X POST \
-H "Authorization: PVEAPIToken=root@pam!token=secret" \
"https://192.168.2.3:8006/api2/json/nodes/xingbox/lxc/211/status/start"
# 验证
ping 192.168.2.68
ssh root@192.168.2.68 "hostname"
# → mc-java-server
三、安装 Java 21
Paper 1.21+ 编译目标是 Java 21(class file version 65.0),Debian 12 仓库只有 Java 17(61.0),直接装会报 UnsupportedClassVersionError。
3.1 配置国内镜像源
ssh root@192.168.2.68
cat > /etc/apt/sources.list << 'EOF'
deb http://mirrors.aliyun.com/debian/ bookworm main contrib non-free non-free-firmware
deb http://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free non-free-firmware
deb http://mirrors.aliyun.com/debian-security bookworm-security main contrib non-free non-free-firmware
EOF
apt-get update
3.2 安装 Adoptium JRE 21
# 下载(建议通过代理或国内镜像)
wget 'https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.7%2B6/OpenJDK21U-jre_x64_linux_hotspot_21.0.7_6.tar.gz' \
-O /tmp/jdk21.tar.gz
# 解压
tar xzf /tmp/jdk21.tar.gz -C /opt/
# 设置默认 Java
update-alternatives --install /usr/bin/java java /opt/jdk-21.0.7+6-jre/bin/java 2100
update-alternatives --set java /opt/jdk-21.0.7+6-jre/bin/java
# 验证
java -version
# → openjdk version "21.0.7" 2025-04-15 LTS
⚠️ 坑点提醒: Debian 12 仓库没有 Java 21,必须手动安装 Adoptium 版本。如果 GitHub 下载慢,可以通过代理
http://192.168.2.40:7890下载后 SCP 到容器。
四、安装 Paper MC
4.1 下载 Paper
mkdir -p /opt/minecraft && cd /opt/minecraft
# 通过 PaperMC API 获取最新版
PAPER_VER=$(curl -s "https://api.papermc.io/v2/projects/paper" | \
python3 -c "import json,sys;print(json.load(sys.stdin)['versions'][-1])")
BUILD=$(curl -s "https://api.papermc.io/v2/projects/paper/versions/$PAPER_VER" | \
python3 -c "import json,sys;print(json.load(sys.stdin)['builds'][-1])")
wget "https://api.papermc.io/v2/projects/paper/versions/$PAPER_VER/builds/$BUILD/downloads/paper-${PAPER_VER}-${BUILD}.jar" \
-O paper.jar
4.2 首次启动
echo 'eula=true' > eula.txt
java -Xms1024M -Xmx3072M -jar paper.jar nogui
首次启动会自动生成配置、创建世界(主世界 + 地狱 + 末地),看到 Done (25.124s)! 表示成功:

五、后台运行 & 开机自启
5.1 Screen 后台运行
# 启动
screen -dmS mc java -Xms2048M -Xmx3072M -jar paper.jar nogui
# 进入控制台
screen -r mc
# 断开(不关闭): Ctrl+A 然后 D
5.2 systemd 自启
cat > /etc/systemd/system/minecraft.service << 'EOF'
[Unit]
Description=Minecraft Paper Server
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/minecraft
ExecStart=/opt/minecraft/start.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable minecraft
systemctl start minecraft
5.3 启动脚本
cat > /opt/minecraft/start.sh << 'EOF'
#!/bin/bash
cd /opt/minecraft
exec java -Xms2048M -Xmx3072M \
-XX:+UseG1GC \
-XX:+ParallelRefProcEnabled \
-XX:MaxGCPauseMillis=200 \
-XX:+UnlockExperimentalVMOptions \
-XX:+DisableExplicitGC \
-XX:+AlwaysPreTouch \
-jar paper.jar nogui
EOF
chmod +x /opt/minecraft/start.sh
六、内网云隧道穿透(公网联机)
这是让公网玩家也能加入的关键步骤。通过内网云 nssh 隧道,将 MC 服务端端口映射到公网。
6.1 下载 nssh 客户端
# nssh 是内网云官方 SSH 反向代理客户端,单文件 6.7MB
# 从 MinIO 下载或从内网云官网获取
chmod +x nssh_client
mv nssh_client /usr/local/bin/nssh_client
6.2 建立隧道
nssh_client --daemon -R 25565:127.0.0.1:25565 yourname@gz2.neiwangyun.net -p 22 --passwd yourpassword
参数说明:
| 参数 | 值 | 说明 |
|---|---|---|
--daemon | — | 后台守护进程模式 |
-R | 25565:127.0.0.1:25565 | 远程端口 25565 → 本地 25565 |
yourname | — | 你的内网云账号 |
gz2.neiwangyun.net | — | 内网云服务器 |
-p | 22 | SSH 端口 |
--passwd | — | 你的 SSH 密码 |
💡 建议用
127.0.0.1— nssh 和 MC 服务端跑在同一台服务器时,127.0.0.1最简单。如果 nssh 在另一台机器上,用目标服务器的局域网 IP 即可。
6.3 验证隧道
# 查看隧道状态
nssh_client --list
# 确认端口监听
ss -tlnp | grep 25565
# → LISTEN 0 511 0.0.0.0:25565
6.4 配置开机自启
# 添加 crontab
(crontab -l 2>/dev/null | grep -v nssh; \
echo "@reboot /usr/local/bin/nssh_client --daemon -R 25565:127.0.0.1:25565 yourname@gz2.neiwangyun.net -p 22 --passwd yourpassword") | crontab -
# 验证
crontab -l
6.5 公网连接
隧道建立后,公网玩家通过以下地址连接:
yourdomain.gz2.neiwangyun.net:25565
访问链路:
公网玩家 → yourdomain.gz2.neiwangyun.net:25565
→ 内网云服务器 gz2 (端口 25565)
→ nssh 隧道转发
→ CT211:25565 (MC Server)
→ 返 回游戏数据
💡 端口冲突: 如果 25565 端口已被其他隧道占用,可以换用其他端口:
nssh_client --daemon -R 25560:127.0.0.1:25565 yourname@gz2.neiwangyun.net -p 22 --passwd yourpassword# 公网连接:yourdomain.gz2.neiwangyun.net:25560
七、双通道联机
部署完成后,两种方式都可以连接:
局域网连接(低延迟)
- 打开 Minecraft Java 版
- 多人游戏 → 添加服务器
- 地址填
192.168.2.68:25565 - 加入游戏
公网连接(远程)
- 确认 nssh 隧道已启动(
nssh_client --list) - 打开 Minecraft Java 版
- 多人游戏 → 添加服务器
- 地址填
yourdomain.gz2.neiwangyun.net:25565 - 加入游戏
八、服务端配置优化
8.1 server.properties
server-port=25565
max-players=20
gamemode=survival
difficulty=easy
online-mode=true
view-distance=10
simulation-distance=10