自己开一个 Minecraft 服务器邀请朋友联机,最常见的一个需求就是“离线可进”。这意味着朋友不一定都购买了正版 Minecraft,或者客户端启动器没有登录正版账号,而服务器也不用向 Mojang 的鉴权服务器验证玩家身份。本文以题目给出的 1.21.11 版本为例,完整演示如何从零搭建一个 Minecraft Java 版服务器,开启离线模式,并把服务器地址配置成类似 happydog.ltd 的域名,让朋友通过域名直接进入。整个过程会覆盖服务端下载、Java 环境准备、server.properties 配置、防火墙和端口映射、连接验证、日志解读、常见错误排查,以及上线前必须做好的安全和管理工作。
如果你已经有了一台 Linux 服务器,甚至只是手上有一台能长时间运行的旧电脑,照这篇文章操作,大约 20 分钟就能跑起一个能在外网访问的 Minecraft 联机服。
1. 先理解 Minecraft 服务器和离线模式
1.1 服务端是什么,Vanilla、Paper、Spigot 怎么选
Minecraft Java 版的服务端本质上是一个 Java 程序。官方发布的服务端 jar 包叫做 Vanilla Server,它只包含原版玩法,没有插件接口,启动后生成世界,然后等待玩家连接。对于只想让几个朋友进同一个世界,Vanilla 已经足够。
社区服务端如 Spigot、Paper 则是基于官方服务端修改而成,主要增加插件系统、性能和稳定性优化。Paper 是当前社区比较推荐的选择,适合后面想加领地、登录、经济等插件的场景。但如果只是想开一个纯原版生存服,Vanilla 更简单,出问题更容易定位。
表:常见服务端对比
| 服务端类型 | 插件支持 | 性能 | 配置复杂度 | 适用场景 |
|---|---|---|---|---|
| Vanilla 官方版 | 不支持 | 一般 | 最低 | 原版纯净联机 |
| Spigot | 支持 | 比 Vanilla 好一些 | 中等 | 需要基础插件 |
| Paper | 支持 | 相对较好 | 中等 | 综合性能与扩展 |
| Fabric / Forge | 支持模组 | 视模组而定 | 较高 | 模组服 |
选择服务端时,版本号必须与玩家客户端版本一致。同一个服务器不可能同时让 1.21.11 和 1.21.1 的客户端直接进入,除非客户端兼容性允许,但通常不建议跨小版本联机。所以先确认大家统一使用 1.21.11。
1.2 正版模式与离线模式的本质区别
Minecraft Java 版默认服务器配置里有一个参数叫online-mode。它控制服务器是否向 Mojang 会话服务器验证玩家身份。
- 当
online-mode=true时,服务器收到玩家的登录请求后,会拿着玩家的用户名和令牌去请求 Mojang 的 API。验证通过才允许进入。这个模式下,玩家的 UUID 由正版账号体系决定。 - 当
online-mode=false时,服务器不验证玩家身份。客户端只要提供任意用户名,就能直接进入。所以“离线可进”本质上就是开启了离线模式。
通俗地说,正版模式是“进门刷身份证”,离线模式是“进门报名字”。离线模式下,服务器无法确认这个玩家是否购买了游戏,也无法阻止别人冒充另一个玩家。因此,离线模式只建议用在朋友联机、局域网、测试环境,不推荐用于公开生产环境。
1.3 离线模式的安全风险和适用场景
离线服务器最大的问题是“无认证”。任何知道你服务器地址的人,都可以用你的好友 ID 进入服务器,然后拿走好友背包里的物品,或者破坏建筑。所以离线模式必须配合白名单机制,把能进入的玩家限制在一个明确名单里。
另外一个问题是离线 UUID 的稳定性。离线模式下,服务器会根据玩家昵称计算一个 UUID。同一个昵称在同一个服务器上会得到同一个 UUID,但如果玩家改名字,游戏内的进度、背包和家位置就丢了。所以离线服建议要求玩家固定昵称,不要随意改名。
适用场景主要是:
- 几个现实朋友之间联机,不需要外部公开招人。
- 测试插件、测试地图、测试自动化脚本。
- 局域网内游戏,不直接暴露到公网。
不适合的场景是长期公开运营、经营大型社区、涉及充值或虚拟资产服务的服务器。这类场景要么使用正版验证,要么接入成熟的外置登录系统,这些都已经超出本文“离线可进”的范畴。
2. 环境准备和服务端下载
2.1 服务器所需的硬件和操作系统
Minecraft 服务端是内存敏感型程序。世界生成、区块加载、实体计算都会占用大量内存。单人体验和小型联机对 CPU 要求不算高,但内存必须充足。
如果只有 3 到 5 个玩家同时在线,服务器内存建议至少 4 GB,推荐 8 GB。如果打算开 1.21.11 这种较新版本的服务器,内存过小会导致 GC 频繁、卡顿甚至直接 OOM。
操作系统方面,Windows 和 Linux 都可以运行。线上服务器通常使用 Ubuntu Server 或 Debian,因为部署、后台运行和资源控制更稳定。如果你只有 Windows 电脑,也可以跑官方向导,但后面自动重启和持续运行会更麻烦。
表:小型联机服的最低和推荐配置参考
| 项目 | 最低 | 推荐 |
|---|---|---|
| CPU | 2 核 | 4 核 |
| 内存 | 4 GB | 8 GB |
| 磁盘 | 10 GB 可用 | 20 GB 以上 |
| 系统 | Windows 10 / Ubuntu 20.04 | Ubuntu 22.04/24.04 |
| Java | JDK 21 | JDK 21 |
需要注意的是,这里说的是“同时在线”人数。Minecraft 服务端即使在很低的配置下也能启动,但玩家跑图时如果区块加载跟不上,就会出现回弹、方块闪烁和延迟尖刺。
2.2 Java 版本确认
Minecraft 1.20.5 之后,官方服务端要求 Java 21。1.21.11 属于 1.21.x 系列,同样需要 Java 21 或更高版本。如果安装了别的 Java 版本,服务端可能直接报 UnsupportedClassVersionError。
在 Linux 上,用下面命令检查当前 Java 版本:
java -version如果系统里没有 Java,或者版本过低,可以安装 OpenJDK 21:
sudo apt update sudo apt install openjdk-21-jdk-headless安装完成后再次确认:
java -version预期输出类似:
openjdk version "21.0.5" 2024-10-15 OpenJDK Runtime Environment (build 21.0.5+11) OpenJDK 64-Bit Server VM (build 21.0.5+11, mixed mode, sharing)在 Windows 上,建议从官方发行版或 Adoptium 下载 JDK 21,并确保JAVA_HOME环境变量指向正确目录。用java -version能看到 21 开头说明没问题。
注意:不要只看 Java 大版本是 8 或 17。1.21 系列必须用 21,否则启动一定会失败。
2.3 下载 1.21.11 服务端 jar 包
以官方原版服务端为例,打开 Minecraft 游戏官方的下载页面:
https://www.minecraft.net/en-us/download/server这个页面会提供最新的官方服务端下载链接。如果页面直接给的是最新正式版,你需要找到与 1.21.11 对应的下载链接。如果页面没有列出该版本,说明这个版本号可能还处于快照阶段,或者版本号书写有误。实际下载时务必确认文件名或下载链接中的版本号。
在 Linux 服务器上,可以先建一个专用目录:
mkdir -p /opt/mc-server cd /opt/mc-server把下载好的服务端 jar 放到这个目录里,例如server.jar:
ls -lh server.jar预期会看到一个几十 MB 的 jar 文件。这里要注意,你不能把客户端安装包当作服务端来运行。服务端 jar 的 manifest 入口不同,直接运行客户端 jar 会报错。
2.4 编写启动脚本和分配内存
为了每次启动都使用稳定的参数,推荐写一个启动脚本。Linux 下创建start.sh:
#!/bin/bash cd /opt/mc-server java -Xms4G -Xmx4G -jar server.jar nogui-Xms是初始堆内存,-Xmx是最大堆内存。这里都设为 4G,表示服务端最多可以使用 4 GB 内存。如果你给系统分配 8 GB 内存,也可以把这两个值调成 6G 或 8G,但要留出操作系统和其他进程所需的物理内存。
给脚本添加执行权限:
chmod +x start.shWindows 上对应的start.bat可以写:
@echo off cd /d C:\mc-server java -Xms4G -Xmx4G -jar server.jar nogui pause需要注意,nogui参数只对官方服务端有效,它表示不启动图形界面的服务器控制台。在 Linux 下必须加这个参数,否则可能因为没有图形环境而报错。
还有一个强制要求:服务器第一次启动前,必须在目录里存在eula.txt,并且把内容改为eula=true。如果不修改,服务端启动后会输出一串 EULA 提示并立即退出。
启动服务端第一次时可以先执行:
java -Xms4G -Xmx4G -jar server.jar nogui看到服务器提示你阅读 EULA 后退出,再编辑eula.txt:
eula=true修改后重新启动。这一步是合法使用服务端的前提,不要跳过。
3. 配置 server.properties 和离线登录
3.1 server.properties 关键参数
服务端首次正常启动后,会生成server.properties文件。这个文件是服务器的总配置,几乎所有对外可见的行为都由它控制。
以下是几个最核心的参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
server-port | 25565 | 服务端监听端口 |
online-mode | true | 是否开启正版验证 |
max-players | 20 | 最大在线人数 |
motd | A Minecraft Server | 服务器列表显示的介绍信息 |
white-list | false | 是否启用白名单 |
gamemode | survival | 默认游戏模式 |
view-distance | 10 | 服务端发送给玩家的区块范围 |
spawn-protection | 16 | 出生点保护半径 |
difficulty | easy | 游戏难度 |
pvp | true | 是否允许玩家互相攻击 |
对于离线可进的服务器,最重要的参数是online-mode和white-list。
3.2 把 online-mode 改为 false
用编辑器打开server.properties:
nano server.properties找到这一行:
online-mode=true改为:
online-mode=false保存后重启服务端。修改后,服务器登录流程不再请求 Mojang 鉴权服务器。客户端启动器以离线模式启动时,不需要正版 token,直接使用输入的用户名进入游戏。
这里需要解释一下为什么很多教程强调改完online-mode=false之后要立即开白名单。原因是:在线模式下,玩家身份由正版账号保证;离线模式下,任何人都可以冒名顶替。如果你的服务器地址被扫描到,可能几分钟内就会出现陌生玩家进入。因此,开启白名单是离线服务器最基本的安全措施。
3.3 配置白名单和游戏规则
启用白名单有两种方式。
第一种是直接在server.properties里启用:
white-list=true第二种是在服务端控制台输入:
whitelist on对于离线服务器,推荐直接改配置文件并配合名单文件。先把想邀请的玩家昵称加入白名单:
whitelist add Alice whitelist add Bob也可以直接编辑whitelist.json。白名单文件的结构类似:
[ { "uuid": "00000000-0000-0000-0000-000000000000", "name": "Alice" } ]不过自己不生成 UUID 就可以用游戏内命令添加,没必要手写 JSON。
白名单开启后,不在名单里的玩家连接时会得到类似 “You are not whitelisted on this server” 的提示。
推荐的初始server.properties片段如下:
online-mode=false white-list=true server-port=25565 max-players=10 motd=Hi friends, this is a private server view-distance=8 spawn-protection=0 gamemode=survival difficulty=normal把spawn-protection设为 0 是为了避免出生点附近无法破坏方块。如果服务器只有朋友几个人,可以通过op命令给信任的人管理员权限:
op Alice在离线模式下,op命令要把玩家昵称写准确,不能有大小写偏差,否则权限会落到错误的人身上。
3.4 首次启动生成世界和验证配置
修改完配置后,重新启动服务端:
./start.sh服务端启动过程中会生成world、world_nether、world_the_end三个世界目录。看到类似下面的输出说明启动成功:
[Server thread/INFO]: Preparing level "world" [Server thread/INFO]: Preparing spawn area: 0% ... [Server thread/INFO]: Done (10.462s)! For help, type "help"在服务端控制台输入:
server.properties不会有什么有意义的输出,正确验证方式是用cat查看文件内容,确认online-mode=false和white-list=true都已生效:
grep -E "online-mode|white-list" server.properties预期输出:
online-mode=false white-list=true之后再启动一次服务端,确保修改没有导致启动失败。
4. 放行端口并让朋友连接
4.1 防火墙规则和端口选择
Minecraft Java 版默认使用 TCP 协议 25565 端口。服务器上的操作系统防火墙、云服务商的安全组、家庭路由器的 NAT 都需要放行这个端口。
如果你的服务器是 Ubuntu,使用 UFW 放行:
sudo ufw allow 25565/tcp sudo ufw enable查看当前规则:
sudo ufw status如果使用 CentOS 或者其他发行版,命令可能是:
sudo firewall-cmd --permanent --add-port=25565/tcp sudo firewall-cmd --reload云服务器通常还要在控制台的安全组规则里添加一条“放行 TCP 25565”的入方向规则。很多人在服务器里已经把防火墙关了,但外部仍然无法连接,原因就是云平台安全组没有放行。
4.2 家庭网络需要做路由器端口映射
如果服务端跑在家里,而不是云服务器上,光靠本机防火墙还不够。家庭宽带默认情况下没有把公网 IP 的某个端口转发到内网机器的 25565 端口。
需要登录路由器管理页面。常见路由器管理地址是192.168.1.1或192.168.0.1。在“端口映射”或“虚拟服务器”功能里,添加一条规则:
- 外部端口:25565
- 内部端口:25565
- 内部 IP 地址:运行 Minecraft 服务端的机器局域网 IP,例如 192.168.1.100
- 协议:TCP
保存后,外部流量到达路由器公网 IP 的 25565 端口时,会被转发到你的游戏服务器。
需要注意的是,部分运营商在用户侧分配的是私有 IP,公网 IPv4 并不能直接到达路由器。这种情况需要先打电话问运营商是否能提供公网 IP,或者使用内网穿透工具。
4.3 通过内网穿透或云服务器中转
如果无法做映射到公网,常见方案是使用 frp 这类内网穿透工具,把家里服务端的 25565 端口映射到一台有公网 IP 的云服务器上。
这种方式需要准备一台云服务器作为入口,还需要一个在云服务器上运行的 frps 服务端和一台在家里运行的 frpc 客户端。frps 配置示例:
bindPort = 7000frpc 配置示例:
serverAddr = "你的云服务器公网IP" serverPort = 7000 [[proxies]] name = "minecraft" type = "tcp" localIP = "127.0.0.1" localPort = 25565 remotePort = 25565这时朋友连接的地址就是云服务器的公网 IP,端口仍是 25565。frp 会把流量原样转发到家里的 Minecraft 服务端。
注意:内网穿透只能解决“把端口暴露出来”的问题,不能替代认证和权限控制。离线模式下,白名单仍然是必须的。
4.4 使用域名 happydog.ltd 而不是裸 IP
题目中的服务器地址是 happydog.ltd,这就是一个典型的域名方式。相比让别人记一长串 IP,域名更方便,而且以后服务器换 IP 只需要更新 DNS,不用通知所有人。
假设你已经拥有了 happydog.ltd,并且服务器有公网 IP 或映射后的公网 IP,只需要在 DNS 管理后台添加一条 A 记录:
| 主机记录 | 记录类型 | 记录值 |
|---|---|---|
@ | A | 你的公网 IP |
www | A(可选) | 你的公网 IP |
DNS 配置生效后,在电脑上用ping验证域名能否解析到目标 IP:
ping happydog.ltd得到返回的 IPv4 地址后,玩家在 Minecraft 客户端添加服务器时填写:
happydog.ltd:25565如果服务器端口就是默认的 25565,也可以直接填happydog.ltd。不要填成http://或https://开头,Minecraft 服务器地址只需要域名加端口。
5. 运行验证与日志解读
5.1 服务端正常启动的日志
服务端启动是否正常不能只看进程存在,还要看日志输出。正常情况下,启动到最后会有一行:
[Server thread/INFO]: Done (6.234s)! For help, type "help"看到Done表示世界加载完成,服务器已经进入可连接状态。
服务端控制台会一直保持运行。你可以输入命令,例如:
list查看当前在线玩家,输出类似:
There are 0 of a max of 10 players online:如果已经在线的玩家有 Alice,输出会列出昵称。
5.2 玩家加入时日志长什么样
玩家连接到服务器时,服务端控制台会输出相关日志。离线模式下,登录阶段非常快,不会看到正版验证请求。正常加入日志类似:
[User Authenticator #1/INFO]: UUID of player Alice is 6e7d7e2b-6b7e-4c62-9a87-7a9fe5c... [Server thread/INFO]: Alice joined the gameUUID of player那行说明服务端为这个离线用户计算了 UUID。随后joined the game才表示玩家真正进入世界。
如果玩家离开,会出现:
[Server thread/INFO]: Alice left the game5.3 从玩家客户端验证服务器地址
玩家在 Minecraft 客户端点击“多人游戏”,添加服务器后,服务器列表会出现服务器图标和 MOTD。如果配置正确,延迟数字会显示出来,比如 20ms、45ms。
如果服务器列表一直显示“无法连接”,则要回到网络和防火墙检查。常见流程:
- 先和服务器在同一局域网内的玩家尝试连接,如果局域网内能进,说明服务端正常。
- 再从外网尝试,如果外网无法连接,重点检查防火墙、安全组、端口映射或 frp。
- 用在线端口扫描工具检查 25565 端口是否可达,但要选择合规工具。
5.4 需要留意的错误日志
服务端运行过程中,如果出现下列日志,需要立即处理:
| 日志关键字 | 含义 | 处理方式 |
|---|---|---|
BindException: Address already in use | 端口被占用 | 换端口或关闭占用进程 |
OutOfMemoryError | 内存溢出 | 调大-Xmx或降低view-distance |
Timed out | 网络超时 | 检查防火墙和端口映射 |
Failed to start the minecraft server | 启动失败 | 查看错误详情,通常是端口或 EULA |
这些日志是排查问题的第一线索。建议把服务端控制台输出重定向到日志文件:
./start.sh | tee -a server.log或者直接让 Java 输出日志:
java -Xms4G -Xmx4G -jar server.jar nogui > server.log 2>&1这样即使你关掉终端,日志也不会丢失。
6. 常见问题排查
6.1 玩家连接超时,提示 Connection timed out
现象是玩家在客户端点击服务器后卡住一段时间,然后提示连接超时。
排查顺序:
- 检查服务端是否还在运行,控制台是否有日志。
- 在服务器本机执行
ss -lntp | grep 25565看端口是否处于 LISTEN 状态。 - 在服务器本机用
127.0.0.1:25565连接测试,确认真实服务在运行。 - 检查 Linux 防火墙 UFW 或 firewalld。
- 检查云服务商安全组是否放行 TCP 25565。
- 如果是家庭宽带,确认路由器端口映射是否写了正确的内网 IP,而不是动态变化的 IP。
大多数情况下,外网超时都发生在安全组、防火墙或路由器映射这三层,而不是服务端本身。
6.2 提示 Failed to verify username
这个错误通常出现在玩家使用离线模式连接一个online-mode=true的服务器。或者服务器恰好开启正版验证,但玩家启动器没有登录正版账号。
处理方式:
- 在服务器上执行
grep online-mode server.properties。 - 如果输出是
online-mode=true,而你想支持离线登录,把它改成false。 - 如果输出已经是
false,则检查玩家使用的启动器是否被强制要求走正版登录,尝试切换到离线模式入口。
6.3 登录后秒退并提示 Outdated client / Outdated server
说明客户端版本和服务端版本不一致。比如服务端是 1.21.11,客户端却是 1.21.1,或者反过来。
处理方式:
- 在服务器控制台输入
version查看服务端版本。 - 让所有玩家统一到 1.21.11 版本。
- 如果是启动器多版本环境,要确认游戏实例使用的版本不是旧版本。
6.4 服务端启动时报 Could not create the Java Virtual Machine
这个错误通常不是 Java 版本问题,而是分配的内存过大。例如服务器物理内存只有 4 GB,却设置了-Xmx8G,JVM 无法申请到足够内存。
处理方式:
- 用
free -h查看系统实际可用内存。 - 把
start.sh里的-Xmx调小,例如 2G 或 3G。 - 查看其他 Java 进程是否占用了内存。
6.5 玩家名字或权限错乱
离线模式下,如果两个玩家的昵称相似但大小写不同,服务端可能把玩家视为不同用户。为了避免这个问题,建议所有玩家的昵称统一使用小写,并且不要频繁改名。
另一个常见问题是把op给了错误昵称,导致玩家进服后没有权限。可以先在控制台输入list查看在线玩家的准确昵称,再执行op操作。
7. 生产环境的管理和最佳实践
7.1 用 screen 或 systemd 让服务端后台运行
直接在前台运行start.sh,关闭终端服务端也会随之退出。对于长期运行的服务器,推荐使用 systemd 管理。
在/etc/systemd/system/minecraft.service中写入:
[Unit] Description=Minecraft Server After=network.target [Service] WorkingDirectory=/opt/mc-server ExecStart=/opt/mc-server/start.sh Restart=on-failure RestartSec=10 User=minecraft Group=minecraft NoNewPrivileges=true [Install] WantedBy=multi-user.target启动并设置开机自启:
sudo systemctl daemon-reload sudo systemctl enable minecraft sudo systemctl start minecraft查看日志:
sudo journalctl -u minecraft -f这种方式比直接跑一个终端稳定很多,服务端崩溃后会自动重启。
7.2 离线模式下的命名和认证规范
离线服没有真实的账号体系,因此必须建立自己的规范:
- 所有玩家昵称统一小写字母和数字,避免使用容易混淆的字符。
- 服务器的
white-list必须保持开启。 - 不要给不认识的玩家授予
op或飞行权限。 - 定期查看
whitelist.json和ops.json,确认没有异常新增。
如果你日后希望使用外置登录系统来替代离线模式,这属于更复杂的认证改造,需要引入独立的账号服务。普通朋友联机可以先不涉及。
7.3 自动备份和回滚
世界数据是服务器最宝贵的资产。可以写一个简单备份脚本来定期压缩世界目录。
#!/bin/bash BACKUP_DIR="/opt/mc-backup" WORLD_DIR="/opt/mc-server/world" STAMP=$(date +%Y%m%d-%H%M%S) tar -czf "$BACKUP_DIR/world-$STAMP.tar.gz" "$WORLD_DIR" find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete配合 crontab 每天凌晨执行:
0 3 * * * /opt/mc-backup/backup.sh恢复时只需把备份解压回world目录,并重启服务端。
7.4 性能参数调优
服务端卡顿优先从view-distance调起。调小该值能明显减少区块加载压力。默认 10,小型服务器可调到 6 到 8。同时可以设置:
view-distance=6 simulation-distance=5如果服务器内存较大,可以给 JVM 设置更合理的 GC 参数,例如 G1 收集器:
java -Xms4G -Xmx4G -XX:+UseG1GC -jar server.jar nogui不过,GC 参数的调整效果因人而异,不要盲目抄大内存参数。先保持默认,观察卡顿是否由内存不足引起,再决定调整方向。
7.5 上线前检查清单
| 检查项 | 命令或位置 | 是否完成 |
|---|---|---|
| Java 版本正确 | java -version显示 21 | |
| 服务端版本是 1.21.11 | version命令 | |
| EULA 已接受 | eula.txt中eula=true | |
| online-mode 已改为 false | grep online-mode server.properties | |
| 白名单已开启 | grep white-list server.properties | |
| 防火墙已放行 25565 TCP | sudo ufw status | |
| 云安全组已放行 25565 TCP | 云控制台 | |
| 路由器映射正确 | 内网 IP 和端口检查 | |
| 域名解析成功 | ping happydog.ltd | |
| 服务端可持续运行 | systemd 或 screen | |
| 备份任务已配置 | crontab 检查 |
这张清单适合每次新开服务器或更换主机时对照使用。
7.6 下一步扩展方向
通过离线模式跑通联机只是第一步。真正持续稳定运行还需要补齐几个方向:
- 用 Paper 替换 Vanilla,接入权限、领地、经济等插件。
- 把服务端配置外置化,方便多环境切换。
- 接入日志采集,监控崩溃和连接异常。
- 为玩家提供统一登录入口,比如外置登录系统。
- 定期关注 Minecraft 版本更新,避免长期停留在有已知问题的旧版本。
如果只是几个朋友联机,做到白名单、备份、systemd 自动重启,已经足够可靠。后续每一次改动配置或插件后,都要先备份,再重启,并观察启动日志和玩家反馈。离线服务的“省事”是建立在严格要求之上的:正因为没有正版验证,你才需要更严格的白名单、备份和日志管理。把这一步做到位,服务器才能长期稳定地提供给朋友使用。