qjailでVIMAGEなプロキシサーバを作ってみる
- 公開日: 2025/05/27(火) 21:43[JST]
- 更新日: 2025/05/27(火) 21:43[JST]
うちのインターネット環境は固定IPやら電話回線の都合でフレッツ光にしている。しかし特に平日の日中に速度が低下して職場への(sshトンネル経由の)リモートデスクトップ接続がまともに機能せず、ローカルでできる作業はなるべくローカルでやることでしのいでいた。そこで、KDDIの光回線を追加した。インターネット接続のゲートウェイが同一ネットワークセグメント内に2つできたことになる。
ルーティングテーブルをいじって職場へのアクセスはKDDI経由にしてこれはこれでいいのだが、せっかくの回線なので一番トラフィックが多いであろうwebもKDDI経由にしたくなった。そうすると「ルーティングテーブルのdefaultがKDDIのルータであるようなプロキシサーバ」を用意すればいいということになるが、このためだけに専用の物理サーバを用意するのも馬鹿馬鹿しい。10年ぐらい前に実装されたjailのVIMAGE機能を使えば、ホストとjail内とで別々のルーティングテーブルにすることが可能らしい、ということは知っていたので挑戦してみた。
現在jailの管理に使っているqjailがVIMAGEに対応していればいいんだけど、と調べてみたらQiitaの@psaxuww氏による「FreeBSD 12.0で Jail(VIMAGE) を qjail で構築」という記事がヒットした。ただ現在はqjailのバージョンアップにより設定コマンドが多少変わったのと、うまく動かなかったところもあった。ちなみに、公式ドキュメントである qjail-vnet-howto だが、qjail公式サイトやFreeBSD.orgにあるman も前バージョンのものしかなく、実際のFreeBSD環境で man qjail-vnet-howto しないと現行のドキュメントは読めない。
以下の作業は原則rootで行った。
1. jailの作成
qjail create -4 IPアドレス jail名 でjailを追加する。IPアドレスはホストと同一セグメントのもの。通常のjailと違いホストの /etc/rc.conf でjailのIPアドレスは設定しない。
2. jailのVIMAGE化
qjail config -v none jail名 でこのjailをVIMAGE対応にする。無事設定したらとりあえず qjail start jail名 でjailを起動する。ホストで ifconfig -a すると bridge10 と epairNa (Nは数字)というネットワークインターフェースが追加され、bridge10 にはIPアドレス xxx.yyy.zzz.2 が割り当てられる。
qjail-vnet-howto では qjail console jail名 でjailコンソールを開けると書いてあるのだが、できなかった(VIMAGEじゃないjailはできる)ので jexec jailID csh でjailのコンソールを開く。ここで ifconfig -a すると epairNb というインターフェースにjailのIPアドレスが割り当てられていた。そして netstat -rn でルーティングテーブルを見てみると bridge10 に割り当てれらたIPアドレスがデフォルトゲートウェイとなっていた。
3. jailの細かな設定
qjail-vnet-howto にはこの状態で 8.8.8.8 (Googleのネームサーバ)への ping が通る、と書かれているのだがこの状態では外部どころかLAN内のIPアドレスにすら ping が通らなかった。調べてみると、jail側の /etc/rc.conf で以下の行を追加する必要があるらしい。
firewall_enable="YES" firewall_type="open"
また、jailをインストールしたFreeBSD機はルータ兼用でネットワークアダプタは2つあり、一方がLAN、他方がDMZ(NTTの光モデムがある方)につながっているのだが、ホスト側で qjail list してみるとVIMAGEなjailにはDMZ側のネットワークアダプタがアサインされていた。これも直さなきゃ、ということで /usr/local/etc 以下にあるqjailの設定を見てみると、 qjail.global/jail名 と qjail.local/jail名 というファイルに vinterface という項目がありそこでDMZ側のネットワークアダプタが指定されていた。ということで、いったんこのjailを qjail stop jail名 で終了させたのちに上記ファイルを修正し、再びjailを起動。
4. ルーティングテーブルの設定
ここまでやったところ、LAN内への ping は通るようになったが、ルータ越えのpingは通らない。そもそもデフォルトゲートウェイはKDDIのルータにする必要がある。
ということで、いったんこのjailを終了させ、ルーティングテーブルの設定を行う。ルーティングテーブルは /usr/local/etc/qjail.config/jail名 で設定するようになっている。このファイル内で exec.start += "route add default xxx.yyy.zzz.2"; となっている行があるので xxx.yyy.zzz.2 をKDDIのルータのIPアドレスにする。ついでに設定しておきたいルーティング設定もしておこう。今回はホスト自体がルータなのでデフォルトゲートウェイ以外はホストと同じでいいはずだ。
この設定をやった上でjailを起動すると、jail内でもインターネットへの ping が通るようになり、DNSでの名前解決もちゃんとできるようになった。これでようやく pkg が使えるようになった。あとはsquidをインストールして設定、起動すれば無事完了、と思いきやもう一つ落とし穴が。pamのエラーとかでsquidが起動できない。
調べたところ、jail側で /etc/pam.d/system にある pam_opie* という文字列のある行をすべてコメントアウトする必要があるらしい。この修正をしてjailを再起動したところ無事squidが動くようになった。