FreeBSD · 2 min read · Jan 24, 2026

FreeBSDでVNCサーバーを使用したジェイルの作成

FreeBSDでVNCサーバーを使用したジェイルの作成

この記事では、FreeBSDのジェイル内でVNCサーバーを実行する方法を説明します。

ソースからのジェイルの作成:

ジェイルを保存するディレクトリを作成します:

# mkdir -p /home/jails

または/usrディレクトリに:

# mkdir -p /usr/jails
# mkdir /home/jails/testjail

/usr/srcディレクトリに移動し、FreeBSDのソースコードがあるか確認します。

# cd /usr/src
# ls

そのようなものが表示されるはずです:

COPYRIGHT               contrib                 release
LOCKS                   crypto                  rescue
MAINTAINERS             etc                     sbin
Makefile                games                   secure
Makefile.inc1           gnu                     share
ObsoleteFiles.inc       include                 sys
README                  kerberos5               tools
UPDATING                lib                     usr.bin
bin                     libexec                 usr.sbin

空のディレクトリまたはsysディレクトリのみがある場合は、FreeBSDのソースコードをインストールする必要があります: sysinstallを実行するか、cvsからソースコードをダウンロードできます。

# sysinstall

設定に移動し、ディストリビューションを選択して「src」を選択し、okを押します。その後、/usr/src/ディレクトリにすべてのソースコードがあるはずです。その後、cvsから最新バージョンでソースコードを更新する必要があります。ホームディレクトリまたは他の場所に「stable-supfile」というファイルを作成する必要があります。

# vi ~/stable-supfile

以下のような行を追加します:

# Your closer mirror of freebsd source code, for me is from Poland
*default host=cvsup.pl.FreeBSD.org
*default base=/usr
*default prefix=/usr
# for version 7.2 of FreeBSD you put RELENG_7_2 7.1 - RELENG_7_1 7.0 - RELENG_7_0 6.4 RELENG_6_4
*default release=cvs tag=RELENG_7_2
*default delete use-rel-suffix
*default compress
src-all

次に、ファイルを保存した後、csupでFreeBSDのソースコードを更新できます:

# csup /root/stable-supfile

その後、ソースコードからジェイルをコンパイルできます:

# cd /usr/src
# make world DESTDIR=/home/jails/testjail
# make distribution DESTDIR=/home/jails/testjail

一度Worldをコンパイルすると、もう一度Worldをコンパイルせずに2つのコマンドで新しいジェイルを作成できます:

# make installworld DESTDIR=/home/jails/otherjail
# make distribution DESTDIR=/home/jails/otherjail

ジェイルが準備できたら、いくつかの設定ファイルに変更を加える必要があります。

# vi /home/jails/testjail/etc/rc.conf

そこに以下を追加します:

sendmail_enable="NONE"
sshd_enable="YES"
# cp /etc/resolv.conf /home/jails/testjail/etc/
# touch /home/jails/testjail/etc/fstab

初めてのジェイルの実行:

ジェイルを実行するには、devfsをジェイルにマウントする必要があります:

# mount -t devfs devfs /home/jails/testjail/dev

次に、ネットワークインターフェースにエイリアスを設定する必要があります。私のFreeBSDではbge0インターフェースがあり、エイリアスは次のように作成します:

# ifconfig bge0 alias 192.168.2.2

ジェイルを実行:

# jail /home/jails/testjail shell 192.168.2.2 /bin/tcsh

ジェイル内にいるときに、rootパスワードを設定できます:

# passwd

次に、ssh経由でジェイルにアクセスできるように、1つの非rootアカウントを追加する必要があります。

# adduser

ジェイルを離れるには、exitコマンドを使用する必要があります。

# exit

あなたのジェイルはほぼ準備が整いました。/etc/rc.confファイルにいくつかの行を追加する必要があり、その後、サーバーが起動するときにジェイルが起動します。

# alias to your network interface
ifconfig_bge0_alias0="192.168.2.2"
# line that enabling jails in freebsd
jail_enable="yes"
# list of your jails ex. “testjail otherjail httpjail sshjail”
jail_list="testjail"
jail_testjail_rootdir="/home/jails/testjail"
jail_testjail_hostname="testjail"
jail_testjail_ip="192.168.2.2"
jail_testjail_exec_start="/bin/sh /etc/rc"
jail_testjail_exec_stop="/bin/sh /etc/rc.shutdown"
jail_testjail_devfs_enable="YES"

ジェイル内にポートツリーを持ちたいが、複製したくない場合は、/etc/fstabファイルに1行を追加して/usr/ports/ディレクトリをジェイルにマウントできます。次のような行:

/usr/ports              /home/jails/testjail/usr/ports/         nullfs  rw,auto 0 0

システムを再起動せずにジェイルを起動および停止:

# /etc/rc.d/jail start testjail
# /etc/rc.d/jail stop testjail

ジェイルのリストを取得したい場合は、次のコマンドで取得できます:

# jls

パッケージからジェイル内にxorgとvncをインストール:

# pkg_add –r xorg
# pkg_add –r vnc

ユーザーアカウントでvncを実行するには、次のように入力します:

$ vncserver

初めてvncserverを実行するときは、vnc接続のためのパスワードを設定する必要があります。

デフォルトでは、vncに接続するとtwmが実行されます。~/.vnc/xstartupファイルを編集することで変更できます。最後の行を「twm &」から「wmaker &」などに変更する必要があります。

vncジェイルに接続するには、vncviewerでjail_ip_addressとvncポートを入力する必要があります。例: 192.168.2.2:1

ジェイル内のvncに関するいくつかのエラー: 色を認識しないというメッセージが表示された場合は、/usr/local/bin/vncserwerファイルを編集し、次の行を変更する必要があります:

$cmd .= " -co /usr/X11R6/lib/X11/rgb";

「!!!!!!!!!!!!!!!!!!!!!!!!!! no free display on jailname」というメッセージが表示された場合は、/usr/local/bin/vncserverを編集し、CheckDisplayNumber関数内の2行のpack関数をsockaddr_inに変更する必要があります:

[…]
pack ---> sockaddr_in(6000 +$n, &INADDR_ANY))) {
[…]
pack ---> sockaddr_in(5900 +$n, &INADDR_ANY))) {
[…]

コードは次のようになります:

sub CheckDisplayNumber
{
    local ($n) = @_;
    socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
    eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
    if (!bind(S, sockaddr_in(6000 + $n, &INADDR_ANY))) {
        close(S);
        return 0;
    }
    close(S);
    socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
    eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
    if (!bind(S, sockaddr_in(5900 + $n, &INADDR_ANY))) {
        close(S);
        return 0;
    }
    close(S);

ジェイルのためのIPFWでのポートフォワーディング

ジェイルにポートを転送したい場合は、いくつかのオプションを有効にしたFreeBSDカーネルをコンパイルしている必要があります:

options  IPFIREWALL
options  IPFIREWALL_DEFAULT_TO_ACCEPT
options  IPFIREWALL_VERBOSE
options  IPFIREWALL_FORWARD
options  IPDIVERT

ポートフォワーディングルール:

ipfw add fwd ip_adres_jail,port_jail tcp from any to adresip_local port_local
ex.
ipfw add fwd 192.168.2.2,21 tcp from any to me 21
ipfw add fwd 192.168.2.2,21 tcp from any to 72.46.154.23 21
Share: X/Twitter LinkedIn

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

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