跳到主要内容

🎮 Minecraft Java 服务端:PVE 容器部署 + 内网云隧道公网联机

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

架构总览

网络架构图

通道访问方式延迟适用场景
🏠 局域网直连192.168.2.68:25565<1ms家里玩
🌐 公网穿透yourdomain.gz2.neiwangyun.net:2556520-50ms外面玩

一、资源规划

PVE 容器配置

配置项说明
节点xingbox (192.168.2.7)PVE 集群
VMID211容器编号
模板CT122 (Debian12)预装 Docker
IP192.168.2.68静态 IP
CPU2 核MC 单线程为主
内存4096 MBJava 堆 3GB + 系统 1GB
磁盘20 GB系统 + 世界存档

软件版本

软件版本说明
系统Debian 12 (bookworm)轻量稳定
Java21.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)! 表示成功:

MC 服务端控制台


五、后台运行 & 开机自启

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后台守护进程模式
-R25565:127.0.0.1:25565远程端口 25565 → 本地 25565
yourname你的内网云账号
gz2.neiwangyun.net内网云服务器
-p22SSH 端口
--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

七、双通道联机

部署完成后,两种方式都可以连接:

局域网连接(低延迟)

  1. 打开 Minecraft Java 版
  2. 多人游戏 → 添加服务器
  3. 地址填 192.168.2.68:25565
  4. 加入游戏

公网连接(远程)

  1. 确认 nssh 隧道已启动(nssh_client --list
  2. 打开 Minecraft Java 版
  3. 多人游戏 → 添加服务器
  4. 地址填 yourdomain.gz2.neiwangyun.net:25565
  5. 加入游戏

八、服务端配置优化

8.1 server.properties

server-port=25565
max-players=20
gamemode=survival
difficulty=easy
online-mode=true
view-distance=10
simulation-distance=10

8.2 Paper 性能优化

# paper-global.yml
chunks.auto-save-interval: 6000 # 5分钟自动保存
redstone-implementation: ALTERNATE_CURRENT # 红石优化

# 实体限制(防刷怪卡服)
entity-per-chunk-save-limit:
Arrow: 16
Snowball: 8
Fireball: 8

8.3 JVM 参数

java -Xms2048M -Xmx3072M \
-XX:+UseG1GC \
-XX:+ParallelRefProcEnabled \
-XX:MaxGCPauseMillis=200 \
-XX:G1NewSizePercent=30 \
-XX:G1MaxNewSizePercent=40 \
-XX:G1HeapRegionSize=8M \
-jar paper.jar nogui

九、日常维护

操作命令
进入控制台screen -r mc
断开控制台Ctrl+AD
重启服务systemctl restart minecraft
停止服务systemctl stop minecraft
查看日志tail -f /opt/minecraft/logs/latest.log
隧道状态nssh_client --list
重启隧道nssh_client --restart all
PVE 快照PVE API POST /snapshot

资源消耗

状态内存CPU
空闲~1.4GB~0.1 核
5 人在线~2.5GB~0.5 核
10 人在线~3.2GB~1.0 核

十、常见问题

问题解决
UnsupportedClassVersionErrorJava 版本不对,需 Java 21 不是 17
玩家连不上检查 systemctl status minecraft + ss -tlnp | grep 25565
公网延迟高正常现象,nssh 隧道增加 20-50ms
隧道掉线nssh daemon 自动重连,或 nssh_client --restart all
服务器卡顿view-distance(10→6),加 Spark 插件排查
端口被占用换个公网端口,如 25560

📝 本文由 Hermes Agent 生成。部署环境:PVE CT211 (xingbox, 192.168.2.68),Paper 1.21.11 + Java 21 + nssh 隧道。