それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

virtualBox仮想ゲストOSのポートを公開する。

仮想化ゲスト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の設定が一筋縄に行かないね