Comment on page
17.6.使用 ezjail 管理 Jail
创建和管理多个 jail 可能很快会变得繁琐且容易出错。Dirk Engling 开发的 ezjail 自动化软件大大的简化了许多 jail 任务。basejail 被创建为模板。其他 jail 使用 mount_nullfs(8) 来共享许多 basejail 目录,而无需使用多余的磁盘空间。在安装应用程序之前,每个额外的 jail 仅占用几兆字节的磁盘空间。升级 basejail 中用户空间的副本会自动升级所有其他 jail。
ezjail 的安装包括增加一个环回接口以在 jail 安装 ports 或软件包以及启用服务时使用。
1.为了保持 jail 环回流量离开主机的环回网络接口lo0
,通过向 /etc/rc.conf 添加一个条目来创建第二个环回接口:cloned_interfaces="lo1"第二个环回接口lo1
将在系统启动时创建。也可以手动创建它,而无需重启系统:# service netif cloneupCreated clone interfaces: lo1.可以允许 jail 使用这个二级环回接口的别名而不干扰主机。在 jail 内,对环回地址127.0.0.1
的访问被重定向到分配给 jail 的第一个 IP 地址。为了使 jail 的环回地址与新的lo1
接口相对应,在创建新 jail 时,必须首先在接口和 IP 地址列表中指定该接口。在127.0.0.0/8
网块中给每个分配一个 jail 唯一的环回地址。
1.# cd /usr/ports/sysutils/ezjail# make install clean
1.通过将这行添加到 /etc/rc.conf 来启用 ezjail:ezjail_enable="YES"
1.该服务将在系统启动时自动启动。它可以立即为当前会话启动:# service ezjail start
安装 ezjail 后,可以创建和补充 basejail 目录。此步骤仅需要在 jail 主机上执行一次。
在这两个示例中。
-p
让用 portsnap(8) 下载 ports 到 basejail。所有的 jail 都将共享这个 ports 目录的副本。为 jail 使用单独的 ports 目录副本可以将它们与主机隔离。在 ezjailFAQ 中有更详细的解释: http://erdgeist.org/arts/software/ezjail/#FAQ。
1.用 FreeBSD-RELEASE 来建立 jail对于基于与主机相匹配的 FreeBSD RELEASE 的 basejail,使用install
。例如,在一台运行 FreeBSD 13-STABLE 的主机上,最新的 FreeBSD-13 RELEASE 版本将被安装在 jail 中:# ezjail-admin install -p
1.用installworld
建立 jailbasejail 可以用ezjail-admin update
从buildworld
在主机上创建的可执行文件安装。在这个例子中,FreeBSD 10-STABLE 是从源代码构建的。jail 目录被创建。然后执行installworld
,将主机的 /usr/obj 安装到 basejail 中:# ezjail-admin update -i -p默认情况下使用主机的 /usr/src。可以用-s
和路径指定主机上不同的源目录,或者用 /usr/local/etc/ezjail.conf 中的ezjail_sourcetree
设置。
技巧 >basejail ports 由其他 jail 共享。但是,下载的 distfile 存储在它们各自的 jail 中。默认情况下,这些文件存储在每个 jail 内的 /var/ports/distfile 中。在编译 ports 时,每个 jail 中的 /var/ports 也用作工作目录。
技巧默认情况下,使用 FTP 协议下载用于安装 basejail 的软件包。防火墙或代理配置可以阻止或干扰 FTP 传输。HTTP 协议的工作方式不同,可规避这些问题。可以通过在 /usr/local/etc/ezjail.conf 中为特定下载镜像站指定完整链接来选择 HTTP:ezjail_ftphost=http://ftp.FreeBSD.org
使用
ezjail-admin create
建立新的 jail。在这些示例中,环回接口 lo1
按上述方式使用。示例:建立和启动新 jail
1.创建 jail,指定名称、要使用的环回和网络接口及其 IP 地址。在此示例中,jail 被命名为dnsjail
。# ezjail-admin create dnsjail 'lo1|127.0.1.1,em0|192.168.1.50'技巧有时,jail 中确实需要原始套接字。例如,网络监控工具经常使用 ping(8) 来检查其他计算机的可用性。当 jail 中实际需要原始网络套接字时,可以通过编辑各个 jail 的 ezjail 配置文件 /usr/local/etc/ezjail/jailname 来启用它们。修改parameters
条目:export jail_jailname_parameters="allow.raw_sockets=1"请勿启用原始网络套接字,除非 jail 中的服务确实需要它们。
1.启动 jail:# ezjail-admin start dnsjail
1.在 jail 中使用控制台:# ezjail-admin console dnsjail
jail 正在运行,可以完成其他配置。此时可进行的一般设置包括:
1.设置root
密码连接到 jail 并设置root
用户的密码:# ezjail-admin console dnsjail# passwdChanging local password for rootNew Password:Retype New Password:
1.时区配置可以用 tzsetup(8) 来设置 jail 的时区。为避免虚假的错误消息,可以注释或删除 /etc/crontab 中的 adjkerntz(8) 条目。此任务使用时区更改来更新计算机的硬件时钟,但不允许 jail 访问该硬件。
1.域名服务器在 /etc/resolv.conf 中输入域名服务器一行,以便让 DNS 在 jail 中工作。
1.编辑 /etc/hosts更改地址并将 jail 名称添加到 /etc/hosts 中的localhost
条目中。
1.配置 /etc/rc.conf在 /etc/rc.conf 中输入配置设置。这很像配置一台完整的计算机。此处未设置主机名和 IP 地址。这些值已由 jail 配置提供。
在配置 jail 后,可以安装为其创建 jail 的应用程序。
技巧某些 port 必须使用特殊选项编译才能在 jail 中使用。例如,网络监控插件软件 net-mgmt/nagios-plugins 和 net-mgmt/monitoring 插件都有一个JAIL
选项,必须启用该选项才能在 jail 中正常工作。
由于 basejail 的用户空间副本由其他 jail 共享,因此更新 basejail 会自动更新所有其他 jail。可以使用软件源更新或二进制更新。
要从主机上的源代码编译 world,然后将其安装在 basejail 中,请使用:
# ezjail-admin update -b
如果 world 已经在主机上编译,请使用以下命令将其安装在 basejail 中:
# ezjail-admin update -i
二进制更新使用 freebsd-update(8)。这些更新与直接运行 freebsd-update(8) 具有相同的限制。最重要的一点是,只有 -RELEASE 版本的 FreeBSD 可以使用此方法。
用 basejail 将主机的 FreeBSD 版本更新到最新补丁版本。例如,从 RELEASE-p1 更新到 RELEASE-p2。
# ezjail-admin update -u
要将 basejail 升级到新版本,请首先按照“执行主要和次要版本升级”中所述升级主机系统。升级并重新引导主机后,即可升级 basejail。freebsd-update(8) 无法确定 basejail 中当前安装了哪个版本。因此必须指定原始版本。使用 file(1) 确定 basejail 中的原始版本:
# file /usr/jail/basejail/bin/sh
/usr/jail/basejail/bin/sh: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 13.0, FreeBSD-style, stripped
现在,使用此命令执行从当前的主机系统版本到
13.0-RELEASE
的升级:# ezjail-admin update -U -s 13.0-RELEASE
删除从 jail 的 /usr/src 到 basejail 的链接,并在 jail 中创建一个新的 /usr/src 作为挂载点。将主机的 /usr/src 只读挂载到 jail 的新 /usr/src 挂载点上:# rm /usr/jail/jailname/usr/src# mkdir /usr/jail/jailname/usr/src# mount -t nullfs -o ro /usr/src /usr/jail/jailname/usr/src在 jail 中获取控制台:# ezjail-admin console jailname在 jail 里运行mergemaster
。然后退出 jail 控制台:# cd /usr/src# mergemaster -U# exit最后,卸载 jail 的 /usr/src:# umount /usr/jail/jailname/usr/src
# mergemaster -U -D /usr/jail/jailname
基本系统 jail 中的 port 由其他 Jail 共享。更新 port 的该副本也会为其他 jail 提供更新的版本。
# ezjail-admin update -P
ezjail 在计算机启动时会自动启动 jail。可以使用
stop
和 start
手动停止和重新启动 jail:# ezjail-admin stop sambajail
Stopping jail: sambajail.
默认情况下,jail 在主机启动时自动启动。可以通过
config
禁用自动启动:# ezjail-admin config -r norun seldomjail
这将在下次启动主机时生效。已经运行的 jail 不会停 止。
启用自动启动非常相似:
# ezjail-admin config -r run oftenjail
使用
archive
来创建一个 .tar.gz 的 jail 归档。文件名由 jail 的名称和当前日期组成。归档文件被写入归档目录——/usr/jail/ezjail_archives。可以通过在配置文件中设置 ezjail_archivedir
来选择其他的归档目录。可以将归档文件作为备份复制到其他位置,也可以使用
restore
从中恢复现有 jail。可以从存档中创建新的 jail,从而为克隆现有 jail 提供便捷的方法。关闭 jail 并归档到名为
wwwserver
:# ezjail-admin stop wwwserver
Stopping jail: wwwserver.
# ezjail-admin archive wwwserver
# ls /usr/jail/ezjail-archives/
wwwserver-201407271153.13.tar.gz
根据在上 一步中创建的归档创建一个名为
wwwserver-clone
的新 jail。使用 em1
接口并分配新的 IP 地址以避免与原始 IP 地址冲突:# ezjail-admin create -a /usr/jail/ezjail_archives/wwwserver-201407271153.13.tar.gz wwwserver-clone 'lo1|127.0.3.1,em1|192.168.1.51'
将 BINDDNS 服务器放入 jail 可以通过隔离来提高安全性。此示例创建一个简单的仅缓存域名服务器。
- jail 将被称为
dns1
。 - jail 将使用主机接口
re0
上的 IP 地址192.168.1.240
。 - 上游 ISP 的 DNS 服务器位于
10.0.0.62
和10.0.0.61
。
例 34.在 jail 中运行 BIND通过向 /etc/rc.conf 添加一行来创建克隆的环回接口:cloned_interfaces="lo1"立即创建新的环回接口:# service netif cloneupCreated clone interfaces: lo1.创建 jail:# ezjail-admin create dns1 'lo1|127.0.2.1,re0|192.168.1.240'启动 jail,连接到在其上运行的控制台,然后执行一些基本配置:# ezjail-admin start dns1# ezjail-admin console dns1# passwdChanging local password for rootNew Password:Retype New Password:# tzsetup# sed -i .bak -e '/adjkerntz/ s/^/#/' /etc/crontab# sed -i .bak -e 's/127.0.0.1/127.0.2.1/g; s/localhost.my.domain/dns1.my.domain dns1/' /etc/hosts在 /etc/resolv.conf 中临时设置上游 DNS 服务器,以便可以下载 ports:nameserver 10.0.0.62nameserver 10.0.0.61