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ファイアウォールを設定する方法

私たちが行うこと:

  1. Iocage Jail Managerをインストールする
  2. FreeBSDリリースをダウンロードする
  3. 共有IPとpfファイアウォールを設定する
  4. Iocageを使用して新しいjailを作成する
  5. テスト

ステップ1 - FreeBSDにIocageをインストールする

最初に、FreeBSDシステムにIocage Jailマネージャーをインストールおよび構成します。IocageはPythonで書かれており、FreeBSDのバイナリパッケージリポジトリで入手可能です。

以下のpkgコマンドを使用して、FreeBSDシステムにIocageをインストールします。

pkg install py36-iocage

Iocage 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" jail01

jailを起動時に開始するように設定します。

iocage set boot=on jail01

jailリストを確認します。

iocage list

これで、IPアドレス「10.8.8.5」を持つ「jail01」と、FreeBSDリリース「12.0」に基づく情報が得られます。

次に、以下のコマンドを使用して「jail01」を起動します。

iocage start jail01

jailが起動したら、以下のコマンドを使用して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アドレスにアクセスします。

http://198.xx.xx.207/

これにより、’jail01’内のnginx index.htmlページが表示されます。

その結果、’jail01’が稼働しており、Nginxがインストールされています。サーバーへのすべてのHTTPおよびHTTPS接続は、’jail01’にリダイレクトされます。

参考文献

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。