Azure 仮想アプライアンス 利用時に NAT 無しで 外部のネットワークと 相互にルーティングさせる方法

# はじめに
Azure 仮想マシン や、仮想ネットワーク を使っている際に、いくつかのシチュエーションで、Azure 外のネットワークと通信させたい場合が出てきます。

以下のようなシチュエーションの際に、今回紹介する方法を使う事で、NAT 変換 を使わずに 相互ルーティングを可能にすることができます。

**シチュエーション 1**
Azure の既定では、S2S や P2S、ExpressRoute などの手段が用意されていますが、仮想ネットワークゲートウェイ をデプロイする必要があり、NAT 変換が不要で相互に通信が可能ですが、それなりにコストが掛かります。

代わりに、Azure VM を使って VPN ルーター（仮想アプライアンス）を構築して安価に済ます方法があります。この場合は NAT 変換 を使う方法が簡単で、一般的です。
しかし、外部から Azure VM への片方向の通信となってしまいます。

**シチュエーション 2**
Azure 上 の VM として Hyper-V を構築して、さらに Hyper-V 上に VM (Nested VM) を構成することが可能です。このとき、Nested VM から Azure VM への通信は、NAT 変換を使う方法が簡単で、一般的です。
しかし、Nested VM から Azure VM への片方向の通信となってしまいます。

この場合は、Hyper-V ホスト に RAS サービスを構成し、仮想アプライアンス と見立てて、ルーティングを構成すると、回避策にできる見込みがあります（まだ未検証）

**シチュエーション 3**
Azure VM として、Active Directory のドメインコントローラー を構築済です。
このたび、VPN ルーター（仮想アプライアンス）経由で 上記のドメインに、物理の追加ドメインコントローラーを構築したいです。
ドメインコントローラー間の接続において、NAT 変換はサポートされていません。困りました。

# 1. 構成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/74d05661-27a8-383d-4352-6172f89ef699.png)
- NAT が構成されている場合は、VPN クライアントから、VM への通信は可能だが、VM から VPN クライアントへのルーティングはできない。

- 本記事の構成を採用すると、VM から VPN クライアントへのルーティングが可能になります。

この記事では、仮想アプライアンス として OpenVPN と RAS (SSTP) を想定しています。
手順に使用した画面キャプチャは OpenVPN を想定したものになっていますが、他の方法で VPN を構築した場合でも、同様に扱えます。

:::note warn
本題とは逸れますが、Azure VM を使った VPN ルーターでは、IPsec では受付出来ない様子です。そのため、SSL-VPN を採用している仕組みのみが利用可能です。
私が検証してみて、本構成と組み合わせて実績があるのは、**OpenVPN** と、**Windows Server の RAS 役割サービス** を使った **SSTP** 接続です。
:::

**参考：OpenVPN**
OpenVPN の構築については、以下の記事を参考にしてください。
本記事の内容と組み合わせて、検証済みです。

https://qiita.com/carol0226/items/7a9160b298b736aa187e

**参考：SSTP**
SSTP の構築については、以下の記事を参考にしてください。
本記事の内容と組み合わせて、検証済みです。

https://qiita.com/carol0226/items/9e4efc903a8802a60cfd

# 2. NAT 無しで構成するために必要な事
NAT を使えば、これらの構成は不要で通信できるので楽なのですが、片方向です。
相互に通信させるために、直接ルーティングを行うためには、色々とテクニックを駆使する必要があります。
- アドレス空間の定義 (2-1 章)
- NIC の IP 転送 (2-2 章)
- ルーティングの構成 (2-3 章)

この記事では、既に NAT 変換を使って 外部から Azure VM への通信が確立できている状況から、NAT 無しの相互通信へ移行するための手順を案内していきます。

## 2-1.アドレス空間の定義（推奨）
この設定は、オプションですが、やっておくことをお勧めします。

単一の仮想ネットワーク の構成であれば、この章の手順を行わなくても問題ありません。
しかし、ピアリング や V2V、S2S、P2S、ExpressRoute、Azure Firewall などの Azure の機能で、別のネットワークと接続された構成との相互接続の場合に支障をきたします。

本記事で紹介する NAT 無しの相互ルーティングの方法と、上記の Azure による外部ネットワーク接続方式間を 相互にルーティングさせるためには、本章の構成が必要です。
※アドレス空間が定義されていないと、仮想ネットワークゲートウェイ によって、パケットが破棄されてしまう事が理由です。

忘れたころにハマる事になるので、本章の構成は、やるものだと思っておけば万全です。

1. **仮想アプライアンス** の **概要** ページを開き、割り当てられている **仮想ネットワーク** を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/09c78a21-61fa-7eb2-639a-9b7ddf2cfd54.png)
　<br>
1. **アドレス空間** を選択します。※この時点で、緑枠のアドレス空間は１つだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7deff9bf-2f3f-fd30-6a3d-9468f0425559.png)
　<br>
1. **アドレス空間** を追加して、**保存** を押します。<br>下図の場合は **192.168.240.0/24** という 仮想アプライアンス（VPN ルーター）の先にあるネットワークアドレスを追加しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6cc2166d-c88d-dd61-6929-1a75f345ac2e.png)
　<br>
1. 以下の通知が表示されれば **OK** です。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2bc4bf6f-633f-4d0c-4092-e1260c21fdb2.png)
　<br>
1. 以下のようにアドレス空間が定義されていれば **OK** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1473b353-028e-83bf-f2b0-73addac8c268.png)

## 2-2. IP 転送（必須）
1. **仮想アプライアンス** の左ペインから、**ネットワーク設定** を選び、赤枠の **ネットワークインターフェイスの名前** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6fc1937f-fca2-ec72-d2ba-ec33589f3093.png)
　<br>
1. **ネットワークインターフェイス** の左ペインから、**IP構成** を選択し、**IP 転送を有効にする** にチェックを入れて、**適用** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/9e6b7c42-e9c0-8b5f-50de-cb409df93723.png)
　<br>
1. 以下の通知が表示されれば **OK** です。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/47330e34-df97-8727-0e28-6946d8f08c4e.png)

:::note warn
NIC の IP 転送を有効にしていない場合、自分自身（NIC に割り当てられている IP アドレス）以外の宛先パケットは、**破棄** されてしまいます。それ以外の宛先であっても VM へ転送するために、この設定が必要です。
:::

## 2-3. ルーティングの構成（必須）
仮想アプライアンス（VPN ルーター）の先にあるネットワーク宛の ゲートウェイを定義する必要があります。いわゆるルーティングの設定です。

Azure では、ルーティングを構成する場合は、あらかじめ ルートテーブル というリソースを作成しておき、そこに ルート（経路）設定 を構成する必要があります。

上記で作成した ルートテーブルを 仮想ネットワーク の サブネット に割り当てることで、ルーティングが機能します。

### 2-3-1. ルートテーブル の作成
1. Azure Portal の検索窓に **ルート** と入力して **ルート テーブル** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/494b85a0-850b-f2c7-6fd9-450bb63f4702.png)
　<br>
1. **作成** ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1bedef21-6043-eba7-35a2-43d7942ab090.png)
　<br>
1. **基本** タブでは、任意のリソースグループとリージョン（仮想アプライアンスと揃えると良い）を選択し、任意の リソース名 を命名し、**確認および作成** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/576e0700-c162-9df3-c203-b8845a9c7753.png)
　<br>
1. 以下の確認画面で **作成** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7d2e4cf4-7e93-9063-01fb-0ec3e4c21865.png)
　<br>
1. デプロイが完了したら **リソースに移動** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/0c0dc67d-e731-39da-7395-397999be0020.png)

### 2-3-2. ルートの追加
1. ルートテーブルが作成されると、以下の画面のようになります。なお、この時点では 緑下線 部分は、**結果なし** となっており、何も構成されていないことが判ります。<br>続いて、ルーティング を構成するために **ルート** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/25cfed45-633f-e1d0-d859-c26055f78ce3.png)
　<br>
1. **追加** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e4481124-4d9d-66e3-59cf-6d4b7f7289a2.png)
　<br>
1. 以下の番号を参考に、値を設定していきます。最後に **追加** を押します。

|№|項目名|設定値|備考|
|:-:|:-:|:-:|:-:|
| ① |ルート名|任意の名称|   |
| ② |宛先の種類|"IP アドレス"|ネットワークアドレスを宛先として指定するため|
| ③ |宛先 IP アドレス/CIDR 範囲|[仮想アプライアンスの先にある ネットワークアドレス帯]|私の環境では VPN のアドレス帯である 192.168.240.0/24 を指定しています。|
| ④ |ネクストホップの種類|"仮想アプライアンス"|仮想アプライアンス経由で外部に接続するルートを示すために必要な設定です。|
| ⑤ |ネクストホップアドレス|[仮想アプライアンスの IP アドレス]|宛先 IP 帯へ接続するためのゲートウェイを指定する必要があります。<br>私の環境では 10.10.10.8 を指定しています。|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/0981bb01-2043-7e44-cf19-1b4a71721d17.png)

4．以下の通知が表示されれば **OK** です。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/f1f4cca2-b33b-a8fd-5352-909d284a41c5.png)

5．以下のように **ルート** が追加されれば **OK** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/44e63b12-5a16-fecf-ea9c-73a6b9356aaf.png)

### 2-3-3. ルートテーブルの割り当て
構成された ルートテーブル を、サブネットに割り当てることで、ルーティング が機能するようになります。

1. **仮想アプライアンス** に割り当てられている **仮想ネットワーク** を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/09c78a21-61fa-7eb2-639a-9b7ddf2cfd54.png)
　<br>
1. 左ペインのメニューから **サブネット** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8080cd05-4435-0eba-ef34-b0cdcd0e0176.png)
　<br>
1. **ルートテーブル** を割り当てる **サブネット** を選択します。<br>この時点では **緑枠** の箇所が空欄になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/a0e0ce33-2191-1eee-f8d2-cd817067f85f.png)
　<br>
1. **ルートテーブル** 欄で、先ほど作成した ルートテーブルの名前を選択して **保存** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/0966e371-d360-c26b-b3d6-3e347517706d.png)
　<br>
1. 以下の通知が表示されれば **OK** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/503e07f6-b122-8e75-822d-8fc9a769c981.png)
　<br>
1. 以下の緑枠のように **ルートテーブル** 欄に割り当てられたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/a1bc18f1-f9a1-bd32-9bda-4c5dba02dd31.png)

最終的に、ルートテーブルは、以下のような設定内容になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8ea3432f-56ff-8674-8121-0c066c6fc9ef.png)

さらに、以下のように **有効なルート** を見る事で、実際に動作しているルーティングテーブルの内容を確認できます。**ネットワークインターフェイス** では、起動中の VM の NIC を選ぶ必要があります。VM が起動していないと 有効なルート は参照できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d9988ad1-dc6e-7c7a-9d2b-e5500ceebeb1.png)

# 3. 仮想アプライアンス に構成されていた NAT の無効化
前章までの手順で、Azure 仮想ネットワークと、VM 内に構成された外部のネットワークとの間でルーティングが行われるように構成できました。

最後に、仮想アプライアンス 内で構成されている NAT を無効化します。

こうすることで、Azure 仮想ネットワーク上の VM と、仮想アプライアンス を経由した 外部のホストとの間で、ルーティングが行われて、相互に通信をすることができます。

以下の記事に OpenVPN の NAT を無効化する手順を公開してありますので、参考にしてください。

https://qiita.com/carol0226/items/1fd9540069fabbde92df

# さいごに
実は、2-2 章（IP 転送）と、2-3 章（ルートテーブル）は、Azure の 仮想ネットワーク の基本として、習うことができるネタで 良く知られた話なのですが、2-1 章（アドレス空間）に サブネットで扱う以外のアドレス帯をあえて設定する方法は、裏技的なネタで、あまり聞かない話だと思います。

この点、参考にしていただき、仮想アプライアンス と、Azure ネットワーク間を 相互接続させる際の参考にしていただければ 幸いです。