====== jail ======
===== 元となるjailの構築 =====
入れるのはbaseとlib32でとりあえず大丈夫でしょう。
# bsdinstall jail /jail/base
//**※baseシステムをupdateしているとftpで10.0-RELEASE-p1ディレクトリにアクセスしようとして、失敗するので注意**//((/usr/libexec/bsdinstall/mirrorselect ディレクトリ名に uname -r を使用しているため。9.0-p3あたりから改善要望が出ているが、今のところ未対応の模様))\\
2015.05.20 直った模様(10.1-RELEASE-p10で確認)
//※最初のサイト選択で、 を選択して、-pn (nはパッチレベル)を取り除くことでも対応可能//
===== 元となるjailのupdate =====
必要に応じて元jailをupdateしておく((-b でbaseディレクトリを -d でtempを指定している))((jailが起動していなくてもOK))
# freebsd-update -b /jail/base -d /jail/base/var/db/freebsd-update fetch
# freebsd-update -b /jail/base -d /jail/base/var/db/freebsd-update install
===== 設定 =====
==== jail.conf.d ====
jail.conf を/etc/jail.conf.d/にブナ活できるようになったので対応した書き方を
共通部分は jail.conf で書きたいのだがどうもうまくいかない模様
/etc/jail.conf
include "/etc/jail.conf.d/*.conf";
/etc/jail.conf.d/*
{
path = "/jail/$name";
host.hostname = $name;
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown jail";
exec.clean;
mount.devfs;
# options
allow.chflags;
allow.raw_sockets;
# FileSystem Mount
# exec.prestart += "mount_nullfs -o ro /usr/ports/ /jail/${name}/usr/ports";
exec.prestart += "mount_nullfs /var/cache/pkg/ /jail/${name}/var/cache/pkg";
# Network
ip4.addr += xn0|192.168.1.xx/24;
ip4.addr += xn1|192.168.2.xx/24;
exec.poststop += "ifconfig xn0 inet 192.168.1.xx -alias";
exec.poststop += "ifconfig xn1 inet 192.168.2.xx -alias";
# FileSystem Unmount
# exec.poststop += "umount /jail/${name}/usr/ports";
exec.poststop += "umount /jail/${name}/var/cache/pkg";
persist; // Required because there are no processes
}
==== jail.conf ====
/etc/jail.conf
# common variables
exec.prestart += "ifconfig ${nic} inet ${ip4.addr} add";
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.poststop += "ifconfig ${nic} inet ${ip4.addr} -alias";
exec.clean;
$nic = "xn0";
mount.devfs;
path = "/jail/$name";
host.hostname = $name;
# each jail
base { ip4.addr = 192.168.0.128; }
この例では、ホストと同じネットワークに接続する設定で、起動時にIP alias を振ってる。
ホストと同じIPならこんな感じ
# common variables
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
path = "/jail/$name";
host.hostname = $name;
# each jail
base {
ip4.addr = <ホストのIPアドレス>;
allow.chflags; <= chflagsの使用許可(freebsd-updateが実行できるようにするため)
allow.raw_sockets; <= RAW SOCKETの使用許可(ping等が使用できるようにするため)
}
==== rc.conf ====
/etc/rc.conf
jail_enable="YES"
起動するjailを指定する場合
jail_list="jail01 jail02 jail05"
並列起動((起動に失敗するケースが有ったのでOFFにしてる))
jail_parallel_start="YES"
===== 起動 =====
# service jail start base
===== 一覧 =====
# service jail status
OR
# jls
JID IP Address Hostname Path
1 - yourjail.localdomain /path/to/yourjail
===== jailに入る =====
# jexec 1 /bin/sh
↑ ↑ ログイン用シェル
↑ jail ID (jail名でも可)
===== 止める =====
# service jail stop base
===== 削除 =====
# service jail stop base
# chflags -R noschg /jail/base/*
# rm -R /jail/base/*
===== pkgngの利用 =====
[[os:freebsd:pkg_8|pkgコマンド]]はjailの外から利用可能です
# pkg -j jail名|jailID info
===== Host側のディレクトリをマウント =====
nullfsを利用します。((古い記述だとカーネルの再構築が必要となっていますが、10.0では不要でした))\\
例:/usr/ports を jailで共有する\\
/etc/fstabに以下のような記述\\
/usr/ports/ /jail/jail名/usr/ports nullfs ro,noauto 0 0
mountすればjail側で使えるようになります
# mount /jail/jail名/usr/ports
/etc/jail.confだとこんな感じで書けば、jailの起動時にマウントして停止時にumountしてくれるはず
jail名 {
exec.prestart += "mount /jail/jail名/usr/ports";
exec.poststop += "umount /jail/jail名/usr/ports";
}
/etc/jail.confで完結させる場合((12.0からmount_nullfsを使用するようになりました))
exec.prestart += "mount_nullfs -o ro /usr/ports/ /jail/$name/usr/ports";
exec.prestart += "mount_nullfs /var/cache/pkg/ /jail/$name/var/cache/pkg";
exec.poststop += "umount /jail/$name/usr/ports";
exec.poststop += "umount /jail/$name/var/cache/pkg";
==== /usr/portsの場合 ====
リードオンリーでマウントしてるので、このままではビルドが失敗します。以下のように **/etc/make.conf** で作業用のディレクトリを指定します。
WRKDIRPREFIX = /var/ports
DISTDIR = /var/ports/distfiles
PACKAGES = /var/ports/packages
==== 共有メモリは推奨されない ====
**PostgreSQL**のように共有メモリを使用するものはJAILでの動作は推奨されない
[[http://www.jp.freebsd.org/QandA/HTML/1866.html]]((# sysctl -w security.jail.sysvipc_allowed=1))
----
===== ListenポートとIPアドレスの調整 =====
**ここら辺はもういらないかな**
ホストとjailで別々のIPを振った場合、サーバソフトでもそれを意識した設定が必要\\
つまり、listenアドレスをきちんと指定しないとエラーを起こす。
ホストで待ち受けているポートを見る
# sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sendmail 1359 3 tcp4 127.0.0.1:25 *:*
root sshd 1356 4 tcp4 *:22 *:*
root syslogd 1293 7 udp4 *:514 *:*
==== apache ====
/usr/local/etc/apache/httpd.conf
Listen 192.168.1.jailアドレス:80
Listen 192.168.1.jailアドレス:443
==== Nginx ====
/usr/local/etc/nginx/nginx.conf((前述手順でjailを作った場合なくても動いた))
listen 192.168.1.jailアドレス:80
==== lighttpd ====
/usr/local/etc/lighttpd/lighttpd.conf
server.bind = "192.168.1.jailアドレス"
......
$SERVER["socket"] == "192.168.1.jailアドレス:80" { }
==== sshd ====
/etc/ssh/sshd_config((前述手順でjailを作った場合なくても動いた))
ListenAddress <ホストのIPアドレス>
# service sshd restart
# sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sendmail 1359 3 tcp4 127.0.0.1:25 *:*
root sshd 1356 4 tcp4 <ホストのIPアドレス>:22 *:*
root syslogd 1293 7 udp4 *:514 *:*
==== syslogd ====
/etc/rc.confに以下を追記する
syslogd_flags="-ss"
# service syslogd restart
# sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sendmail 1359 3 tcp4 127.0.0.1:25 *:*
root sshd 1356 4 tcp4 <ホストのIPアドレス>:22 *:*
root syslogd 1293 7 udp4 <ホストのIPアドレス>:514 *:*
==== inetd ====
/etc/rc.confに以下を追記する
inetd_flags="-wW -C 60 -a <ホストのIPアドレス>"
===== jail内のUID/GIDの範囲を指定する =====
jail内の/etc/pw.conf(/jail/jail名/etc/pw.conf)で指定
defaultpasswd no
minuid 10000
maxuid 19999
mingid 10000
maxgid 19999
===== 起動順 =====
/etc/rc.confのjail_listを記述することで起動準を指定できる
jail_list="jail1 jail2 jail3"
===== 依存 =====
他のjialに依存してる場合、/etc/jail.confで depend で指定する
db64 {
host.hostname = "db64.example.com";
path = "/home/jails/db64";
ip4.addr += "192.168.46.2/32";
allow.raw_sockets = 0;
mount.fstab = "/etc/fstab.db64";
exec.consolelog = "/var/log/jail_db64_console.log";
}
www64 {
host.hostname = "www.example.com";
path = "/home/jails/www64";
ip4.addr += "192.168.46.4/32";
allow.raw_sockets = 0;
mount.fstab = "/etc/fstab.www64";
exec.consolelog = "/var/log/jail_www64_console.log";
# depend db,db64;
depend db64;
}
===== Memo =====
デフォルトの状態では、traceroute、ping、bpfを利用したWIDE-DHCP等のraw socketを利用するプログラムが正常に動作しません。 これらを利用するためには、hostの「/etc/sysctl.conf」に以下の記述を追記
security.jail.allow_raw_sockets=1
/etc/resolv.confの直し忘れが多いので注意
===== 参考 =====
* [[https://people.allbsd.org/~hrs/FreeBSD/sato-FBSDW20200925-jail.pdf|復習 FreeBSD Jail]]
* [[https://www.bsdstore.ru/en/13.0.x/wf_jconfig_ssi.html|CBSD jail config]]
* [[http://journal.reallyenglish.com/2009/10/21/freebsd-jail-for-programmer-1.html|FreeBSD/Jailを使用したプログラマのための仮想環境]]
* [[http://bompopo.wordpress.com/2014/02/16/freebsd10-0r%E3%81%A7jail%E3%81%AE%E8%A8%AD%E5%AE%9A/|FreeBSD10.0Rでjailの設定]]
* [[http://bompopo.wordpress.com/2014/02/17/%E4%B8%80%E6%AD%A9%E9%80%B2%E3%82%81%E3%81%9Fjail-conf%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9/|一歩進めたjail.confの書き方]]
* [[http://blog.livedoor.jp/dankogai/archives/51916648.html|FreeBSD - Jailは仮想化ではなく半仮想化と呼ぶべきではないか]]
* [[http://rauq04.blogspot.jp/2012/03/freebsd-memo-qjail.html|qjail を使って簡易仮想環境作成]]
* [[http://www.bugbearr.jp/?FreeBSD%2FJail|FreeBSD/Jail]]
* [[http://d.zinrai.info/blog/html/2013/08/22/freebsd_jail_vimage_zfs.html|FreeBSD 9.1 VIMAGE + ZFS で Jail環境構築]]
* [[http://gihyo.jp/admin/serial/01/bsd-yomoyama/0003|複数バージョンのFreeBSDをJailで共有させる方法]]
* [[https://therub.org/2014/08/11/convert-freebsd-jails-from-rc.conf-to-jail.conf/|Convert FreeBSD 10 Jails from rc.conf to jail.conf]]
* [[https://gist.github.com/sdebnath/086874c5df8b68e0df69|FreeBSD Jails with VLAN HOWTO]]
* [[https://bastille.readthedocs.io/en/latest/chapters/jail-config.html|jail.conf]]
* [[https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=233310|jails: Modularize configuration system (conf.d)]]
* [[https://qiita.com/dankogai/items/ffc4f31a8a949bd7ec01|ZFS - スナップショットいつやるか?今でしょ!]]