如何使用vnet和ZFS配置FreeBSD Jail
如何使用vnet安装和配置FreeBSD监狱?
在不使用iocage命令或ezjail命令行工具的情况下,如何使用/etc/jail.conf创建FreeBSD监狱?
说明:Poul-Henning Kamp在FreeBSD 4.x中引入了Jails。
FreeBSD监狱不过是允许对基于FreeBSD的Unix服务器进行分区的操作系统级虚拟化。
这些迷你系统称为监狱(Jail)。
监狱拥有自己的root用户和访问权限。
监狱可以使用网络子系统虚拟化基础架构或共享现有网络。
FreeBSD监狱是提高安全性的有力方法。
通常,您会针对Web服务器,VPN服务器,数据库服务器等服务创建监狱。
该页面显示了如何使用vnet和ZFS配置FreeBSD Jail。
以下说明在FreeBSD 11.2版上进行了测试。
如何使用vnet和ZFS配置FreeBSD Jail
从11.2开始,创建FreeBSD监狱的步骤如下:
- 编译FreeBSD内核以包含VIMAGE支持
- 安装JIB和JNG
- 为basejail创建一个zfs数据集
- 在主机上配置jail.conf
- 启用并启动监狱服务
让我们详细了解所有步骤,以使用vnet和ZFS配置FreeBSD Jail。
步骤1.配置/编译vnet内核
您必须编译FreeBSD内核。
您需要启用了VIMAGE的FreeBSD内核。
您必须在/usr/src /目录中安装了FreeBSD src。
使用cp命令,如下所示复制内核配置:
$ sudo cp -v /usr/src/share/examples/jails/VIMAGE /usr/src/sys/amd64/conf/VIMAGE $ cd /usr/src/
编译:
$ sudo make KERNCONF=VIMAGE kernel
您可以通过传递-j选项来指定make可以一次运行的最大作业数。
例如:
$ sudo make -j 16 KERNCONF=VIMAGE kernel
您必须重新启动FreeBSD框:
$ sudo reboot
验证新的内核版本:
$ uname -v `FreeBSD 11.2-RELEASE #0: Wed Jul 11 21:35:37 IST 2016 root@nas04:/usr/obj/usr/src/sys/VIMAGE`
安装所需的工具:
$ sudo cp -v /usr/src/share/examples/jails/{jib,jng} /usr/sbin/
步骤2.为监狱创建一个zfs数据集
您需要设置文件系统。
使用zpool命令获取已配置的zfs的列表:
# zpool list
输出示例:
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT zroot 21.8T 68.7G 21.7T - - 0% 0% 1.00x ONLINE
为挂载在/jails /上的zroot执行以下zfs命令:
# zfs create -o mountpoint=/jails zroot/jails
接下来创建一个zfs数据集:
# zfs create zroot/jails/fullbasejail
通过访问此页面以及您想要在监狱中使用的FreeBSD的任何其他部分,获取FreeBSD 11.2基本文件。
使用curl命令或wget命令或fetch命令:
# cd /tmp # wget https://download.freebsd.org/ftp/releases/amd64/11.2-RELEASE/base.txz # wget https://download.freebsd.org/ftp/releases/amd64/11.2-RELEASE/lib32.txz
使用tar命令解压缩从FreeBSD ftp镜像获取的base.txz和lib32.txz tarball:
# tar -zxvf /tmp/11.2-RELEASE/base.txz -C /jails/fullbasejail # tar -zxvf /tmp/11.2-RELEASE/lib32.txz -C /jails/fullbasejail
更新您的FreeBSD基本安装
使用freebsd-update命令将更新应用于FreeBSD基本安装:
# freebsd-update -b /jails/fullbasejail fetch install
将系统与已安装发行版的已知良好索引进行比较:
# freebsd-update -b /jails/fullbasejail IDS
输出示例:
Looking up update.FreeBSD.org mirrors... 3 mirrors found. Fetching metadata signature for 11.2-RELEASE from update5.freebsd.org... done. Fetching metadata index... done. Fetching 1 metadata files... done. Inspecting system... done.
步骤3.配置基础监狱
您刚刚为快速部署配置了一个基础监狱。
可以克隆basejail创建新的监狱:
# zfs snapshot zroot/jails/[email protected]
列出快照:
zfs list -t snapshot
最后,从zfs快照中创建一个名为rsnapshot的新监狱:
# zfs send -R zroot/jails/[email protected] | zfs receive zroot/jails/rsnapshot
如何配置基本的监狱设置
您需要确保您的监狱在rc.conf中具有正确的时区,dns服务器,主机名,ip地址和其他内容。
请注意,您需要位于/jails/rsnapshot /目录中(根据您的设置调整路径):
# cd /jails/rsnapshot
通过在/jails/rsnapshot /中创建一个名为etc/resolv.conf的文件来设置dns:
# vi etc/resolv.conf
追加以下内容(根据您的设置设置dns名称服务器):
nameserver 192.168.2.254 nameserver 192.168.2.18
在vim/vi文本编辑器中保存并关闭文件。
使用ln命令为FreeBSD监狱设置时区(我正在设置为IST):
# ln -v usr/share/zoneinfo/Asia/Kolkata etc/localtime `etc/localtime => usr/share/zoneinfo/Asia/Kolkata`
接下来,您需要在/jails/rsnapshot /中设置rc.conf:
# vi etc/rc.conf
示例设置:
# jail hostname # host_hostname="rsnapshot" # jail ip address and routing # ifconfig_ng0_rsnapshot="inet 192.168.2.30 netmask 255.255.255.0" defaultrouter="192.168.2.254" # Start or stop services # cron_flags="$cron_flags -J 15" sendmail_enable="NONE" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO" syslogd_flags="-c -ss" ipv6_activate_all_interfaces="NO" sshd_enable="YES"
保存并关闭文件。
如何在主机上配置jail.conf
如下编辑或创建/etc/jail.conf:
# vi /etc/jail.conf
追加以下配置:
rsnapshot { host.hostname = "rsnapshot"; # hostname path = "/jails/rsnapshot"; # root directory exec.clean; exec.system_user = "root"; exec.jail_user = "root"; # ########################################################################## # netgraph/vnet config info # ng0 is my vnet # idb1 is my physical network interface connected to the LAN (use ifconfig) # jng is located in /usr/sbin/ # rsnapshot is my jail name # ########################################################################## vnet; vnet.interface = "ng0_rsnapshot"; # vnet interface(s) exec.prestart += "jng bridge rsnapshot igb1"; # bridge interface(s) exec.poststop += "jng shutdown rsnapshot"; # destroy interface(s) # Standard stuff exec.start += "/bin/sh /etc/rc"; exec.stop = "/bin/sh /etc/rc.shutdown"; exec.consolelog = "/var/log/jail_rsnapshot_console.log"; mount.devfs; #mount devfs allow.raw_sockets; #allow ping-pong devfs_ruleset="5"; #devfs ruleset for this jail mount.devfs; }
保存并关闭文件。
开启监狱服务
# sysrc jail_enable=YES
创建/etc/devfs.rules
# vi /etc/devfs.rules
如下所示追加或编辑文件,以允许/dev/tun在监狱中访问(请参阅/etc/defaults/devfs.rules):
[devfsrules_jail_rsnapshot=5] add include $devfsrules_hide_all add include $devfsrules_unhide_basic add include $devfsrules_unhide_login add path 'tun*' unhide add path zfs unhide
保存并关闭文件。
启动jail服务
# service jail start # service jail status
如何登录jail
要列出正在运行的监狱,请运行:
# jls
使用jid或jailname如下
# jexec 1 # jexec rsnapshot
使用pw命令添加新用户:
# pw useradd -n Hyman -G wheel -s /bin/tcsh -m -d /home/Hyman # passwd Hyman
更新或安装软件包
# pkg update && pkg upgrade # pkg install most
验证网络:
# ifconfig # sockstat -4 # ping -c 2 theitroad.local
请注意,tun0
是我在FreeBSD监狱中运行的OpenVPN NIC,而ng0_rsnapshot
是jail的NIC。