複数のjailでtftpサーバを動かして外からアクセスしたいのですが、通常のIPv4とrdrでは1つのポートを一つのjailしか転送できません。
仕方が無いのでVNETを試して見ます。中身はもっと複雑ですが、大体の構成は以下のような感じです。
ドキュメントに書かれているように/etc/devfs.rulesに以下を書きます。この効用はよくわかりません。
[bastille_vnet=13]
add path 'bpf*' unhide
とりあえず、VNETなjailを作ります。
% sudo bastille create -V vnetjail 13.0-RELEASE 192.168.0.55/24 alc0
アドレスはalc0と同じネットワークで設定します。デフォルトルートが設定されないようなので、設定します。
% sudo bastille sysrc vnetjail defaultrouter="192.168.0.1"
% sudo bastille restart vnetjail
IPv4の時と同じようにinetdを動かしtftpを使えるようにしようとしましたが、うまく動きません。いろいろ試した結果pf.confのblock in allを外してpfで引っかからないようにして、IPv4で設定しているtftpポートのrdrをclearしたら動くようになりました。
rdrはclearすると一時的に消えますが、再起動すると元に戻ります。該当のjailを消すとrdrも消えますが、rdrだけ消す方法が分かりません。
IPv4とVNETは共存できるようなのですが、上のように微妙に干渉しています。またVNETのjailはIPアドレスが空で表示されたりしていて、0.8(20210115)ではVNETサポートは完全ではないのかもしれません。
VNETの設定は手動でやると結構複雑みたいですが、簡単にできるのは良い事だと思います。
IPv4で作ったjailをVNETに移すのはbastilleのsysrcとeditでできますが、ちょっと面倒です。
2024年2月にはいって突然IPv4なjailでgithubへのアクセスが不安定になり、別のホストでvnetだと大丈夫だったので設定変更しました。
editで以下を消して
interface = bastille0;
ip4.addr = 192.168.10.50;
ip6 = disable;
以下を追加します。
vnet;
vnet.interface = e0b_bastille0;
exec.prestart += "jib addm bastille0 re0";
exec.poststop += "jib destroy bastille0";
sysrcで以下を設定します。
ifconfig_e0b_bastille0_name="vnet0"
ifconfig_vnet0="inet 192.168.0.56/24"
defaultrouter="192.168.0.1"
/usr/local/bastille/jailの下にrdr.confが残ってるとrestartしたときにerrorになるので消しました。