Azure 上に RAS の 役割サービス で VPN サーバー (SSTP) を構築する

# はじめに
Azure 上に構築した検証環境に、物理 PC からアクセスさせる必要が生じたため、この構成を検証することにしました。

なお、Azure の場合は、VPN Gateway を構築しても良いのですが、サービスを止める事ができず、ずっと課金されてしまいます。必要な時だけ 起動して利用ができた方がコストメリットが高い為、仮想マシン上に リモートアクセスの役割サービス (RAS) を導入し VPN でアクセスできる仕組みを考えました。

この方法なら、使わない時に VM を停止して 課金を抑制できます。

なお、証明書 や Azure 側のルーティングなど、結構ハマりどころがありますが、必要な手順は全て盛り込んであります。

この記事の情報が、構築成功の一助になれれば幸いです。

:::note info
私の検証実績として、**SSTP** で利用できることを確認済みです。
SSTP は、TCP : 443 だけで動作するプロトコルであり柔軟性が高いです。
:::

:::note alert
RAS は 他にも IKEv2 , L2TP , PPTP などの VPN プロトコルを利用できますが、
SSTP 以外のプロトコルは GRE や、IP:50 など TCP / UDP 以外のプロトコルを使用するため、Azure が対応していない可能性が高いです。NSG を全開放してもダメでした。
:::

# 構成イメージ
下図の 緑色 の VPN ルーター の箇所に Windows Server の VM をデプロイし、RAS の 役割サービスをインストールします。
こうすることで、黄緑色の VPN クライアントから、オレンジ色の VM や、ピンク色の外部ネットワークと **相互** に通信ができるようになります。
**相互** が可能なので、VM から VPN クライアントへの接続もできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/74d05661-27a8-383d-4352-6172f89ef699.png)

:::note warn
VPN ルーター に設定する **アドレスプール** は、Azure 側、VPN クライアント側 の双方で利用されていないアドレス帯にする **必要** があります。
もし、Azure 側 や VPN クライアント側 のアドレス帯と競合していると、通信が行えません。
設定を行う際に、意識して どことも競合しない アドレス帯 を決めてください。
:::

# 構築手順
以下の手順の実施が必要です。
手順が多いですが、全て 漏れなく実施する必要があります。
1. VPN サーバー を Azure 仮想マシンとしてデプロイする
2. VPN サーバー に DNS 名 を付与する
3. SSTP 用のサーバー証明書を発行する
4. リモートアクセスの役割サービス を導入する
5. RAS で VPN (SSTP) を構成する
6. Azure 仮想ネットワークの構成変更
7. ドメインユーザーのプロパティ変更（VPN サーバーがドメイン参加している場合のみ）
8. クライアント側の VPN 接続設定
9. VPN 接続の実施

## 1. VPN サーバー を Azure 仮想マシンとしてデプロイする
Azure VM として Windows Server を展開してください。
　→ この Azure VM を、VPN サーバー として仕立てていきます。
　→ 以後、本記事内では このサーバーを **"VPN サーバー"** と表記します。 
　→ スタンドアロン (WORKGROUP) のサーバーで OK です（ドメイン参加でも可）

VPN サーバーは、通信をさせたい相手の VM（オレンジ色）と同じ仮想ネットワーク内に作成しましょう（サブネットは 異なっていても大丈夫です）

## 2. VPN サーバー に DNS 名 を付与する
Azure Portal で作業を行います。
SSTP で接続する場合、証明書で認証を行います。そのため、証明書に記載されている ホスト名での接続が必須になります（IP アドレスを指定すると NG）

これに対応するために、Azure VM の機能を用いて、DNS 名 を付与しておきます。

0. 先ほど作成した VM の 概要 ページを開き、**DNS 名** 欄の **未構成** と書かれた箇所をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/916dc519-e217-3ccf-ef24-fd4b5025fdd4.png)
　<br>
0. まず ① **DNS 名ラベル** 欄に、任意の名前を入力します。正常に受け付けられると、② の場所に **v** マークが表示されるため、③ **保存** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/49615f02-3a5b-5499-cc61-2a5303a89682.png)

:::note alert
なお 名前は 全世界でユニークとなる名前である必要があり、そうではない場合は「DNS 名ラベルは使用できません。別のラベルを使用してください。」というエラーが表示されます。この場合は、別の名前に変更してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/08d1807a-ddd1-5503-11f6-1230705467a1.png)
:::

3．無事に受け付けられると、下図の赤枠のように DNS 名 が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/04dd8ac4-61ad-193b-c228-b7f099738384.png)

4．DNS 名が構成されると、以下のように インターネット上の任意の PC などから 名前解決 が出来るようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6392099d-5db6-f19e-bab6-4be3d51c4970.png)

**公開情報：Azure portal で VM の完全修飾ドメイン名を作成する**

https://learn.microsoft.com/ja-jp/azure/virtual-machines/create-fqdn?wt.mc_id=mvp_407731

## 3. SSTP 用のサーバー証明書を発行する
VPN サーバー上で作業を行います。

サーバー証明書は、以下の２通りの方法で作成できます。
いずれかの方法で作成できますが、① の方が簡単で お勧めです。
私の方では、どちらの方法も検証済みなので、ご安心ください。

### ① コマンドで テスト用の 自己署名の サーバー証明書 を作成する
テスト用に 自己署名証明書 を作成するための手順です。
そもそも この SSTP 接続は 運用で使うような代物でも無いと思うので、この方法で証明書を作ってしまって良いと思います。

以下の記事の手順で作成した証明書を使って、VPN (SSTP) の接続まで検証してあります。

https://qiita.com/carol0226/items/8663842e2c7422de7e55

### ② AD CS 証明機関 を使って、サーバー証明書 を作成する
証明書を作成するための 正式な手順です。
以下の URL で説明している AD CS を構築して、証明書要求から実施していく必要があります。
以下の記事のうち「1-1. NPS の導入」は、SKIP してしまって大丈夫です。
"npsradius.nps.local" の箇所を 前章 で設定した DNS 名（～.cloudapp.azure.com）に置き換えて作業してください。

https://qiita.com/carol0226/items/e3482e03df636f4a689b

## 4. リモートアクセスの役割サービス を導入する
VPN サーバー上で作業を行います。
リモートアクセスの役割サービス (RAS) をインストールします。
以後、記事内では、**"RAS"** と表記します。

https://qiita.com/carol0226/items/014be06b02fb7b7ca352

## 5. RAS で VPN (SSTP) を構成する
"**RAS**" 上で作業を行います。

0. サーバー マネージャーで、**通知** フラグを選択します。 再起動直後は、通知フラグが表示されるまで、1、2 分待たなければならない場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/5bae28ff-2a36-2553-cfaa-daddf469e469.png)
　<br>
0. **VPN のみを展開します** を選択して、ルーティングとリモート アクセス Microsoft 管理コンソール (MMC) を開きます。<br>※ このウィンドウが見当たらない場合は、サーバーマネージャーなどのその他の開いているウィンドウを すべて閉じてみてください（後ろに隠れています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4ed04793-2825-e13b-be89-e7aa0fd3eeb6.png)
　<br>
0. VPN サーバー名 を右クリックし、**ルーティングとリモート アクセスの構成と有効化** を選択して、ルーティングとリモート アクセス サーバーのセットアップ ウィザードを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/70002b25-d1e9-fda3-0484-71255984842c.png)
　<br>
0. **ルーティングとリモート アクセス サーバーのセットアップ ウィザードの開始** で、**次へ** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8d950adb-e91b-765f-7069-6bed32b7d5fc.png)
　<br>
0. **構成** で **カスタム構成** を選択し、**次へ** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/05afdd04-bd01-6999-e30a-bf2f21e2da4b.png)
　<br>
0. **カスタム構成** で **VPN アクセス** を選択し、**次へ** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/37c525d1-f670-9539-f3b6-b98d2f9d1f23.png)
　<br>
0. **完了** を選択してウィザードを閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7cfb0b98-67f1-cb30-612f-720cf043786f.png)
　<br>
0. **サービスの開始** を選択して **ルーティングとリモート アクセス** ダイアログ ボックスを閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/545bef68-9066-7933-9977-87dc050a18ac.png)
　<br>
0. VPN サーバーが実行されたら、VPN サーバーを右クリックし、**プロパティ** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1d72cd79-7ed4-d979-ab04-312f7db9d3db.png)
　<br>
0. **セキュリティ** タブを選択し、前章でインポートした **サーバー証明書** を選択します。
選択肢に サーバー証明書 が表示されない場合は、ローカルコンピューター の 個人ストア に サーバー証明書 が配置されているか、再確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/a369d62f-dfba-4835-a969-599f40e75d0f.png)
　<br>
0. **IPv4** タブを選択し、次の手順を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2fa3ce89-669a-d4de-191f-92b41088266a.png)
　<br>
0. **静的アドレス プールを使う** を選択します。
**追加** を選択して、IP アドレスプールを構成します。<br>※ Azure なので DHCP は使えません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/98b3394b-1bdd-a870-9ec6-b4309a731846.png)
　<br>
0. **アドレスプール** として使用するネットワークの範囲を入力します。
冒頭でも説明しましたが 他のネットワークと競合しないアドレス帯を設定してください。
**開始 IP アドレス** に、VPN クライアントに割り当てる範囲の開始IP アドレスを入力します。
**終了 IP アドレス** に、VPN クライアントに割り当てる範囲の終了 IP アドレスを入力するか、**アドレスの数** に、使用可能にするアドレスの数を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ebd697c9-4b1b-50f9-a1c3-7deb6c13ac6d.png)
　<br>
0. **OK** を選択して、**プロパティ** ダイアログを閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/367ee2a3-dcaf-b9d6-44f3-86dd91ccd0f1.png)

## 6. Azure 仮想ネットワークの構成変更
Azure Portal で作業を行います。
### 6-1. ネットワークセキュリティグループ (NSG) の変更
VPN クライアントが、インターネットを経由して、VPN (SSTP) サーバーへアクセスするため、受信の規則で **HTTPS**（SSTP では HTTPS が採用されている）を許可する必要があります。

0. VPN サーバー の画面を開き、左ペインから  **ネットワーク設定** を選択し、**＋ポートルールの作成** を開いたあと **受信ポートルール** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/bca03bf3-e575-fa3c-9524-81eae670e320.png)
　<br>
0. 下図のとおり、**HTTPS** の 受信を許可する規則を設定して **追加** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/34ceb1da-319c-b264-a3b6-24341a4ada40.png)
　<br>
0. 以下の通知が表示されれば **OK** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/615e2418-4b64-6220-c16c-b8322ca672a4.png)
　<br>
0. 登録後は、以下のように 設定が追加されていれば **OK** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/594399e0-dc14-3a88-c081-34c7ace9fbae.png)

:::note alert
この作業を忘れると、以下のエラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/963ad64a-4fe0-3c1d-141f-be3eaa702599.png)
このエラーは、VPN クライアントが VPN サーバーに疎通できなかった場合に出力されるため、**NSG** の設定以外にも、以下の観点をチェックしてください。
- VPN クライアント側 に接続先として入力した URL が誤っていないか？ 
- VPN クライアントが インターネットに接続しているか？
- VPN サーバー側 で、RAS が正しくインストールされ RAS サービスが稼働しているか？
- VPN サーバーの VM が起動しているか？
:::

### 6-2. 戻りのルーティング設定
Azure Portal で作業を行います。

以下の記事で説明されている 手順すべてを行います。
なお、前章まで実施した手順では、元々 NAT が無効なので、以下の記事の最終章で説明されている **NAT を無効化する** 手順は SKIP して大丈夫です。

https://qiita.com/carol0226/items/8d89da5aeba8a3ddb9bd

:::note warn
RAS の役割サービスで NAT を有効にするためには、サーバーに NIC を２枚構成する必要があります。Azure 上で NIC を 2 枚構成すると、構成が複雑になるので、今回 採用は見送りました。
:::

:::note alert
この章の設定を忘れた場合ても、VPN 接続 は 以下のように成立します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3f55024e-050e-7223-25c3-a7a3747255ef.png)
ですが、パケットのルーティングが適切に行われないため、TCP/IP の通信が行えません。
VPN 接続が成功するのに、疎通が取れない場合は、この章の設定を疑ってください。
:::

## 7. ユーザーのプロパティ変更
VPN サーバーが ドメインに参加している場合は、ドメインコントローラー上で 作業を行います。WORKGROUP の場合は、VPN サーバー上で作業を行います。

0. Active Directory ユーザーとコンピューター を開きます。
WORKGROUP の場合は、コンピューターの管理 を開きます。
　<br>
0. VPN (SSTP) 接続時の認証に使用するユーザーを開いて **ダイヤルイン** タブを選択します。**リモートアクセス許可** の設定を **"アクセスを許可"** に変更して **OK** します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/588bf3a9-6bc2-c0f2-23c3-ae5b02be83d1.png)

:::note warn
ユーザーの既定値は、**"NPS ネットワークポリシーでアクセスを制御"** になっているので、NPS 無しでは "RAS" のユーザー認証には使えません。
実は、ココが一番のハマりどころかもしれません。
:::

:::note alert
この設定をやり忘れると、VPN 接続時に 以下のエラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/c948658c-1ecb-7b09-d1b6-354e7304d882.png)
:::

## 8. クライアント側の VPN 接続設定
### 8-1. SSTP 接続 のための事前設定
VPN 接続を行いたい クライアント PC 上で作業を行います。
#### 8-1-1. ルート証明書のインポート（コンピューターの信頼されたルート証明機関）
##### ① 自己署名証明書 を作った場合
自己署名証明書 を作った場合は、以下の手順で、クライアントへ ルート証明書 をインポートしているハズですが、再確認してください。

**Qiita記事：クライアントへ ルート証明書 をインポートする**
https://qiita.com/carol0226/items/8663842e2c7422de7e55#8-クライアントへ-ルート証明書-をインポートする

##### ② AD CS で サーバー証明書 を作った場合
以下の記事を参考にして、AD CS のルート証明書を クライアント PC の **ローカルコンピューター** の **信頼されたルート証明機関** にインポートします。

https://qiita.com/carol0226/items/33042c5c639c79832aeb

:::note warn
必ず、 **ローカルコンピューター** の **信頼されたルート証明機関** にインポートしてください。**SSTP** の場合は、**現在のユーザー** にインポートした場合は、VPN 接続できません。
:::

:::note alert
この作業を忘れると、以下のエラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/92e3bfb1-39c3-612c-803d-64d0f2879255.png)
加えて、RAS 側で 証明書のバインドを行った際の サーバー証明書 が適切に選択されているかどうかも、再確認してください（クライアント側の ルート証明書 と、VPN サーバー側の サーバー証明書 が適切にペアになっている必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b1675910-a7de-02ae-bcd8-4fe408222268.png)
:::

#### 8-1-2.  証明書失効確認の無効化
AD CS で証明書を作った場合のみ 必要 な作業です。
自己署名証明書 をコマンドで作成した場合は、本章は SKIP してください。

証明書の仕組みとして、その証明書が 有効かどうかを 証明機関にリアルタイムで確認する仕組み（失効確認）が存在します。
もし証明機関側で 証明書が無効化されていた場合は、クライアントは その証明書は無効であると判断して、VPN 接続は成立しません。

加えて、クライアントが 証明機関に失効確認ができなかった場合（証明機関と疎通確認が行えない）でも、VPN は繋がりません。この構成をおこなうのは 結構大変なため、失効確認を無効化する方法をお知らせします。

**SSTP 接続時の 証明書失効確認を無効化する レジストリ**
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Sstpsvc\Parameters
- NoCertRevocationCheck の値が **1** だと **無効**
- NoCertRevocationCheck の値が **0** または キーが存在しない場合は **有効**

0. レジストリエディタを開き、以下のように キーを編集します。キーが存在しない場合は、追加作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/af663f60-7627-0f6b-49c8-332dc11dbbfa.png)
　<br>
0. キーの値は、**1** を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/da59fa26-9994-d891-80cd-1ebea5cac132.png)

:::note alert
この作業を忘れると、以下のエラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/a28ae03a-dbca-25cc-0b33-8814da8a4342.png)
:::

:::note info
なお、証明書失効の確認を無効化せずに、真面目に チェックさせようとする場合は、以下の記事を参考に構成して、VPN クライアントが、インターネット経由で失効リストにアクセスできるようにします。結構大変てすよ。
:::

https://qiita.com/carol0226/items/333da143c95550412b2b

### 8-2. 接続のための設定
VPN で接続させたい、**クライアント PC** 上で操作を行います。

0. **スタート** > **設定** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/371779a1-a08a-d55b-2859-b191abf57540.png)
　<br>
0. **ネットワーク と インターネット** > **VPN** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/cce53f98-7de8-f521-cdb0-adc81db440ca.png)
　<br>
0. **VPN を追加** で、次の操作を行い、最後に **保存** を選択します。
① **VPN プロバイダー** で **Windows (ビルトイン)** を選択します。<br>
② **接続名** ボックスに、認識しやすい名前 (「自分の VPN」など) を入力します。 これが、接続時に探す VPN 接続の名前になります。<br>
③ **サーバー名またはアドレス** ボックスに、VPN サーバーの **URL** を入力します。<br>
④ **VPN の種類** で、**Secure Socket トンネリング プロトコル (SSTP)** を選びます。<br>
⑤ **サインイン情報の種類** で、**ユーザー名とパスワード** を選択します。 (必要に応じて) ユーザー名とパスワードをそれぞれのボックスに入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1513402b-a309-c792-7cc8-45176cac1033.png)
　<br>
0. 保存されると、以下のような画面になるため、**その他の VPN プロパティ** 欄の **編集** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6a5ecac7-1619-4561-818b-66f8c8cb5ea9.png)
　<br>
0. 下図の通り Microsoft CHAP Version 2 (MS-CHAP v2) にチェックを入れて OK を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/126f815e-7735-fd2c-5451-d3ba89f37966.png)

:::note alert
チェックし忘れると、以下のエラーになるので、必ず チェックを入れましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4a907c48-259b-394f-519e-52d15a43dfdf.png)
:::

**公開情報：Windows で VPN に接続する**

https://support.microsoft.com/ja-jp/windows/windows-で-vpn-に接続する-3d29aeb1-f497-f6b7-7633-115722c1009c

## 9. VPN 接続の実施
0. 以下の通り、作成された 接続情報から **接続** ボタンをクリックすると、VPN 接続が開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/11bd357a-1e5f-edf7-6f68-eb746a769e78.png)
　<br>
0. 接続に成功すると、以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/42f4fd62-0bc0-9457-17ec-aae917f40e9a.png)
　<br>
0. 接続されたあとに、**ipconfig /all を実行すると、**PPP アダプター** が追加されていることが判ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b4421d8b-16ab-621b-568e-173f907b7b8f.png)
　<br>
0. 仮想ネットワーク上の VM に対して Ping と Tracert を実行した結果は 以下の通りです。
なお、あらかじめ Windows Firewall で Ping 応答を許可しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e164858a-a8b0-72bb-01ff-a3b0511d0beb.png)

:::note warn
VPN サーバー自身の プライベート IP に対しては、Ping は通りません。
:::

# 参考
RAS の機能については、以下の記事も参考になると思います。
私も、Azure の知識はあるつもりでしたが、RAS の知識が乏しかったので、以下の記事を参考にしました。

https://atmarkit.itmedia.co.jp/ait/articles/1109/01/news146.html

https://news.mynavi.jp/techplus/article/techp911/