VirtualBoxのゲストOS内のPostgreSQLとIISに外部からアクセスする方法

# はじめに
日本のコロナ禍は以前よりは収束してきましたが、海外の方はまだまだです。その影響で海外の工場は稼働停止状態となり、国内で海外で製造するはずだった部品を作ることになりました。
PCサーバー(Windows Server 2016 + PostgreSQL)を置いていない環境でラインが稼働することになり、サーバー内で運用している一部のアプリケーションを、ノートPC(Windows 10 + PostgreSQL)で動かせないか検証して欲しい旨の要望がありました。

検証ということで何度もやり直せる方が良いだろうと、VirtualBoxを用いた仮想環境で検証環境を構築すればスナップショットで指定の状態に戻すことが出来るので、採用することにしました。性能検証は実機を使用します。

# VirtualBox
VM VirtualBoxとは、Oracleが開発しているx86仮想化ソフトウェア・パッケージである。

https://www.virtualbox.org/

## インストール
Windows版ダウンロード
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp

## ゲストOSの構築
### 64bit OS
最初に社内の仮想サーバー(Windows Server 2016)内にVirtualBox をインストールして仮想マシンを作成しようとした際、 64bitが選択肢に表示されませんでした。

https://engineer-ninaritai.com/virtualbox-64bit/

64bit OS(例 Windows/Ubuntu)を構築するには、Hyper-Vが有効化されている必要がありました。社内の仮想環境ではHyper-Vが有効化できないようなので、物理サーバー(Windows Server 2016)内に構築しました。

### 32bit OS
32bit OS(例 Windows/Ubuntu)を構築するには特に制限はない。

### Guest Additions
VirtualBox Guest AdditionsはゲストOSにインストールすることで、ホストOSとゲストOS間のより緊密な統合を行い、ゲストOSをより使いやすくするための以下の機能が利用できるようになります。

  * シームレスなマウス操作
  * 共有フォルダー
  * デスクップ解像度の変更
  * シームレスなウィンドウサイズの変更
  * ホストとの時刻の同期
  * クリップボードの共有
  * オートログオン

https://pc-karuma.net/virtualbox-install-guest-additions/

# ネットワーク設定
デフォルトは、「NAT」となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/6590da50-09e9-2703-7ef4-37080e67eb1f.png)

ネットワークアドレスは、`10.0.2.0/24` で、ゲストOSのIPアドレスは、`10.0.2.15` が割り当てられます。
`10.0.2.2` はゲートウェイ、`10.0.2.3` はネームサーバ、`10.0.2.4` はTFTPサーバーが割り振られます

ネットワーク設定は幾つかあるが、NATとポートフォワーディングで用は足せる。

* [VirtualBox: ネットワーク設定](http://zorinos.seesaa.net/article/450304938.html)
* [VirtualBoxで使用出来るネットワークアダプタについて](https://blog.flan999.com/?p=177)
* [Chapter 6. Virtual Networking](https://www.virtualbox.org/manual/ch06.html#network_nat)

## ポートフォワーディング
ポートフォワーディングとは、インターネットから特定のポート番号宛てに届いたパケットを、あらかじめ設定しておいたLAN側の機器に転送する機能です。

ゲストOSのIPアドレスは、`10.0.2.15` が割り当てられるが、ホストや外部から`10.0.2.15`にPINGしても応答しません。
ゲストOSのPostgreSQLにアクセスしたい場合、ポートフォワーディングの機能を使用する。

https://elephantcat.work/2020/02/04/post-403/

https://8oclockis.blogspot.com/2018/04/virtualbox.html

ネットワーク設定で割り当てに「NAT」を選択すると「ポートフォワーディング」ボタンが表示されるのでクリックします。
ポートフォワーディングの設定例として、IISとPostgreSQLを設定します。ゲストIPは空欄でも構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/fcb6da1c-56cc-aa6d-f7dc-f2b455bc92f2.png)

ホストPCにもPostgreSQLとIISが入っており、どちらもデフォルトポートを使用しているため、今回ポートフォワーディング用ポートとして`5435`と`8080`を使用しています。

## ファイアウォール
それにともないホスト側のファイアウォールで、PostgreSQLならポート`5435`およびIISならポート`8080`を受信許可にしておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/6750f081-8ac1-4db0-4c2b-9e9975390f9f.png)

# 外部アクセス
ポートフォワーディング機能により、指定したポートがゲストOS内のポートに置き換わることでアクセスができるようになる。

## データベース接続
データベース接続ツール(例 A5:SQL Mk-2)のサーバー名には、ホストのIPアドレスを指定しポート(例 `5435`)を指定することで、ゲストOS内のPostgreSQLにアクセスが出来るようになる。

## Web接続
ゲストOS内IISにアクセスするには、ホストのIPアドレスを指定しコロン(:)後にポート(例 `8080`)を付与する。

```
http://ホストIPアドレス:8080/Test/sample.aspx
```

# 最後に
これでノートPC(Windows 10 + PostgreSQL)を使用した検証環境の構築ができるようになりました。
これまで社内のVirualBoxを使用方法として、アプリケーションのインスートール検証やプログラムの不具合検証といったくらいだったので、ゲストOS内のPostgreSQLとIISを外部からアクセスするには、どうやればいいのか知識が足りなかったので調べながら半日くらいかかってしまった。
ゲストOSのIPアドレスは、`10.0.2.15`が割り当たっていますが、このIPアドレスでは外部からはPING応答しないし、VirtualBoxのネットワーク設定を読んでも方法が幾つもあって理解がすすまなかった。それはポートフォワーディングの意味をちゃんと理解できてなかったからですね。ポートフォワーディングの意味を理解したら、そういうことかとあっさり解決しました。