概要
タイトルのとおり。ホスト OS Windows10 から VirtualBox のゲスト OS CentOS 7 上のサービスにアクセスするための、ホスト OS 側、VirutualBox 自体、そしてゲスト OS 側の設定を自分のためにメモ。
前提
- ホスト OS 「jnana」: Windows10
- サブネットワーク blue、192.168.13.0/24 (*.blue.mato.me) に所属
- gw を介してインターネットに接続
- サブネットワーク blue、192.168.13.0/24 (*.blue.mato.me) に所属
- ゲスト OS のネットワーク割り当ては「NAT ネットワーク」で
- ゲスト OS 同士が同じセグメントに入るように
- サブネットワーク名 pink : 10.13.73.0/24 (*.pink.mato.me)
- pink 内のゲスト OS からはホスト OS jnana を含めた blue 内のホスト、およびそこを経由してインターネットにもアクセス可能
- ゲスト OS 上のサービスには VirtualBox のポートフォワーディングで対応
- 必要に応じてフォワードするポートを追加していく
- ゲスト OS 「jupiter」 : CentOS 7
- jupiter 上の x 番ポートへはホスト OS の (20000 + x) 番ポートからフォワーディング
- 例えば ssh なら jnana:20022 → jupiter:22 として、jnana 上のターミナルソフトから localhost:20022 に接続
- jupiter 上の x 番ポートへはホスト OS の (20000 + x) 番ポートからフォワーディング
具体的な設定
ホスト OS の Windows ファイアウォール
忘れがちだけど、ファイアウォールでポートフォワードするポートのパケット受信を許可しないといけない。
「受信の規則」はサービスごとに (すなわちフォワードするポート番号ごとに) 作ってもよいが、jupiter 上のサービス用に一括して作ると楽かもしれない。
ここでは、「ホスト OS 自身からの2万番台のポートに来たパケットはすべて pink サブネットワーク内にフォワード」という規則の設定方法をスクリーンキャプチャ画像で示す。「プログラム」として VBoxNetNAT.exe
を指定し、TCP の「20000-29999」を許可。エッジトラバーサルはブロックし、「スコープ」の「ローカル IP アドレス」は「127.0.0.1」に限定する。規則名は「+port forwarding to jupiter」とする。
補足
- 規則名は「+」などで始めるようにしておくと、規則の一覧のときに探しやすい。
- もし、ホスト OS jnana 以外の blue サブネットワーク内のマシンからアクセスさせたい場合は「スコープ」で「ローカル IP アドレス」を指定しない ... のでいいのだが、「+port forwarding to jupiter」の制限を弱めるよりも、そのサービス、例えば http であれば「+port forwading to jupiter:80」とかの別規則を新たに作り、「ローカル IP アドレス」を指定しない代わりにポートを「20080」に限定する。
- pink 内に複数のゲスト OS (あるいは同一 OS の別ネットワークアダプタ) がある場合は「20xxx」番ポートが jupiter 用、「21xxx」番ポートがまた別の OS 用、などとしてもよい。
ポートフォワーディング
ポートフォワーディングの設定は、「仮想マシン jupiter の [設定]」ではなく、「VirtualBox マネージャーの [ファイル]→[環境設定...]」から「ネットワーク」をたどって行う (かなりハマった)。スクリーンキャプチャ画像に示すとおり。ここでは
- ホスト OS から ssh 接続するためのルール : Rule 1
- ホスト OS jnana を含む blue サブネットワーク内から http 接続するためのルール : Rule 3, 4, 5
- blue ネットワークでは dhcp サーバで固定 IP を払い出しているが、jnana は有線でつなぐとき (192.168.13.73) と無線でつなぐとき (192.168.13.120) で IP アドレスが違うので両方登録してある
- ホスト OS からユーザレベルサービスに接続するためのルール : Rule 7, 8
ゲスト OS のファイアウォール
/usr/lib/firewalld/services/nodeapp.xml
を作り、firewall-cmd --add-service
する (xml ファイルは正しくは /usr/lib/
にではなく、/etc/
に、すなわち /etc/firewalld/services/nodeapp.xml
に作るべきだったかもしれない)。
[takeyuki@jupiter ~]$ sudo vi /usr/lib/firewalld/services/nodeapp.xml
[takeyuki@jupiter ~]$ sudo cat /usr/lib/firewalld/services/nodeapp.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>node app</short>
<description>node app</description>
<port protocol="tcp" port="3000"/>
<port protocol="tcp" port="8080"/>
</service>
[takeyuki@jupiter ~]$ sudo firewall-cmd --add-service=py-app --zone=public --permanent
success
[takeyuki@jupiter ~]$ sudo firewall-cmd --reload
success
[takeyuki@jupiter ~]$ sudo firewall-cmd --list-services --zone=public --permanent
dhcpv6-client http nodeapp ssh