OpenVPN を使って Azure と 他拠点 間を S2S 接続する

# はじめに
今まで、Azure 上の OpenVPN を活用して 外部から Azure に VPN 接続を行う記事を投稿してきましたが、今回は 第３弾となります。

今回の記事の構成を行う事で、Azure と オンプレミス間のホストが 相互にルーティングされてアクセスすることが出来るようになります。つまり **S2S** (Site to Site) です。 

タイトルでは Azure と 他拠点 間と書きましたが、この方法を応用することで 以下のいずれの組み合わせも実現可能です。
- Azure と オンプレミス　←　この記事では、この構成を想定して記載しています
- Azure と Azure
- Azure と 他社クラウド（AWS , Google Cloud , Oracle Cloud 等）

今回の構成は、以下のサイトを参考にして構成しました。

**OpenVPN 公式：Site-to-Site Routing**

https://openvpn.net/as-docs/site-to-site-routing.html#site-to-site-routing

:::note info
上記の記事は、Linux を想定した記載になっていますが、本記事で Windows でも動作することを検証できた点が、敷居を下げたって事で、価値があるかな・・・と思います。私も やってみるまでは、動くのかどうか 半信半疑でした・・・
:::

# 前提となる構成
今回の構成を行うためには、事前に Azure 上に、以下の Step1 , Step2 まで構築済みであることが前提となります。記事を参考に構成してください。

**Step 1：クライアントから 片方向の NAT アクセス を実現**
https://qiita.com/carol0226/items/7a9160b298b736aa187e

**Step 2：NAT を使わずに、単一のクライアントと 双方向のルーティングアクセス を実現**
https://qiita.com/carol0226/items/1fd9540069fabbde92df
→　いわゆる **P2S** (Point to Site) 的な接続

# 今回 追加で構成する内容
今回は、Step 3 としての追加構成を行い、**NAT を使わずに、複数のホスト間で 双方向のルーティングアクセス** を目指します。

Step 2 までに終えた構成に対して、下図の 赤下線 で記した箇所の設定を追加していきます。

**今回の構成イメージ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3f1b9bd7-dfb2-4e72-a8ee-8aae659f6579.png)

:::note warn
本記事では、上図の黄緑枠で示した OpenVPN Gateway のために Windows Server または Windows クライアント を使用します。Step 2 までの接続に使用した OpenVPN クライアント をそのまま流用できます。
:::

**【作業の流れ】**
**1. OpenVPN Access サーバー 側での追加構成**
- 1-1. VPN Gateway を有効化したユーザーの作成
- 1-2. OpenVPN Access サーバーへのルート追加

**2. OpenVPN クライアント 側での追加構成**
- 2-1. OpenVPN クライアントのインストール
- 2-2. S2S プロファイル のインポート
- 2-3. Routing and Remote Access サービスの有効化

**3. スタティックルートの追加**
- 3-1. オンプレミスホストへ Azure 宛のルート (10.10.10.0/24) を追加
- 3-2. Azure ルートテーブルへ 物理ネットワーク宛のルート (10.16.47.0/24) を追加

**4. その他**
- 4-1. アドレス空間へ 物理ネットワーク (10.16.47.0/24）のアドレスを追加

**5. 疎通確認**

# 構築手順
## 1. OpenVPN Access サーバー 側での追加構成
### 1-1. VPN Gateway を有効化したユーザーの作成
この機能を使うためには、VPN Gateway の機能を有効化した ユーザー を作成します。

0. OpenVPN Access サーバー管理画面に ログイン します。
**https://** [OpenVPN Access サーバーの IP] **:943/admin**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3f57ba92-c601-4fda-110d-ee06039610fd.png)
　<br>
0. 左ペインで **User Permissions** を選択して **New Username** 欄に 任意のユーザー名を入力します。以後の例では **S2S** という名称で構成しています。
**Allow Auto-login** にチェックを入れ **More Settings** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2f6413b6-94bb-7359-8a06-a4b7de629b57.png)
　<br>
0. 詳細な設定画面が表示されるため 任意の **Local Password** を指定し、**Configure VPN Gateway** を **Yes** に設定し、**Allow client to act as VPN gateway for these client-side subnets:** の欄に、オンプレミス側 の物理ネットワーク の ネットワークアドレス (10.16.47.0/24) を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b44558c1-9998-c115-735e-bc3dcdc54310.png)
　<br>
0. 一番下まで スクロールして **Save Settings** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b82a0ea7-5f5f-44da-1769-93fa33e76593.png)
　<br>
0. 画面上部に 下図の内容が表示されたら **Update Running Server** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/11266e2e-a9ad-74c2-8a5e-7b314351cb75.png)
　<br>
0. 以下のように 一覧 に追加されれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/af987c4c-c0f1-5603-c62f-15b1ae1e051c.png)

:::note info
この章の構成によって、OpenVPN クライアント側で 今回作成したユーザーでログインした場合は、VPN Gateway 機能が動作します。つまり クライアント側を ルーター化 することができます。
:::

### 1-2. OpenVPN Access サーバーへのルート追加
0. 左ペインで **VPN Settings** を選択して **Static IP Address Network** 欄の 赤枠の箇所に、オンプレミス側のネットワークアドレス を入力します。
右下の赤枠２か所を **Yes** にします。
緑枠の箇所は、前提となる構成 が完了していれば Azure 仮想ネットワーク のアドレスが設定されて **Yes, using Routing** が選択されているハズなので、確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/69d12e9f-a16c-c075-40cf-8ab8516148ed.png)
　<br>
1. 画面を一番下までスクロールして、**Save Settings** ボタンを押して、設定を保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d3ac9761-5d1b-cad5-aa53-3029968a167a.png)
　<br>
0. これだけでは、まだ設定が反映されていません。
以下の画面で **Update Running Server** を押して反映させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/dd33dc2e-0f51-e21f-d081-e6d01ebdde57.png)
　<br>
0. 以下の表示がでれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/9a5a8f6b-6551-47d5-eb57-4bee7cee9b32.png)

## 2. OpenVPN クライアント 側での追加構成
今回 構成を行う OpenVPN クライアントは Windows Server または Windows クライアント のどちらでも動作します。

ブラウザを開いて 以下のアドレス に接続します（admin が付かず 管理者ページとは違います）
**https://** [OpenVPN Access サーバーの IP] **:943**<br>
これで、ユーザー向けのページに繋がるため、前章で作成した アカウントで **ログイン** します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/58e3ea6c-ac2f-4367-026c-311b66c41fc9.png)

### 2-1. OpenVPN クライアントのインストール
前提となる構成が構築済みであれば、OpenVPN クライアントは導入済みなので、本章は SKIP してください。新規のサーバーを OpenVPN クライアントとして構成する場合は、以下の ▶ を押して 手順を参照してください。
<details><summary>OpenVPN クライアントのインストール手順を見るには ココ を押してください。</summary>  

0. 下図では、赤枠部分を押して Windows 用 クライアントアプリを ダウンロードします。その他の OS から接続する場合は、任意のアイコンを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b0ac527b-868e-c4f4-859f-f3092b558817.png)
　<br>
0. 以下のようなファイル名で、ダウンロードされるため、ダブルクリックして 起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/433ae70e-3b13-6552-df80-45a3b8bf8e85.png)

この画面は、Windows Smart Screen の機能が働いた時に表示されます。
**詳細情報** の箇所を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/49e19235-d4cf-6bc3-5d29-3eaf03601746.png)
**実行** を押せば、継続できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/9bc34822-7a00-302e-9e56-e50a1f49f917.png)

4．OpenVPN Connect Setup が起動するため、ウィザードを進めて行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/094cf87b-d9c4-f842-7ef7-847e1d4f8786.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/42a3ebcb-27dd-02fe-05ab-1947d4cd4f06.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/68601da0-7beb-132f-4fd7-6ec851923a8d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ac7df2ee-3f68-8481-327b-e0f1851bb7a5.png)

5．インストールが終わると、以下の画面になります。**Finish** を押して終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3e8708aa-d7c1-0e6f-d418-571410d456c5.png)

</details>

### 2-2. autologin プロファイル のインポート
0. 以下の画面で **Yourself (autologin profile)** をクリックして ダウンロードします。
終わったら、ダウンロードしたファイルをダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c22bcc89-3cd2-c860-3e93-1f2011240153.png)
　<br>
0. 以下のように プロファイル をインポートしても良いか聞かれるため **OK** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6cc0df39-5f8c-a291-0e81-3671751609bd.png)
　<br>
0. 以下の接続画面で **CONNECT** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2eb4a3f2-e87a-7812-a5b7-81d860586d11.png)
　<br>
0. ログイン認証を行うことなく、以下のように VPN が接続されます。そのあと、左上の 赤枠 のメニューを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c8f4bedc-1375-5d02-197a-cb3928815dbb.png)
　<br>
0. **Settings** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/f7aa81de-a277-6b30-af02-317506129635.png)
　<br>
0. Launch Options の選択肢で **Connect latest** を選択して 左上の **"＜"** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/727ea974-82c7-8dd3-5030-7d3bff764a75.png)

:::note info
これで、サーバーをシャットダウンしても、 次回起動して OS へのログオンを行うと OpenVPN が自動起動して VPN 接続が行われます。
:::

この状態で Gateway となったサーバーと、Azure 上の Open VPN Access サーバー間で 疎通できていることを確認してください。

OpenVPN Access サーバーの プライベート IP 経由で 管理画面を開くことが出来るはずです。

:::note warn
**注意点**
しかし、現時点では　ルーティングの構成が未完了のため、その他の ホスト同士の疎通は出来ない状態です。
:::

### 2-3. Routing and Remote Access サービスの有効化
VPN Gateway となった クライアント側 の "Routing and Remote Access" サービスを有効化します（Windows Server でも、Windows クライアント でも このサービスは存在します）

0. 検索窓に **サービス** を入力して、検索された **サービス** を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/5702d538-5c2b-f9cd-830c-41aa755c7b9a.png)
　<br>
0. 一覧の中から **Routing and Remote Access** を探して、赤枠の箇所をダブルクリックします。
初めは、**無効** で、状態の列が 空欄（停止中の意味）になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/cb30b562-048d-e755-928d-e03e257e538e.png)
　<br>
0. **全般** タブでは、スタートアップの種類 を **自動** に変更して **適用** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/014a109d-4117-ad5a-d460-2b59c30d1d21.png)
　<br>
0. **開始** ボタンがアクティブ化されたら **開始** ボタン を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/60d34d4d-184f-5f7f-f254-9b4936176951.png)
　<br>
0. 以下のように サービスの状態が **実行中** になれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d9ad8ca7-2697-ec5d-6be2-044cf9b2b07b.png)
　<br>
0. ウィンドウを閉じて サービスの一覧に戻った際に 以下のように "実行中" "自動" になっていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3073ad94-f7d1-7c28-c955-a86950204a57.png)

:::note info
この構成によって、物理ネットワーク と、VPN ネットワーク間が 相互 にルーティングされるようになります。
:::

:::note warn
**注意**
なお、後述する スタティックルーティングが完了するまでは、ホスト to ホスト の疎通はできません。
:::

## 3. スタティックルートの追加
### 3-1. オンプレミスホストへ Azure 宛のルート (10.10.10.0/24) を追加
オンプレミス側で 有線 LAN に接続された 各ホスト上で、以下のコマンドを実行して、Azure への スタティックルート を追加します。

**コマンド例**
**route add -p** [Azure 仮想ネットワークのネットワークアドレス] **mask** [Azure 仮想ネットワークのサブネットマスク]　[有線 LAN 側のゲートウェイアドレス]

**具体例**
route add -p 10.10.10.0 mask 255.255.255.0 10.16.47.10
→　冒頭で紹介した構成図を見ながら、アドレスを当てはめてください。

**確認コマンド**
route print を実行して、作成したルートが表示されていることを確認します。

**実行結果**
以下が実行例です。黄枠部分が 作成された ルート テーブルになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/17621ed2-c7b4-16ca-57e7-8828f2a8c31c.png)

:::note info
この構成をおこなった、物理ネットワーク上の ホスト は Azure 仮想ネットワーク (10.10.10.0/255.255.255.0) と通信する際に、VPN Gateway (10.16.47.10) を 経由（ネクストホップとして選択）するようになります。
:::

:::note warn
本章は、物理ネットワークの場合の手順を紹介しています。
もし、他社のクラウドサービス上に OpenVPN クライアント (VPN Gateway) を配置した場合は、各クラウドサービスの 仮想ネットワーク の ルーティング構成を変更してください。
:::

### 3-2. Azure ルートテーブルへ 物理ネットワーク宛のルート (10.16.47.0/24) を追加
0. Azure Portal にサインインし 事前に構成済み の ルートテーブルを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c4fe0c4f-ed99-4310-5918-5701050e3baf.png)
　<br>
0. 左ペイン の **ルート** を選び **追加** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/96778db3-c6f2-baac-965e-621d80bdb564.png)
　<br>
0. 以下の通り、任意のルート名を入力したあと、物理ネットワーク向けの ネットワークアドレスを入力して、ネクストホップの種類は、**仮想アプライアンス** を選び、OpenVPN Access サーバーのプライベートアドレスを設定し、最後に **追加** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ec69fd25-0f95-ea50-5245-e3da3cb93f36.png)
　<br>
0. 以下の通知が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6d26826e-fc71-5e46-674c-949ed203c5f7.png)
　<br>
0. ルートが作成されると、以下のように 一覧に追加されます。
続けて、左ペインから **有効なルート** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b69c1957-1732-d7fc-bf86-4592aec29b16.png)
　<br>
0. 下図の 赤線部 では、必ず 起動中されている VM の NIC を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/54df2b75-a34e-7854-7b82-e4dbd1a586c2.png)

:::note alert
起動していない VM の NIC を選んでしまうと、以下のようにエラーになります。
この場合は、該当の VM を起動してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c9e1a953-8085-1d7b-1ad2-d18b1e3f9863.png)
:::

7．以下のように 有効なルート の一覧に 追加したルートが表示されていれば OK です。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3bcfb50c-e142-3d89-e496-7ce25364dcfc.png)
（中略）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/5f17984b-aea8-b82b-3a52-93340859c8d6.png)

:::note info
この構成をおこなった、Azure 仮想ネットワーク上の ホスト は 物理ネットワーク (10.16.47.0/255.255.255.0) と通信する際に、仮想アプライアンス（OpenVPN Access サーバー：10.10.10.8) を 経由（ネクストホップとして選択）するようになります。
:::

## 4. その他
### 4-1. アドレス空間へ 物理ネットワーク (10.16.47.0/24）のアドレスを追加
この設定を実施しなくても、仮想ネットワーク と 物理ネットワーク 間の疎通は行えます。

しかし、この設定を加えることで、仮想ネットワーク上に Azure 仮想ネットワークゲートウェイ が合った場合、さらに その先に接続されている外部のネットワーク（ピアリング、V2V、S2S、P2S、ExpressRoute）とも接続することが出来るようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b3c5e53d-b775-95a6-a27b-4fe95e976c3a.png)

# 5. 疎通確認
以上の構成で、Azure 仮想ネットワーク上の ホスト と、物理ネットワーク上の ホスト が相互に通信ができるようになっているハズです。

:::note warn
設定が正しいのに、疎通ができない場合は、Windows Firewall でブロックされてしまっている可能性があります。

その場合は、各ホスト の Windows Firewall を無効化するなどしてみてください。
:::