仮想化ゲストOSのポートをホストのポートとして公開する。ゲストOSのSSH(22)やWWW(80)をホスト側のネットワークにマッピングする。
簡単なイメージは次の通り。
---------- -------------- ---------- | | |ホストOS NAT| |ゲストOS| |ユーザー|------|80 |-----|80 | | | | | | | ---------- -------------- ---------- ---------- -------------- ---------- | | |ホストOS NAT| |ゲストOS| |ユーザー|------|22 |-----|22 | | | | | | | ---------- -------------- ----------
コマンドでNATを設定。
virtualBoxのNATモードは内部的にルータ動作している。さらに、virtualBoxがホストのポートにBindしListenてくれる。仮想ネットワークはiptablesを素で設定できる程度の理解力が必要だ。だけど、動かすだけなら、コピペで良いだろう。とりあえず動かしてみよう。
VBoxManage setextradata "win2008webserver" "VBoxInternal/Devices/e1000/0/LUN#0/Config/iis/Protocol" TCP VBoxManage setextradata "win2008webserver" "VBoxInternal/Devices/e1000/0/LUN#0/Config/iis/GuestPort" 80 VBoxManage setextradata "win2008webserver" "VBoxInternal/Devices/e1000/0/LUN#0/Config/iis/HostPort" 80 #注意80番はUNIXユーザー権限では使えない。エラーも出ない。一般ユーザーのときは8080にする
変更を確認する。
cat /home/gscc/.VirtualBox/Machines/win2008webserver/win2008webserver.xml ... <ExtraDataItem name="VBoxInternal/Devices/e1000/1/LUN#0/Config/iis/Protocol" value="TCP"/> <ExtraDataItem name="VBoxInternal/Devices/e1000/1/LUN#0/Config/iis/GuestPort" value="80"/> <ExtraDataItem name="VBoxInternal/Devices/e1000/1/LUN#0/Config/iis/HostPort" value="80"/> </ExtraData> ..
コマンド解説
コマンドの意味は次の通り。
VBoxManage setextradata 仮想マシン名 "VBoxInternal/Devices/仮想NIC種類/仮想NIC番号/LUN#0/Config/フォワード名称/Protocol" TCP VBoxManage setextradata 仮想マシン名 "VBoxInternal/Devices/仮想NIC種類/仮想NIC番号/LUN#0/Config/フォワード名称/GuestPort" 80 VBoxManage setextradata 仮想マシン名 "VBoxInternal/Devices/仮想NIC種類/仮想NIC番号/LUN#0/Config/フォワード名称/HostPort" 8080
仮想マシン名 | VBoxManage list vms で表示される 仮想マシン名 |
---|---|
仮想NIC種類 | ネットワークアダプタの種類。Intelを選んだら、e1000/ pcnet を選んだらpcnetとかく。 |
仮想NIC番号 | 仮想NICは8本まで設定できる。そのうち"同一種類"の何本目か。0から数える。pcnetの2本目なら /pcnet/1 Intelの一本目なら/e1000/1 |
フォワード名称 | 任意の名前、この名で設定をグループ化 |
ポート番号 | GesutPortがゲストOSのポート、HostPortがホストOSのポート、Protcolは殆どの場合TCP |
公式を読に書いてある。
詳しくは、公式ドキュメント77ページを参照すること。
http://wikis.sun.com/download/attachments/38211768/UserManual-ja.pdf
設定例
ホストOSの8080でゲストOSの80番 Windows2008Server IISを公開する場合。
VBoxManage setextradata "win2008webserver" "VBoxInternal/Devices/e1000/0/LUN#0/Config/iis/Protocol" TCP VBoxManage setextradata "win2008webserver" "VBoxInternal/Devices/e1000/0/LUN#0/Config/iis/GuestPort" 80 VBoxManage setextradata "win2008webserver" "VBoxInternal/Devices/e1000/0/LUN#0/Config/iis/HostPort" 80
ホストOSの22でゲストOSのSSHを公開する場合。
VBoxManage setextradata "win2008webserver" "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/Protocol" TCP VBoxManage setextradata "win2008webserver" "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/GuestPort" 22 VBoxManage setextradata "win2008webserver" "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/HostPort" 22 #1024以下はrootしか使えない
ホスト側のポート番号に注意すること。
何度も書いているように、Linuxの一般ユーザーは、well-knownポートをListenすることが出来ない。一般ユーザーでVirtualBoxを起動してもエラーがでない。なので、ホストOS側の特権ユーザー(root)でvirtualBoxを起動する必要がある、
well-knownポートを使いたい
回避するにはiptablesを使う。
ホスト側でポートを転送する
特権ユーザー以外がポート80を使えない。そこで次のようにポートを変換する。
ホストOSの80をホストOSの8080に転送する。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
参考 iptables設定 http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/redirecttarget.html
追記:
ただしDebian GNU/Linuxの場合は、/etc/init.d/iptablesが存在しないので注意すること。ハマりました。
Debianではiptablesがもはや/etc/init.dにないとか。
書き方がチョット変わってた。
http://debian.fam.cx/index.php?cmd=read&page=Software%2Fiptables
http://saikyoline.jp/weblog/2009/03/07/041852.html
iptablesの設定が一筋縄に行かないね