jail
ezjail
qjail
iocage
自力で環境を作る場合
jail 用ディレクトリを作成(他のファイルと分離できるならどこでもよい)
mkdir -p /myjail
cd /myjail
FreeBSD のベースシステムをダウンロード
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/12.3-RELEASE/base.txz
コンテナ用ディレクトリを作成
mkdir prisoner1
コンテナ内にベースシステムを展開
tar -xzpf base.txz -C /opt/jail/prisoner1
chroot する時に、ベースシステムにない shell を指定しているとエラーになる。
code:console
$ chroot /jail/prisoner1
chroot: /usr/local/bin/bash: No such file or directory
chsh でシェルを変えるか、SHELL=/bin/sh chroot とする。
(FreeBSDの場合、/bin/tcsh がベースシステムのデフォルトシェル)
code:console
$ SHELL=/bin/sh chroot /jail/prisoner1
chroot から復帰するには、exit でよい。
code:console
$ exit
jail 側のホスト名の設定
code:(jail)/etc/rc.conf
hostname="prisoner1.your.domain.local"
このホスト名は jls で表示されるホスト名にもなる。
ログの設定
jail のコンソール出力を止める
/dev/console の行をコメントアウト
code:(jail)/etc/
#*.err;kern.warning;auth.notice;mail.crit /dev/console
タイムゾーンの設定
tzsetup が TUI になってしまっている。それでよいならそのまま実行。
code:console
jail$ tzsetup /usr/share/zoneinfo/Asia/Tokyo
FreeBSD11: 手動でタイムゾーンを設定するには http://www.lifewithunix.jp/notes/2016/11/05/how-to-configure-timezone-info-on-freebsd11/
code:console
jail$ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
jail$ chmod 444 /etc/localtime
jail$ echo "Asia/Tokyo" > /var/db/zoneinfo
jail$ chmod 644 /var/db/zoneinfo
cron の設定
adjkerntz を無効にする。
adjkerntz の行をコメントアウト。
code:(jail)/etc/crontab
#1,31 0-5 * * * root adjkerntz -a
ネットワークの設定
名前解決の設定
外側の名前解決
resolv.conf の配置(resolv.conf についての説明は省く。適切なDNSを設定する。)
code:(jail)/etc/resolv.conf
nameserver 192.0.2.1
nameserver 192.0.2.2
jail の名前解決のため、hosts ファイルに追加。ホスト側とjail側双方に書いておく。
code:(host,jail)/etc/hosts
192.168.0.11 prisoner1.your.domain.local
ネットワークインターフェースの設定
ホスト側でインターフェースを増やす
ここでは、内部インターフェースとしてIPアドレスを増やす。(外のIPアドレスを消費しない。直接、外に見せない。)
code:(host)/etc/rc.conf
cloned_interfaces="lo1"
ifconfig_lo1="inet 192.168.0.1 netmask 255.255.255.0"
このアドレスはホスト用になる。
lo1_alias0 の方を jail に使わせる。
code:(jail)/etc/rc.conf
ifconfig_lo1="inet 192.168.0.11 netmask 255.255.255.0"
jail の最終的な設定
ホスト側で jail の定義ファイルを作る。
code:/etc/jail.conf
prisoner1
{
jid=1;
name=prisoner1;
path=/jail/prisoner1;
host.hostname=prisoner1.your.domain.local;
mount.devfs;
devfs_ruleset=4;
ip4.addr=192.168.0.11;
interface=lo1;
allow.raw_sockets;
allow.chflags;
exec.startup="/bin/sh /etc/rc"
exec.shutdown="/bin/sh /etc/rc.shutdown"
}
devfs_ruleset=4 は jail 用の最小セットが定義されている。
allow.raw_sockets は必要に応じて
allow.chflags は必要に応じて
interface と ip4.addr の設定により、jail 起動時に lo1 に alias アドレスが追加され、停止時に削除される。
/etc/rc.conf に以下を追記
code:/etc/rc.conf
jail_enable="YES"
jail_list="prisoner1"
jail_list は空白区切りで、複数の jail 名を書く事ができる。
ホスト側のディレクトリを見せたい場合は mount -t nullfs ホスト側ディレクトリ jail側ディレクトリとすればよい。
永続的にするにはホスト側の /etc/fstab.jail.jail名 に書いておけばよい。
code:/etc/fstab.jail.prisoner1
/host/your/dir /jail/prisoner1/your/dir nullfs rw 0 0
NAT で外を見られるようにする。
jail 内で ports のコンパイルなどをする場合には外へのアクセスがどうしても必要。
それが終わって外を見る必要性がなくなったら外した方がよさそう。
gateway を有効にする。
code:(host)/etc/rc.conf
gateway_enable="YES"
ipfw の NAT を有効にする。
code:(host)/etc/rc.conf
firewall_nat_enable="YES"
/etc/rc.conf で firewall_type にファイルパスを指定していない場合、firewall_nat_* の設定をする。
code:/etc/rc.conf
firewall_nat_interface="re0"
firewall_nat_flags=""
/etc/rc.conf で firewall_type にファイルパスを指定している場合、ipfw 設定ファイルに nat の設定が必要。
ここでは外が re0
(port forward もできるので必要に応じて設定。)
code:/etc/ipfw.rules
nat 1 config if re0
add nat 1 ip from any to me in via re0
add nat 1 ip from 192.168.0.0/24 to any out via re0
メモ
ipfw で NAT を使う場合、ipfw_nat.ko が読み込まれていなければならない。
これは /etc/rc.conf に書いた firewall_nat_enable="YES" で自動的に行われる。
code:console
# kldstat
Id Refs Address Size Name
1 30 0xffffffff80200000 2295988 kernel
2 1 0xffffffff82497000 398730 zfs.ko
3 2 0xffffffff82830000 9860 opensolaris.ko
4 1 0xffffffff82b19000 2698 intpm.ko
5 1 0xffffffff82b1c000 b40 smbus.ko
6 1 0xffffffff82b1d000 1860 uhid.ko
7 1 0xffffffff82b1f000 1a40 wmt.ko
8 2 0xffffffff82b21000 25810 ipfw.ko
9 1 0xffffffff82b47000 24a0 ipfw_nat.ko
10 1 0xffffffff82b4a000 b842 libalias.ko
11 1 0xffffffff82b56000 acf mac_ntpd.ko
もし読み込まれていないようなら読み込ませる。
$ kldload ipfw ipfw_nat
永続的に設定する場合、/boot/loader.conf に追加する。
code:/boot/loader.conf
ipfw_load="YES"
ipfw_nat_load="YES"
メモ
何が問題か?
ベースシステムで変更可能な物と変更不可能な物とが綺麗に分離されていない。
このため、Jail の上に何かをインストールした後、ベースシステムの入れ替え(アップグレード、ダウングレード)が大変な事になる。(マージが必要)
参考
https://www.kishiro.com/FreeBSD/jail.html