For the complete documentation index, see llms.txt. This page is also available as Markdown.

31.6 Linux Jail 中的 GUI

Jail 中的 GUI

本节示例环境为 Windows 10 物理机,在 VirtualBox 中安装了 FreeBSD 13.1 虚拟机。

在 FreeBSD 虚拟机中已部署 4 个 Jail。其中包含一个 FreeBSD Jail,为区别于 VirtualBox 中的 FreeBSD 虚拟机,称其为 freebsd-jail

Windows 10 物理机 → FreeBSD 13.1 虚拟机 → FreeBSD Jail(freebsd-jail)+ debian Jail + Ubuntu Jail + Alpine Jail。

# jls
   JID  IP Address      Hostname                      Path
     1  192.168.5.1     debian                      /usr/jails/debian
     2  192.168.5.2     ubuntu                    /usr/jails/ubuntu
     3  192.168.5.4     alpine                        /usr/jails/alpine
     4  192.168.5.5     freebsd-jail                  /usr/jails/freebsd-jail

目录结构:

/usr/jails/
├── debian/          # JID 1, IP 192.168.5.1
├── ubuntu/          # JID 2, IP 192.168.5.2
├── alpine/          # JID 3, IP 192.168.5.4
└── freebsd-jail/    # JID 4, IP 192.168.5.5

在 4 个 Jail 中分别安装 xclock、Firefox、Chrome 和 jwm,其中 jwm 用于界面管理。Alpine 中 VNC 方法未能调试成功,Firefox 和 Chrome 也未能运行,但 xclock、xterm 等可正常运行。

技巧

无需安装 xorg。

在 Ubuntu 22.04 中,Firefox 默认以 snap 包形式分发,snap 依赖 systemd,无法在 Jail 中使用,因此需使用 deb 包安装。Chrome 在 Ubuntu 中仅提供 deb 包,不依赖 snap,可直接安装。方法如下:

带 X Server 的终端

使用 MobaXterm。MobaXterm 采用默认配置,无需额外配置。

配置 MobaXterm

确保 X server 已经启用,记录 DISPLAY 值,格式是 hostname:displaynumber.screennumber,这里是 192.168.56.1:0.0

登录 Jail(登录方式不限、用户不限):

运行 xclock

在 Windows 10 桌面上显示 4 个独立的 xclock,均可正常运行。

内嵌 X Server

Xnest/Xephyr 是嵌套式 X Server 技术,对 X11 应用而言是 X Server,对宿主 X Server 而言是 X Client,这种嵌套结构可在一个 X 窗口中运行另一个完整的 X 会话。

Xnest/Xephyr 嵌套 X Server 架构:

X Server 架构

在 FreeBSD 虚拟机里安装 Xnest 或 Xephyr。选择其中一种即可:

或:

在 FreeBSD 中启用:

参数说明:

  • :1DISPLAY 值中的 displaynumber。FreeBSD 系统 IP 为 10.0.2.15,故完整的 DISPLAY 值为 10.0.2.15:1.0。因为 FreeBSD 系统 X Server 的 displaynumber 值为 0,故从 1 开始。

  • -listen tcp 监听 TCP 端口。

在 Jail 中,使用与前述相同的方法:

四个 Jail 可以同时在 FreeBSD 开启的一个 Xnest/Xephyr 窗口中打开 xclock。但此时没有窗口管理器,xclock 缺少窗口装饰和基本交互功能。可在执行 xclock 前先执行 jwm,如下:

jwm 执行一次即可,无需在每个 Jail 中分别执行。此处使用 jwm 是因为其轻量级,Xfce 等桌面环境也可使用,可根据需要选用。

共享主机 socket 方式

先在 FreeBSD 系统上执行:

警告

xhost + 将关闭访问控制,存在安全风险。更安全的方式是指定允许访问的 IP 地址。

随后在 Jail 的 fstab 文件中加入下面内容,以 ubuntu Jail 的 fstab 为例,其他 Jail 参照修改即可:

必要时先 mkdir -p /usr/jails/ubuntu/tmp/.X11-unix,确保有挂载点。

重启 Jail 后,在 Jail 中执行:

前文提到 fstab 文件中有下面这样一行:

该写法将 FreeBSD 的 /tmp 目录暴露给 Jail 并且可读写,破坏隔离性,因此予以注释。而仅挂载 /tmp/.X11-unix 可显著提高安全性。

X Server TCP 监听加 xhost 连接管理

此处使用 SDDM 桌面管理器,如果使用其他桌面管理器,请参考相应文档,原理相同。

在 FreeBSD 内编辑或新建 /usr/local/etc/sddm.conf 文件,修改 ServerArguments 内容如下:

重启后,在 FreeBSD 上用以下方式加入 Jail IP 以允许访问:

这种方式比 xhost + 更安全,仅允许指定 IP 访问。

随后在 Jail 中,执行:

DISPLAY 设为 :0.0127.0.0.1:0.010.0.2.15:0.0 均可正常使用,上述几种方法均可尝试。

VNC

在 Debian Jail 中安装 VNC 服务器,可使用 tightvncserver。以 Debian Jail 为例,在 Jail 中执行:

vncserver 的端口号为 5900 加上冒号后的数字,此处为 5900,:1 端口号为 5901,以此类推。

使用 VNC 客户端登录 Jail:

VNC 登录
VNC 登录
VNC 登录

附录与补遗

TCP 监听默认关闭的原因之一是宿主机 X Server 通过 TCP 监听配合 xhost 连接管理的方式安全性较差。

共享宿主机 Socket 的方式,需注意仅挂载 /tmp/.X11-unix 而非整个 /tmp,并使用 xhost +指定 IP 而非 xhost +;满足这两点即可保障安全性。

带 X Server 的终端、共享主机 Socket、VNC 这三种方式值得推荐。无论采用哪种方式,Linux Jail 中的兼容性均存在一定限制,并非所有 X 应用都能运行;相比之下,FreeBSD Jail 的兼容性则更好。

除共享宿主机 Socket 的方法外,其余方法同样可在非 Jail 环境中使用。

参考文献

最后更新于