FreeBSD Jail 容器中的 Minecraft 服务器

今天——应我儿子的要求——我们来讲讲如何在 FreeBSD Jail 容器中运行 Minecraft 服务器。

这有点像 Linux 上的 Docker/Podman,但安全性更高。

准备工作

首先我们将在 /jail 路径下创建环境,并获取所需的 FreeBSD 基本系统 版本。

今天我们将使用 FreeBSD 14.2-RELEASE 版本。

接下来我们将创建专用的 Minecraft FreeBSD Jail,并为其填充独立的 基本系统 内容。

我们还会复制 /var/run/dmesg.boot,因为 Minecraft 服务器需要使用它。

创建

现在我们将设置基础 FreeBSD Jail 配置。

这些配置将作为所有其他 Jail 的默认值,除非我们重新定义它们。

现在配置我们的 Minecraft Jail。

我们将使用局域网接口 em0 和 IP 地址 10.0.0.210

下面你还会看到宿主机上的规则集 /etc/devfs.rules

现在我们可以启动我们的 Jail 了。

你也可以使用我提供的工具 jmore(8)

为了让 Minecraft Jail 在启动时自动运行,需要在 host 系统的 /etc/rc.conf 文件中添加如下内容:

配置 FreeBSD Jail

现在我们进入 Minecraft Jail。

使用 jmore minecraft c 相当于执行了知名的命令:

示例:

接下来进行一些基本配置,例如设置 DNS 或将 pkg(8) FreeBSD 包管理器切换到 latest 分支:

现在安装其他所需的包,因为 Minecraft 服务器需要通过 FreeBSD Ports 构建:

由于需要通过 FreeBSD Ports 构建 Minecraft 服务器,并且许可需要手动接受(或忽略)(译注:并不需要),因此接下来使用 gitup 工具获取 FreeBSD Ports 树。

make config 阶段选择选项 DAEMON

构建

接下来我们将构建 Minecraft 服务器。

Minecraft 服务器配置

按照 pkg-message 中的建议,我们将在 /etc/fstab 文件中添加额外的虚拟文件系统。

同时,我们还要确保这些文件系统在 Jail 启动时通过 /etc/rc.local 文件被挂载。

我们不会修改 Minecraft Jail 的主 /etc/rc.conf 配置文件来添加所需的 Minecraft 服务器选项。

同时,我们将“接受”EULA,并在 /usr/local/etc/minecraft-server/server.properties 文件中创建基本的 Minecraft 服务器配置。

你也可以在 /usr/local/etc/minecraft-server/java-args.txt 文件中配置额外的 Java 参数。如果默认值对你的情况太小,请自行增大。

启动

现在是时候启动已安装并配置好的 Minecraft 服务器了。

看起来服务器运行正常——但如果不正常,可以使用以下命令进行调试。

连接 Minecraft 客户端

首先 – 确保你的客户端版本与 Minecraft 服务器版本一致 – 我这里是 1.21.4

我的情况是,Minecraft 客户端是在某台随机的 Windows 电脑上启动的,如下所示。

点击 多人游戏 按钮。

然后点击 添加服务器 按钮 – 我们将添加基于 FreeBSD 的 Minecraft 服务器。

输入你喜欢的 Minecraft 服务器名称和 IP 地址。

稍等片刻,我们的基于 FreeBSD 的 Minecraft 服务器将出现在列表中。

现在点击 加入服务器 按钮加入服务器。

我们会看到 正在连接服务器… 的提示。

……片刻之后,我们就成功加入了 Minecraft 服务器。

用户

由于我不是 Minecraft 专家,我花了一些时间才找到在该服务器上定义“管理员”的方法。

幸运的是,我有一个可行的解决方案 🙂:

当我在这里写关于我自己的 jmore(8) 工具时 New jmore(8) FreeBSD Jails List/Manage Tool,我最初把它叫作 jless(8),但有人提醒我这个名字已经被一个处理 JSON 的工具占用了。我们稍后会用到它 🙂。

当有人连接到我们的服务器时,他的 名字uuid 会被添加到 /usr/local/etc/minecraft-server/usercache.json 文件中,如下所示。

bat(1) 命令显示颜色后看起来效果更好。

现在 – 要让这些用户成为“管理员”,我们需要将他们添加到 /usr/local/etc/minecraft-server/ops.json 文件中,并且重启 Minecraft 服务器才能生效。

权限等级 4 是记录中最高的权限等级。

现在我儿子拥有了他需要使用的所有命令,例如 /gamemode/time 🙂。

总结

欢迎随意分享你对个人 Minecraft 服务器其他所需配置的想法。

更新 1 – FreeBSD Jail 与 Linux Podman

我没想到第一句话会成为评论的焦点,因此在这里补充一些细节。我们来讨论一下 FreeBSD Jails 和 Linux Podman 容器在安全性上的差异。

隔离性: 对于无 root Podman 来说,如果启用了 SELinux/AppArmor,它的隔离性似乎与 Jail 在同一水平。但如果没有 SELinux/AppArmor,Jail 提供了更好的隔离性。当你在 Podman 中启用 SELinux/AppArmor 并再添加 MAC 框架(如 mac_sebsd / mac_jail / mac_bsdextended / mac_portacl)时,Jail 的隔离性更高。

内核系统调用暴露面: 即使是无 root Podman,除非通过 seccomp(SELinux)限制,否则仍有“完全”的系统调用访问权限。Jail 对系统调用的使用有限制,不需要额外工具就能实现;在 FreeBSD 上结合 MAC 框架还可以进一步缩小系统调用的可用范围。

防火墙: 你无法在无 root Podman 容器内运行防火墙。而在 VNET Jail 中,你可以运行完整的网络栈和任何防火墙(如 PF 或 IPFW),独立于宿主机运行,这意味着安全性更高。

总结: FreeBSD Jail 通常在默认情况下比 Podman 容器更安全,如果花时间添加额外的安全层,其安全性会更高。

市场存在时间也是一个重要因素。

Jail 自 1999/2000 年引入以来已经投入生产环境,已有 25 年历史,久经考验。Docker 从 2014 年开始流行,时间短约 10 年,但我们要比较的是 Jail 与 Podman。Podman 的无 root 支持首次出现在 2019 年晚期(1.6 版本),因此在市场上的时间不足 6 年。

这意味着 Jail 是所有方案中最经受考验的。

最后更新于

这有帮助吗?