FreeBSD Jail · 2 min read · Dec 13, 2025
Iocageを使用したFreeBSDのJailの設定方法

Jailは、FreeBSDにおけるOSレベルの仮想化の用語です。1999年にPoul-Henning Kampによって導入され、FreeBSDは4.xバージョン以降に採用されました。
Jailは、システム管理者がFreeBSDシステム内に孤立した独立したミニシステムまたは「jail」を作成することを可能にします。「jail」には独自のルートシステムと設定があり、孤立した環境でアプリケーションを展開したい場合に役立ちます。
Iocageは、Pythonで書かれたFreeBSDのjailマネージャーです。シンプルで、簡単なコマンド構文が付属しています。Iocage jailマネージャーは、jails内のZFSデータセットに特化しており、「VNET」仮想ネットワーキングスタックおよび/または「Shared IP」ベースのjailに基づいてjailを作成することができます。Iocageを使用すると、jailテンプレート、ベースjail、通常のjailを作成できます。
このチュートリアルでは、Iocage Jail Managerを使用してFreeBSD jailを設定および構成する方法を示します。FreeBSDにIocageをインストールし、共有IPを使用して新しいjailを設定し、pfファイアウォールを設定し、次にjail内にnginxウェブサーバーをインストールしてテストします。
前提条件
このガイドでは、ZFS(Zファイルシステム)にインストールされたFreeBSDシステムにIocage Jail Managerをインストールおよび構成する必要があります。また、FreeBSDシステムでpfファイアウォールが有効になっていることを確認してください。
以下は、ZFS上のFreeBSDインストールとpfファイアウォール構成のガイドです。
FreeBSD 12.0をZFSにインストールする方法
FreeBSDでpfファイアウォールを設定する方法
私たちが行うこと:
- Iocage Jail Managerをインストールする
- FreeBSDリリースをダウンロードする
- 共有IPとpfファイアウォールを設定する
- Iocageを使用して新しいjailを作成する
- テスト
ステップ1 - FreeBSDにIocageをインストールする
最初に、FreeBSDシステムにIocage Jailマネージャーをインストールおよび構成します。IocageはPythonで書かれており、FreeBSDのバイナリパッケージリポジトリで入手可能です。
以下のpkgコマンドを使用して、FreeBSDシステムにIocageをインストールします。
pkg install py36-iocageIocage Pythonパッケージのインストールを受け入れるには「y」と入力し、インストールが開始されます。
インストールが完了したら、以下のzpoolコマンドを使用してシステム上の利用可能なZFSプールを確認します。
zpool list次に、Iocageインストール用のZFSプールを選択します。このガイドでは、FreeBSDにインストールされたデフォルトのZFSプール「zroot」を使用します。
以下のコマンドを使用して、Iocageの使用のために「zroot」プールをアクティブにします。
iocage activate zrootこれで、FreeBSD 12.0でのIocageのインストールが完了し、iocageコマンドラインを使用してFreeBSD jailを作成および管理できます。

さらに、以下のsysrcコマンドを使用して、’/etc/rc.conf’ファイルにiocageサービスを追加することで、システム起動時にjailを有効にできます。
sysrc iocage_enable=yesステップ2 - FreeBSDリリースをダウンロードする
新しいjailを作成するには、FreeBSDリリースをダウンロードする必要があります。そして、ホストFreeBSDバージョンとは異なるバージョンの新しいjailを作成できます。
以下のiocageコマンドを使用して、利用可能なリリースバージョンを確認します。
iocage fetchこれで、異なるバージョンのリリースが表示されます。必要なバージョンを選択し、番号を入力します。最新のリリースバージョンをダウンロードするには、番号「2」を選択します。

FreeBSDリリースイメージのダウンロードを待ちます。
異なるイメージをダウンロードしたい場合は、以下のコマンドを使用できます。
iocage fetch 11.3-RELEASEその結果、jail用のFreeBSDリリースイメージがダウンロードされました。
ステップ3 - 共有IPとpfファイアウォールを設定する
jail用のソースイメージをダウンロードした後、システムのネットワーキングとpfファイアウォールを構成します。「bridge0」という新しいネットワークインターフェースを作成し、ネットワークIPアドレス「10.8.8.1/24」を設定し、jailで使用します。
以下のコマンドを実行して、’/etc/rc.conf’ファイルに新しい設定を追加します。
sysrc cloned_interfaces+="bridge0"
sysrc ifconfig_bridge0="10.8.8.1/24"ネットワークIPアドレス「10.8.8.1/24」を持つ新しい「bridge0」インターフェースを作成します。
ifconfig bridge0 create
ifconfig bridge0 10.8.8.1/24 up
「bridge0」インターフェースが作成されたので、以下のコマンドを使用して確認します。
ifconfig bridge0以下のような結果が得られます。

次に、pfファイアウォールを構成し、jail環境の新しい設定を追加します。このガイドでは、シンプルなpfファイアウォールの設定を使用しています。
FreeBSD 12.0でpfファイアウォールを設定する方法
‘/usr/local/etc’ディレクトリに移動し、設定ファイル’pf.conf’を編集します。
cd /usr/local/etc/
vim pf.conf内部ネットワークインターフェース’bridge0’とそのIPアドレスを’int_if’および’localnet’変数として追加します。
# 内部インターフェース
int_if = "bridge0"
localnet = $int_if:network次に、ホストjailのIPアドレスとjailに転送されるポートを定義します。システムの外部インターフェースからjailホストIPアドレス「10.8.8.5」へのHTTPおよびHTTPS接続を転送します。
# Jail '10.8.8.5'へのhttpおよびhttpsのポート転送
ports_to_forward="{ 80, 443 }"
forward_host="10.8.8.5"jail ‘localnet’変数のために、’ext_if’外部インターフェースでnatを有効にし、次に’ports_to_forward’変数からホスト’forward_host’へのポートリダイレクションを有効にします。
# jailからインターネット、インターネットからjailへのnat(httpおよびhttpsのみ)
nat on $ext_if inet from $localnet to any -> ($ext_if)
rdr on $ext_if proto tcp from any to any port $ports_to_forward -> $forward_host次に、’bridge0’インターフェースからすべての接続を通過させ、外部インターフェースのHTTPおよびHTTPS ‘ports_to_forward’への着信接続を通過させます。
pass from { self, $localnet } to any keep state
pass in on $ext_if proto {udp, tcp} from any to any port $ports_to_forward keep state保存して閉じます。
次に、pfファイアウォールの設定をテストし、エラーがないことを確認してから、pfサービスを再読み込みします。
service pf check
service pf reloadその後、以下のコマンドを使用してpfファイアウォールのすべてのルールを確認します。
pfctl -s rules以下のような結果が得られます。

さらに、pfファイアウォールのnatステータスを確認できます。
pfctl -v -s nat
その結果、新しいインターフェース’bridge0’が作成され、pfファイアウォールが構成されました。そして、新しい最初のjailを作成する準備が整いました。
以下は、完全なpfファイアウォール設定です。
cat /usr/local/etc/pf.conf# 外部インターフェースとIPアドレスを定義
ext_if="vtnet0"
ext_ip="198.13.39.207"
# TCPおよびUDPサービスを定義
ext_tcp_ports="{ ssh, smtp, smtps, imaps, http, https, domain }"
ext_udp_ports="{ domain, ntp }"
# 内部インターフェース
int_if = "bridge0"
localnet = $int_if:network
# Jail '10.8.8.5'へのhttpおよびhttpsのポート転送
ports_to_forward="{ 80, 443 }"
forward_host="10.8.8.5"
# localhostをスキップ
set skip on lo0
# ログインターフェース
set loginterface $ext_if
# jailからインターネット、インターネットからjailへのnat(httpおよびhttpsのみ)
nat on $ext_if inet from $localnet to any -> ($ext_if)
rdr on $ext_if proto tcp from any to any port $ports_to_forward -> $forward_host
# デフォルトポリシー
block in all
pass out all keep state
# Pingを許可
pass inet proto icmp icmp-type echoreq
pass from { self, $localnet } to any keep state
pass in on $ext_if proto {udp, tcp} from any to any port $ports_to_forward keep state
# サービスを許可
pass in proto tcp from any to any port $ext_tcp_ports
pass in proto tcp from any to any port $ext_udp_ports
# sshとhttpのアクセスをログ
pass log quick proto tcp from any to any port { ssh,http }ステップ4 - Iocageを使用して新しいjailを作成する
FreeBSDシステムでネットワークとpfファイアウォールを構成した後、iocageを使用して新しいjailを作成する準備が整いました。
以下のiocageコマンドを使用して、FreeBSDリリース「12.0-RELEASE」を使用して「jail01」という新しいjailを作成します。
iocage create -n jail01 -r 12.0-RELEASE次に、jailのIPアドレスとデフォルトルーターゲートウェイを追加します。「jail01」にIPアドレス「10.8.8.5」を与え、デフォルトルーターゲートウェイは「bridge0」ホストIPアドレス「10.8.8.1」です。
iocage set ip4_addr="bridge0|10.8.8.5" jail01
iocage set defaultrouter="10.8.8.1" jail01jailを起動時に開始するように設定します。
iocage set boot=on jail01jailリストを確認します。
iocage listこれで、IPアドレス「10.8.8.5」を持つ「jail01」と、FreeBSDリリース「12.0」に基づく情報が得られます。

次に、以下のコマンドを使用して「jail01」を起動します。
iocage start jail01jailが起動したら、以下のコマンドを使用してjailにアクセスします。
iocage console jail01以下のように、jail01内に新しいシェルが表示されます。

jail内で、’jail01’の’bridge0’インターフェースのIPアドレスを確認します。
ifconfig bridge0これにより、’bridge0’インターフェースが設定されたIPアドレス「10.8.8.5」を持っていることが確認できます。

その結果、「jail01」という新しいjailが作成されました。
ステップ5 - テスト
このステップでは、jail01にNginxウェブサーバーをインストールし、ネットワークの外部からNginxにアクセスし、接続が「jail01」にリダイレクトされるかどうかをテストします。
まず、以下のpkgコマンドを使用してjail内のバイナリパッケージを更新します。
pkg update
その後、以下のpkgコマンドを使用してjail内にnginxウェブサーバーをインストールします。
pkg install nginxインストールが完了したら、nginxサービスをシステム起動に追加し、nginxサービスを開始します。
sysrc nginx_enable=yes
service nginx start次に、’jail01’でオープンポートのリストを確認します。
sockstat -l4これにより、NginxサービスがHTTPポート「80」で稼働していることが確認できます。

次に、’jail01’のデフォルトのindex.htmlページを変更します。
‘/usr/loca/www/‘ディレクトリに移動し、’index.html’ファイルを編集します。
cd /usr/local/www/
edit nginx-dist/index.htmlいくつかの変更を加えて終了します。
cat nginx-dist/index.html
今、ウェブブラウザからサーバーの外部IPアドレスにアクセスします。
これにより、’jail01’内のnginx index.htmlページが表示されます。

その結果、’jail01’が稼働しており、Nginxがインストールされています。サーバーへのすべてのHTTPおよびHTTPS接続は、’jail01’にリダイレクトされます。
参考文献
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。