Azure VPN で V2V 接続を構成する

# はじめに
本記事では、下図のように VNET1 と VNET2 という ２つの仮想ネットワーク を V2V（VNET 間接続）で接続する方法を紹介していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/cd12e2dc-b580-6458-85d1-900b292baa44.png)

以下の公開情報に記載されている範囲について、画面キャプチャ付きの手順 に加えて、２回目以降のデプロイを容易にするための ARM テンプレートでのデプロイ方法まで解説していきます。

**公開情報：VNet 間 VPN ゲートウェイ接続 - Azure portal の構成**

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-vnet-vnet-resource-manager-portal?wt.mc_id=mvp_407731

# 前提事項
基本的な VPN ゲートウェイ の仕組みや デプロイ方法は、以下の記事にまとめてありますので、先に そちらの記事を参照ください。

**Azure VPN Gateway のデプロイと ARMテンプレートでの再作成**
最初の VPN ゲートウェイ をデプロイする手順や、それを ARM テンプレート化して再利用する方法などを紹介しています。

https://qiita.com/carol0226/items/2504c08a88a53bb35f2b

**Azure VPN Gateway について**
SKU（機能、性能、コスト）の違いや、インスタンス、動作モード、可用性ゾーン (AZ)、接続方式 (S2S/V2V/P2S) などについて、詳細に解説しています。

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

:::note info
**本記事の対象**
上記の記事を参照いただき、VPN ゲートウェイ のデプロイを経験済みの方を対象としています。
VPN ゲートウェイのデプロイが未経験の人は、まず先に 上記の記事を参照して、デプロイまで実施してください。
:::

# ネットワーク設計
V2V 接続を行う２つの仮想ネットワークは、以下の設定値 であることを前提としています。

**VNET1** は、前提事項 で紹介した VPN ゲートウェイのデプロイについての記事の設計と同一です。

本記事では、上記の **VNET1** に対して、新たに **VNET2** の環境を追加で構成して、この２つの仮想ネットワークを V2V で接続するシナリオとなっています。

これらの値を 皆さんの環境に照らし合わせて 参照してください。
|役割|VNET1<br>名称|VNET1<br>アドレス|VNET2<br>名称|VNET2<br>アドレス|
|:-:|:-:|:-:|:-:|:-:|
|リソースグループ|AVD-Environment|－|AVD-Environment|－|
|リージョン|東日本<br>(Japan East)|－|東南アジア<br>(Southeast Asia)|－|
|仮想ネットワーク<br>(アドレス空間)|AZ-DefaultVNet|10.10.0.0 /16|AZ-DefaultVNet2|10.20.0.0 /16|
|サブネット１|Subnet1|10.10.10.0 /24|Subnet3|10.20.10.0 /24|
|サブネット２<br>※今回は使いません|Subnet2|10.10.20.0 /24|Subnet4|10.20.20.0 /24|
|ゲートウェイ<br>サブネット|GatewaySubnet|10.10.50.0 /24|GatewaySubnet|10.20.50.0 /24|

**VNET2 の仮想ネットワーク の作成例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/896de6df-1cda-188a-43d3-e470ac978700.png)

**作成された VNET2 の状態**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1a5f2d06-f29b-c1cf-6d9f-3f088a714c08.png)

**VPN ゲートウェイの設定値**
VNET1 と VNET2 の双方に作成する VPN ゲートウェイの設定値です。

| # |VNET1|VNET2|
|:-:|:-:|:-:|
|名前|VPNGW-JPEAST|VPNGW-SEASIA|
|地域|Japan East|Southeast Asia|
|ゲートウェイの種類|VPN|VPN|
|SKU|VpnGw1|VpnGw1|
|世代|Generation1|Generation1|
|仮想ネットワーク|AZ-DefaultVNet|AZ-DefaultVNet2|
|サブネット|GatewaySubnet<br>(x.x.x.x/x)|GatewaySubnet<br>(x.x.x.x/x)|
|パブリック IP アドレス名|VPNGW-JPEAST-pip|VPNGW-SEASIA-pip|
|アクティブ / アクティブ モードの有効化|無効|無効|
|BGP の構成|有効|有効|
|自律システム番号 (ASN)|65521|65522|

# 構築手順
手順は、２ステップです。
1. VPN ゲートウェイ（２台目）をデプロイする
1. V2V の 接続を構成する

## 1. VPN ゲートウェイ（２台目）をデプロイする
以下の **① GUI を使う方法**、または **② ARM テンプレートを使う方法** でデプロイしてください。

### ① GUI で デプロイする
手順は、以下の記事で紹介した内容と同一です。
その際に パラメータは 本記事で紹介した VNET2 の値に読み替えて作業を行ってください。

https://qiita.com/carol0226/items/2504c08a88a53bb35f2b

### ② ARM テンプレート で デプロイする
以下の ▶ を押して、表示された ARM テンプレート を使ってデプロイしてください。
パラメータは VNET2 の設定値の状態で読み込まれます。
<details><summary>ココを開いて、ARM テンプレートを参照できます。</summary>

~~~
{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "name": {
            "type": "string",
            "defaultValue": "VPNGW-SEASIA"
        },
        "location": {
            "type": "string",
            "defaultValue": "southeastasia"
        },
        "gatewayType": {
            "type": "string",
            "defaultValue": "Vpn"
        },
        "sku": {
            "type": "string",
            "defaultValue": "VpnGw1"
        },
        "vpnGatewayGeneration": {
            "type": "string",
            "defaultValue": "Generation1"
        },
        "vpnType": {
            "type": "string",
            "defaultValue": "RouteBased",
            "allowedValues": [
                "RouteBased",
                "PolicyBased"
            ]
        },
        "VnetResourceGroup": {
            "type": "string",
            "defaultValue": "AVD-Environment"
        },
        "VirtualNetwork": {
            "type": "string",
            "defaultValue": "AZ-DefaultVNet2"
        },
        "newPublicIpAddressName": {
            "type": "string",
            "defaultValue": "VPNGW-SEASIA-pip"
        },
        "enableBgp": {
            "type": "bool",
            "defaultValue": true
        },
        "asn": {
            "type": "int",
            "defaultValue": 65522
        },
        "customBgpIpAddress": {
            "type": "Array",
            "defaultValue": []
        }
    },
    "resources": [
        {
            "apiVersion": "2023-02-01",
            "name": "[parameters('name')]",
            "type": "Microsoft.Network/virtualNetworkGateways",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[concat('Microsoft.Network/publicIPAddresses/', parameters('newPublicIpAddressName'))]"
            ],
            "tags": {},
            "properties": {
                "gatewayType": "[parameters('gatewayType')]",
                "ipConfigurations": [
                    {
                        "name": "default",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "subnet": {
                                "id": "[resourceId(parameters('VnetResourceGroup'),'Microsoft.Network/virtualNetworks/subnets',parameters('VirtualNetwork'),'GatewaySubnet')]"
                            },
                            "publicIpAddress": {
                                "id": "[resourceId(parameters('VnetResourceGroup'), 'Microsoft.Network/publicIPAddresses', parameters('newPublicIpAddressName'))]"
                            }
                        }
                    }
                ],
                "enableBgp": "[parameters('enableBgp')]",
                "bgpSettings": {
                    "asn": "[parameters('asn')]",
                    "bgpPeeringAddresses": [
                        {
                            "ipconfigurationId": "[resourceId(parameters('VnetResourceGroup'),'Microsoft.Network/virtualNetworkGateways/ipConfigurations',parameters('name'),'default')]",
                            "customBgpIpAddresses": "[parameters('customBgpIpAddress')]"
                        }
                    ]
                },
                "vpnType": "[parameters('vpnType')]",
                "vpnGatewayGeneration": "[parameters('vpnGatewayGeneration')]",
                "sku": {
                    "name": "[parameters('sku')]",
                    "tier": "[parameters('sku')]"
                }
            }
        },
        {
            "apiVersion": "2020-08-01",
            "type": "Microsoft.Network/publicIPAddresses",
            "name": "[parameters('newPublicIpAddressName')]",
            "location": "[parameters('location')]",
            "properties": {
                "publicIPAllocationMethod": "Static"
            },
            "sku": {
                "name": "Standard",
                "tier": "Regional"
            },
            "zones": []
        }
    ]
}
~~~
</details>

## 2. V2V の 接続を構成する
V2V を構成する手順です。
**① GUI を使う方法** と、**② ARM テンプレートを使う方法** を紹介します。

### ① GUI で 接続 する
1. VPN ゲートウェイ の左ペインから **設定** を開き **接続** を選択します。<br>続いて **＋追加** ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7fab61db-30b3-7c1e-f6be-9e2e5c2db82e.png)
　<br>
1. **基本** タブでは、**接続の種類** で **VNet 対 VNet** を選択し、**双方向接続の確立** にチェックを入れて、１つ目の 接続名 と、２つ目の 接続名 を指定します（VNET1 -> VNET2 と VNET2 -> VNET1　を意味する名前が推奨ですが、任意の名前で問題ありません）<br>
リージョンは いずれかの VNET を同じ場所にしておきましょう。設定が終わったら **次：設定** を押します。（このリージョンは、接続リソースが保存される場所になりますが、どこに作っても動作はします）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3457852d-6de8-a416-3ce8-cb0bd5f90bad.png)
　<br>
1. V2V で接続を行う、１台目のゲートウェイと２台目のゲートウェイ を選択します。**共有キー (PSK)** を選択して キーの値（任意の文字列）を指定します。**BGP を有効にする** にチェックを入れて **確認および作成** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d5e616da-8201-1438-1f36-a64747e500c1.png)
　<br>
1. **確認および作成** タブでは 内容を確認して **作成** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8c58bf76-7c71-d638-f379-e176c052ffb8.png)
　<br>
1. ３～４分くらいで デプロイは完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/67e77a35-85ce-10a0-c358-c51200e2671a.png)

### ② ARM テンプレート で 接続 する
以下の ▶ を押して、表示された ARM テンプレート を使って 接続 してください。
パラメータは ネットワーク設計 の章で説明した内容の設定値が読み込まれます。
<details><summary>ココを開いて、ARM テンプレートを参照できます。</summary>

:::note warn
**注意事項**
SharedKey は、セキュリティですので、任意の値に置き換えてください。
　　　　"SharedKey": {
　　　　　　"type": "string",
　　　　　　"defaultValue": "**Sh@redKey**"
　　　　}
:::

~~~
{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "string",
            "defaultValue": "japaneast"
        },
        "connectionType": {
            "type": "string",
            "defaultValue": "Vnet2Vnet"
        },
        "Gateway1ResourceGroup": {
            "type": "string",
            "defaultValue": "AVD-Environment"
        },
        "virtualNetworkGatewayName1": {
            "type": "string",
            "defaultValue": "VPNGW-JPEAST"
        },
        "connectionName": {
            "type": "string",
            "defaultValue": "VNET1toVNET2"
        },
        "useLocalAzureIpAddress": {
            "type": "bool",
            "defaultValue": false
        },
        "enableBgp": {
            "type": "bool",
            "defaultValue": true
        },
        "connectionProtocol": {
            "type": "string",
            "defaultValue": "IKEv2"
        },
        "ipsecPolicies": {
            "type": "array",
            "defaultValue": []
        },
        "dpdTimeoutSeconds": {
            "type": "int",
            "defaultValue": 45
        },
        "Gateway2ResourceGroup": {
            "type": "string",
            "defaultValue": "AVD-Environment"
        },
        "virtualNetworkGatewayName2": {
            "type": "string",
            "defaultValue": "VPNGW-SEASIA"
        },
        "ingressNatRules": {
            "type": "array",
            "defaultValue": []
        },
        "egressNatRules": {
            "type": "array",
            "defaultValue": []
        },
        "ingressNatRules2": {
            "type": "array",
            "defaultValue": []
        },
        "egressNatRules2": {
            "type": "array",
            "defaultValue": []
        },
        "connectionReverseName": {
            "type": "string",
            "defaultValue": "VNET2toVNET1"
        },
        "connectionReverseLocation": {
            "type": "string",
            "defaultValue": "southeastasia"
        },
        "SharedKey": {
            "type": "string",
            "defaultValue": "Sh@redKey"
        }
    },
    "resources": [
        {
            "name": "[parameters('connectionName')]",
            "type": "Microsoft.Network/connections",
            "apiVersion": "2023-09-01",
            "location": "[parameters('location')]",
            "tags": {},
            "dependsOn": [],
            "properties": {
                "connectionType": "[parameters('connectionType')]",
                "virtualNetworkGateway1": {
                    "id": "[resourceId(parameters('Gateway1ResourceGroup'),'Microsoft.Network/virtualNetworkGateways',parameters('virtualNetworkGatewayName1'))]"
                },
                "useLocalAzureIpAddress": "[parameters('useLocalAzureIpAddress')]",
                "enableBgp": "[parameters('enableBgp')]",
                "connectionProtocol": "[parameters('connectionProtocol')]",
                "authenticationType": "PSK",
                "SharedKey": "[parameters('SharedKey')]",
                "ipsecPolicies": "[parameters('ipsecPolicies')]",
                "dpdTimeoutSeconds": "[parameters('dpdTimeoutSeconds')]",
                "ingressNatRules": "[parameters('ingressNatRules')]",
                "egressNatRules": "[parameters('egressNatRules')]",
                "virtualNetworkGateway2": {
                    "id": "[resourceId(parameters('Gateway2ResourceGroup'),'Microsoft.Network/virtualNetworkGateways',parameters('virtualNetworkGatewayName2'))]"
                }
            }
        },
        {
            "name": "[parameters('connectionReverseName')]",
            "type": "Microsoft.Network/connections",
            "apiVersion": "2023-09-01",
            "location": "[parameters('connectionReverseLocation')]",
            "tags": {},
            "dependsOn": [],
            "properties": {
                "connectionType": "[parameters('connectionType')]",
                "virtualNetworkGateway1": {
                    "id": "[resourceId(parameters('Gateway2ResourceGroup'),'Microsoft.Network/virtualNetworkGateways',parameters('virtualNetworkGatewayName2'))]"
                },
                "useLocalAzureIpAddress": "[parameters('useLocalAzureIpAddress')]",
                "enableBgp": "[parameters('enableBgp')]",
                "connectionProtocol": "[parameters('connectionProtocol')]",
                "authenticationType": "PSK",
                "SharedKey": "[parameters('SharedKey')]",
                "ipsecPolicies": "[parameters('ipsecPolicies')]",
                "dpdTimeoutSeconds": "[parameters('dpdTimeoutSeconds')]",
                "ingressNatRules": "[parameters('ingressNatRules2')]",
                "egressNatRules": "[parameters('egressNatRules2')]",
                "virtualNetworkGateway2": {
                    "id": "[resourceId(parameters('Gateway1ResourceGroup'),'Microsoft.Network/virtualNetworkGateways',parameters('virtualNetworkGatewayName1'))]"
                }
            }
        }
    ]
}
~~~
</details>

# 接続 を行う前と後の ステータスの変化について
① 接続前、② 接続中、③ 接続後 の状態を紹介します。

## ① 接続前
### ①-1 VPN ゲートウェイ の BGP ピア
接続前なので、BGP ピア は確立しておらず、何も値は存在していません。

**１台目のゲートウェイ** (Japan East)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1da73e4e-ef94-51cb-e32b-9218b014c24e.png)

**２台目のゲートウェイ** (Southeast Asia)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ee93a30d-af94-89a9-eb34-0818cb3b4770.png)

### ①-2 VM からの Ping と Trace Route
接続前なので、Ping は通りません。

**Japan East VM：VNET1 から VNET2　　　　　Southeast Asia VM：VNET2 から VNET1**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/20b3b8e0-99cf-d353-144d-e985b40896e3.png)

### ①-3 Network Watcher（IP フロー検証）
Japan East VM から、Southeast Asia VM へ、**アクセスが拒否** されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d9fc5daa-9b6c-1552-a237-8c8908cd30f1.png)

Southeast Asia VM から Japan East VM へ、**アクセスが拒否** されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/87ab01e9-173a-3187-5803-26aebd1813d5.png)

### ①-4 Network Watcher（ネクストホップ）
Japan East VM から、Southeast Asia VM へ、ネクストホップの種類は **None** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e153515e-f39f-9803-fe56-60cf5fa9352f.png)

Southeast Asia VM から Japan East VM へ、ネクストホップの種類は **None** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/436ef9ec-ca7d-87fa-332a-0b910678cc43.png)

## ② 接続中
1. 接続を行った直後の状態は **不明** になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1069a9a4-59d8-f355-2644-ac3be6741f6e.png)
　<br>
1. しばらく待っていると **未接続** から **接続済み** に変化していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/a3987c37-3902-2b5b-fcda-14eb39a2429f.png)
　<br>
1. 以下のように、両方が **接続済み** になるまで、５分くらい掛かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1658cebe-1d19-a03c-fe0b-add35b097a92.png)

## ③ 接続後
### ③-1 VPN ゲートウェイ の BGP ピア
接続すると、BGP ピアが確立され、以下のように表示されます。

**１台目のゲートウェイ** (Japan East)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/0d7f9478-ee7d-e7ff-ea02-f69e509efbf2.png)

**２台目のゲートウェイ** (Southeast Asia)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/12df6eba-8cf0-96be-083e-1eb34091129c.png)

:::note warn
**BGP が無効の場合**
BGP が無効の場合は、BGP ピア には何も表示されません。
この場合は、トランジット通信 ができなくなります。
なお、BGP が無効な場合でも、V2V で 直接接続した 仮想ネットワーク同士は、ルーティングされます。
:::

### ③-2 VM からの Ping と Trace Route
接続後は、以下のように Ping と Trace Route が通ります。

**Japan East VM：VNET1 から VNET2　　　　　Southeast Asia VM：VNET2 から VNET1**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/f4e60b4a-8377-21ef-2a1f-dc09c18b1e55.png)

:::note warn
**注意**
展開したての VM では Ping が通りません。
Windows Firewall の設定を変更して Ping が通るようにしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/02f43a5c-4ec8-339a-2fe5-558ac697d98c.png)

以下は、有効になった状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/18f75f0b-7101-2738-c643-36a474e2b0e2.png)
:::

### ③-3 Network Watcher（IP フロー検証）
Japan East VM から、Southeast Asia VM へ、**アクセス許可** と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/687f366e-36bb-a203-26cd-cffe104ad843.png)

Southeast Asia VM から Japan East VM へ、**アクセス許可** と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/77cea631-4bac-f0f3-6757-d2231b89b0ce.png)

### ③-4 Network Watcher（ネクストホップ）
Japan East VM から、Southeast Asia VM へ、ネクストホップの種類は **VirtualNetworkGateway** となり、ゲートウェイ の パブリック IP が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/972c7cab-223c-af3c-02e0-6a78191e39e7.png)

Southeast Asia VM から、Japan East VM へ、ネクストホップの種類は **VirtualNetworkGateway** となり、ゲートウェイ の パブリック IP が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/eb761d84-eae2-010a-4fd1-37ad08ab7247.png)

以上で、２台の VPN ゲートウェイ を V2V で接続することができました。