
自己开一个 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-modetrue时服务器收到玩家的登录请求后会拿着玩家的用户名和令牌去请求 Mojang 的 API。验证通过才允许进入。这个模式下玩家的 UUID 由正版账号体系决定。当online-modefalse时服务器不验证玩家身份。客户端只要提供任意用户名就能直接进入。所以“离线可进”本质上就是开启了离线模式。通俗地说正版模式是“进门刷身份证”离线模式是“进门报名字”。离线模式下服务器无法确认这个玩家是否购买了游戏也无法阻止别人冒充另一个玩家。因此离线模式只建议用在朋友联机、局域网、测试环境不推荐用于公开生产环境。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 电脑也可以跑官方向导但后面自动重启和持续运行会更麻烦。表小型联机服的最低和推荐配置参考项目最低推荐CPU2 核4 核内存4 GB8 GB磁盘10 GB 可用20 GB 以上系统Windows 10 / Ubuntu 20.04Ubuntu 22.04/24.04JavaJDK 21JDK 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 21sudo 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.511) OpenJDK 64-Bit Server VM (build 21.0.511, 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.jarls -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并且把内容改为eulatrue。如果不修改服务端启动后会输出一串 EULA 提示并立即退出。启动服务端第一次时可以先执行java -Xms4G -Xmx4G -jar server.jar nogui看到服务器提示你阅读 EULA 后退出再编辑eula.txteulatrue修改后重新启动。这一步是合法使用服务端的前提不要跳过。3. 配置 server.properties 和离线登录3.1 server.properties 关键参数服务端首次正常启动后会生成server.properties文件。这个文件是服务器的总配置几乎所有对外可见的行为都由它控制。以下是几个最核心的参数参数默认值说明server-port25565服务端监听端口online-modetrue是否开启正版验证max-players20最大在线人数motdA Minecraft Server服务器列表显示的介绍信息white-listfalse是否启用白名单gamemodesurvival默认游戏模式view-distance10服务端发送给玩家的区块范围spawn-protection16出生点保护半径difficultyeasy游戏难度pvptrue是否允许玩家互相攻击对于离线可进的服务器最重要的参数是online-mode和white-list。3.2 把 online-mode 改为 false用编辑器打开server.propertiesnano server.properties找到这一行online-modetrue改为online-modefalse保存后重启服务端。修改后服务器登录流程不再请求 Mojang 鉴权服务器。客户端启动器以离线模式启动时不需要正版 token直接使用输入的用户名进入游戏。这里需要解释一下为什么很多教程强调改完online-modefalse之后要立即开白名单。原因是在线模式下玩家身份由正版账号保证离线模式下任何人都可以冒名顶替。如果你的服务器地址被扫描到可能几分钟内就会出现陌生玩家进入。因此开启白名单是离线服务器最基本的安全措施。3.3 配置白名单和游戏规则启用白名单有两种方式。第一种是直接在server.properties里启用white-listtrue第二种是在服务端控制台输入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-modefalse white-listtrue server-port25565 max-players10 motdHi friends, this is a private server view-distance8 spawn-protection0 gamemodesurvival difficultynormal把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-modefalse和white-listtrue都已生效grep -E online-mode|white-list server.properties预期输出online-modefalse white-listtrue之后再启动一次服务端确保修改没有导致启动失败。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-port25565/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你的公网 IPwwwA可选你的公网 IPDNS 配置生效后在电脑上用ping验证域名能否解析到目标 IPping 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-distanceTimed out网络超时检查防火墙和端口映射Failed to start the minecraft server启动失败查看错误详情通常是端口或 EULA这些日志是排查问题的第一线索。建议把服务端控制台输出重定向到日志文件./start.sh | tee -a server.log或者直接让 Java 输出日志java -Xms4G -Xmx4G -jar server.jar nogui server.log 21这样即使你关掉终端日志也不会丢失。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-modetrue的服务器。或者服务器恰好开启正版验证但玩家启动器没有登录正版账号。处理方式在服务器上执行grep online-mode server.properties。如果输出是online-modetrue而你想支持离线登录把它改成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却设置了-Xmx8GJVM 无法申请到足够内存。处理方式用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] DescriptionMinecraft Server Afternetwork.target [Service] WorkingDirectory/opt/mc-server ExecStart/opt/mc-server/start.sh Restarton-failure RestartSec10 Userminecraft Groupminecraft NoNewPrivilegestrue [Install] WantedBymulti-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-distance6 simulation-distance5如果服务器内存较大可以给 JVM 设置更合理的 GC 参数例如 G1 收集器java -Xms4G -Xmx4G -XX:UseG1GC -jar server.jar nogui不过GC 参数的调整效果因人而异不要盲目抄大内存参数。先保持默认观察卡顿是否由内存不足引起再决定调整方向。7.5 上线前检查清单检查项命令或位置是否完成Java 版本正确java -version显示 21服务端版本是 1.21.11version命令EULA 已接受eula.txt中eulatrueonline-mode 已改为 falsegrep online-mode server.properties白名单已开启grep white-list server.properties防火墙已放行 25565 TCPsudo ufw status云安全组已放行 25565 TCP云控制台路由器映射正确内网 IP 和端口检查域名解析成功ping happydog.ltd服务端可持续运行systemd 或 screen备份任务已配置crontab 检查这张清单适合每次新开服务器或更换主机时对照使用。7.6 下一步扩展方向通过离线模式跑通联机只是第一步。真正持续稳定运行还需要补齐几个方向用 Paper 替换 Vanilla接入权限、领地、经济等插件。把服务端配置外置化方便多环境切换。接入日志采集监控崩溃和连接异常。为玩家提供统一登录入口比如外置登录系统。定期关注 Minecraft 版本更新避免长期停留在有已知问题的旧版本。如果只是几个朋友联机做到白名单、备份、systemd 自动重启已经足够可靠。后续每一次改动配置或插件后都要先备份再重启并观察启动日志和玩家反馈。离线服务的“省事”是建立在严格要求之上的正因为没有正版验证你才需要更严格的白名单、备份和日志管理。把这一步做到位服务器才能长期稳定地提供给朋友使用。