vnetが動かないqjailを無理やり動かしてみる

追記.2014/08/05
記事を修正しました。
qjail configでvnetが動きました。

qjail config -vを使う方法

# qjail config -v test01
 
At this time only ipfw firewall is vimage aware and can
run on the host and in the vnet jail at the same time.
 
Chose by entering ipfw or none and pressing the enter key.
none
 
There are two network configuration methods available for
connecting this vnet/vimage jail to the public internet.
The bridge/epair method and the netgraph method.
Chose which network method you want this vimage jail to use
by entering [ be ] for bridge/epair or [ ng ] for netgraph
and pressing the enter key.
be
Successfully enabled vnet for test01

noneを入力すると、ipfwを使いません。
epairを使うならば、beを入力します。

しかし、この方法だとqjail startした時にepairが1つ自動生成され、プライベートIPアドレスが自動で割り当てられるので、
自分で全てepairを作りたいときには正直邪魔です。
そのようなときには以下の2つの方法を使ったほうがいいです。

ソースコードを書き換える方法

ソースコードを書き換えるのに抵抗がなければ圧倒的にこちらのほうが楽です。
qjail Version 3.6のソースコードです。
/usr/local/bin/qjailを書き換えます。

echo "ip4,addr~ をコメントアウト

  echo "ip4.addr            =  ${ip4};"

    ↓

  #  echo "ip4.addr            =  ${ip4};"

echo vnet;を行う行のifをコメントアウトし、常に行われるようにする

    if [ ${vnet} ]; then 

    ↓

  #  if [ ${vnet} ]; then 
    fi 

    ↓

 #   fi 


この状態でqjail createし、startすれば、vnetが有効化されている状態になります。

qjailはBSDライセンスなので、ソースコードを改変して頒布しても著作権明記をすれば問題無いはずです。
しかしソースコードを書き換えてしまうと常にvnetが有効になってしまうので注意。

/usr/local/etc/qjail.vnet/を使う方法

まず、いつものように、qjail createをします。すると/usr/local/etc/qjail.local/test01が生成されます。

# cat /usr/local/etc/qjail.local/test01
name="test01"
ip4="0.0.0.0"
ip6=""
path="/usr/jails/test01"
interface="em1"
fstab="/usr/local/etc/qjail.fstab/test01"
securelevel=""
cpuset=""
fib=""
vnet=""
vinterface=""
rsockets=""
ruleset=""
sysvipc=""
quotas=""
nullfs=""
zfs=""
poststartssh=""
deffile="/usr/local/etc/qjail.local/test01"
image=""
imagetype=""
imageblockcount=""
imagedevice=""

ここからvnetを書き換えます。

vnet=""

    ↓

vnet="yes"

次に、/etc/jail.confを見ます。

test01 {
host.hostname       =  "test01";
path                =  "/usr/jails/test01";
mount.fstab         =  "/usr/local/etc/qjail.fstab/test01";
exec.start          =  "/bin/sh /etc/rc";
exec.stop           =  "/bin/sh /etc/rc.shutdown";
exec.consolelog     =  "/var/log/qjail.masterRouter.console.log";
mount.devfs;
ip4.addr            =  "0.0.0.0";
interface           =  "em1";
devfs_ruleset       =  "4";
}

もし作成されていなければqjail start test01;qjail stop test01をすれば作成されると思います。
/usr/local/etc/qjail.vnet/test01を作成し、この内容をコピーします。そして、
ip4,addrの行を削除し、vnet;を追加します。↓

test01 {
host.hostname       =  "test01";
path                =  "/usr/jails/test01";
mount.fstab         =  "/usr/local/etc/qjail.fstab/test01";
exec.start          =  "/bin/sh /etc/rc";
exec.stop           =  "/bin/sh /etc/rc.shutdown";
exec.consolelog     =  "/var/log/qjail.masterRouter.console.log";
mount.devfs;
interface           =  "em1";
devfs_ruleset       =  "4";
vnet;
}

そしてqjail startをすると、vnetが有効化されたjailが出来上がります。