メモ：ホスト OS Windows10 から VirtualBox のゲスト OS CentOS 7 上のサービスにアクセスする設定

# 概要
タイトルのとおり。ホスト OS Windows10 から VirtualBox のゲスト OS CentOS 7 上のサービスにアクセスするための、ホスト OS 側、VirutualBox 自体、そしてゲスト OS 側の設定を自分のためにメモ。

# 前提

- ホスト OS 「jnana」: Windows10 
    - サブネットワーク blue、192.168.13.0/24 (*.blue.mato.me) に所属
        - gw を介してインターネットに接続
- ゲスト 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 に接続

# 具体的な設定
## ホスト OS の Windows ファイアウォール
忘れがちだけど、ファイアウォールでポートフォワードするポートのパケット受信を許可しないといけない。
「受信の規則」はサービスごとに (すなわちフォワードするポート番号ごとに) 作ってもよいが、jupiter 上のサービス用に一括して作ると楽かもしれない。

ここでは、「ホスト OS 自身からの2万番台のポートに来たパケットはすべて pink サブネットワーク内にフォワード」という規則の設定方法をスクリーンキャプチャ画像で示す。「プログラム」として `VBoxNetNAT.exe` を指定し、TCP の「20000-29999」を許可。エッジトラバーサルはブロックし、「スコープ」の「ローカル IP アドレス」は「127.0.0.1」に限定する。規則名は「+port forwarding to jupiter」とする。

![fw1.png](https://qiita-image-store.s3.amazonaws.com/0/64927/e3bb3994-6200-3bf0-a28c-3b92ec5e9d5a.png)

![fw2.png](https://qiita-image-store.s3.amazonaws.com/0/64927/02f0b086-3585-80a3-5459-b9763e0e1a98.png)

### 補足
- 規則名は「+」などで始めるようにしておくと、規則の一覧のときに探しやすい。
- もし、ホスト 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

![ポートフォワーディング.png](https://qiita-image-store.s3.amazonaws.com/0/64927/a5fe9a44-32a8-d249-4ed6-39173dc82b7d.png)

## ゲスト OS のファイアウォール
`/usr/lib/firewalld/services/nodeapp.xml` を作り、`firewall-cmd --add-service` する (xml ファイルは正しくは `/usr/lib/` にではなく、`/etc/` に、すなわち `/etc/firewalld/services/nodeapp.xml` に作るべきだったかもしれない)。

```shell-session
[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
```

# enjoy !!

# 参考
 -[CentOS7のfirewalldをまじめに使うはじめの一歩（systemdも少し）](http://qiita.com/shrkw/items/8410e9cb65eb789a40e1)