Azure 環境内で S2S VPN with BGP 環境を構築する (GUI / Azure Portal 編)

こんにちは駆け出しアーキテクトのやまぱんです。
今回は Azure 環境内でS2S VPN with BGP 環境 をAzure Portal で作ってみます。
IaC (Bicep) でパッとデプロイしてつくるなら[親愛なる同僚のこちらの記事](https://zenn.dev/microsoft/articles/8d1558a8a2127c)で紹介されてるBicepを使ってデプロイするとよいでしょう。まさにポチポチして待ってるだけでできます！

ただ、やはり自分で1つずつ設定して作ることもしておこうと思ったら少しハマったので自分の為にもこの記事を書きます。

似たような記事をいくつか見つけましたが UI が変わっていたり、図がちょっとおかしかったり、肝心なところが分かりづらかったり、BGP を有効にしてなかったりしていたので改めて書き下ろしてみました。

誰かの役に立てば幸いです。
コメントなどあれば是非いただければと思います👸

P2S の方の記事も上げましたのでよければご覧ください。

https://qiita.com/aktsmm/items/859e4b86bd033d48a112

-----------------------------------------------------------

さて、Vnet 同士をつなげるには Vnet peering や Vnetどうし向けの V2V VPN などの方法がありますが、 Azure 環境内でオンプレ環境とつなげるような疑似環境を作るには S2S VPN を構成することになります。
VPNゲートウェイのデプロイに時間がかかるのでスムーズにいって40分程度はかかると思います。



# 前置き
## Azure VPN Gateway とは
Azure VPN Gateway は 仮想ネットワークゲートウェイ(Virtual Network Gateway)の一種です。
なので、デプロイするときは仮想ネットワークゲートウェイをデプロイし、ゲートウェイの種類でVPNを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/ae37e9a6-3194-db73-e330-b2b64bde4993.png)

## Azure VPN Gateway の接続方法
そもそも Azure VPN Gateway の接続方法は以下の３種類あります。
+ S2S / Site to Site 接続 (**今回はこちら**)
他クラウド環境と接続したり、オンプレミス環境と接続したり
+ V2V / VNet to VNet 接続 
Vnet　同士 の VPN 接続
+ P2S / Point to Site 接続 
クライアントPCとAzure Vnet を接続

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-vpngateways#connectivity

## Local Network Gateway
Local Network Gatewayは **接続先のネットワークの情報** を格納するものです。
Local Network Gatewayはいわゆる名前から想像するようなゲートウェイではないです。
名前が非常にややこしいと思います。
**これがわりと今回の肝です。**

# ざっくりやりたいこと
こんな感じで2つの独立した Azure のネットワーク (Vnet) を VPN (S2S接続) でつなげたい。
ついでに BGP も有効にしたい。
![2023-11-06_22h07_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/d32c5e23-9a14-6a5c-bfed-72a4b6ddf8f9.png)

# as-is / to-be
## 事前の環境(as-is)
こんな感じの環境からスタートします。
+ クラウド側 (Vnet-Hub)が10.100.0.0/16
+ オンプレ側 (Vnet-Onp)が172.16.0.0/16
ただし、Azure Firewall やAzure Bastionは今回不要なのでなくても構いません。
最低限 Vnet があればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/065def92-7f6b-5e4e-dc56-ead5fd306a1d.png)

## 完成する環境(to-be)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/fe93dc4b-70ac-338d-f821-ca74fb0425fe.png)


# 手順
実際につくっていきます。
上述の通り、事前に Vnet は既にある前提で作っていきます。


## GatewaySubnetを作る
+ クラウド側 (Vnet-Hub)での作業イメージ
[+ゲートウェイ サブネット] から作成していきます。設定はデフォルトのまま。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/798ac2f2-dcd5-b1f0-5458-99516a92ec0e.png)
+ 同じようにオンプレ側(Vnet-Onp)でも作る


## VPNゲートウェイを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/8aeaddde-d9e1-2004-f7a1-17a31963678d.png)
Azure Portal の検索窓から「VNG」や「仮想ネットワークゲートウェイ」で検索する。
時間がかかる (20分ぐらいはかかります) ので、コンビニいったり、洗濯したり、散歩したり、溜まってるLINEを返すなどするとよいでしょう。
SKUは検証用なので高価なものは必要ないので廉価なものを設定しています。

+ クラウド側 (Vnet-Hub)での設定値
名前は vpngw-hub で作成します。
![2023-11-06_22h28_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/826a7834-1131-ec9a-de46-b66d974ca834.png)
:::note info
ASNは **65010** を指定
:::

+ オンプレ側 (Vnet-Onp)での設定値
名前は vpngw-onp で作成します。
 ![2023-11-06_22h36_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/f7036cdd-e4e5-c8af-f990-209d473ec233.png)
:::note info
 ASNは **65020**を指定
:::

+ 作成したVPNゲートウェイ(仮想ネットワークゲートウェイ)のパラメーターは[仮想ネットワークゲートウェイ] → [構成] から確認可能

ここまで出来たらこんな感じになってるはず。
あとはローカルネットワークゲートウェイを作って接続です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/1794cc89-6665-b305-d6a1-b3d7bba5e1fc.png)



## ローカルネットワークゲートウェイを作る
Azure Portal の検索窓から「LNG」や「ローカルネットワークゲートウェイ」で検索する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/295617cd-1d9d-f3da-8da0-35ef774c0f7d.png)

:::note info
ローカルネットワークゲートウェイは接続先のネットワークの情報を設定します。
つまり・・・
+ クラウド側 (Vnet-Hub)のローカルネットワークゲートウェイはオンプレ側 (Vnet-Onp)のVPNゲートウェイの情報をいれます
+ オンプレ側 (Vnet-Onp)のローカルネットワークゲートウェイはクラウド側 (Vnet-Hub)のVPNゲートウェイの情報をいれます
:::

+ クラウド側 (Vnet-Hub)での設定値
前の手順で作成した**オンプレ側 (Vnet-Onp)** のVPNゲートウェイの値を確認しつつ入れていきます。
名前は HUB_LNG で作成します。
![2023-11-06_23h18_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/1ac1411b-fcea-3f17-6533-0c413bc16d69.png)
このあたりを参考にして設定値を下記のように入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/81e8d92f-8e40-2dfc-79b5-1fec88bb7889.png)

+ オンプレ側 (Vnet-Onp)での設定値
こちらも同様に、前の手順で作成した**クラウド側 (Vnet-Hub)** のVPNゲートウェイの値を確認しつつ入れていきます。
名前は Onp_LNG で作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/c3357dce-a418-9ed1-b565-eef16fb053ab.png)

このあたりを参考にして設定値を下記のように入れます。
![2023-11-06_23h10_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/62a98056-bec0-7cda-46e9-a839c062e6fe.png)

ここまでくればあとは接続するだけ！

## 接続します (接続のデプロイ)
さて、メインの接続です。
ここまでの設定に問題がなければ接続もスムーズにいくはず！

+ クラウド側 (Vnet-Hub)での設定値
作成したローカルネットワークゲートウェイ(HUB_LNG) → [接続]  → [追加]へ進みます。
![2023-11-06_23h42_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/e38758a2-5c46-9b23-3e58-c5f190e38fcb.png)

接続の種類：サイト対サイト、名前は HubToOnp 、pskはpassword、BGPは有効、仮想ネットワークゲートウェイとローカルネットワークゲートウェイはクラウド側のリソースを指定し、そのほかはデフォルトです。
![2023-11-06_23h46_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/44a29212-9c72-96cb-71e5-df0dcebe25db.png)

そんなかんじで下記のような感じで作成。
![2023-11-06_23h39_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/39355c38-a278-0472-6bd9-e76e852dc105.png)

できあがると状態が"不明"のままで表示されます。
オンプレ側もつくると状態が変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/52c1d263-8d05-5cfa-1c96-db53ded7d6d0.png)


+ オンプレ側 (Vnet-Onp)での設定値
名前は OnpToHub、pskも同じものを設定し、その他同様に同じように設定します。
下記のような感じで作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/3c1ba15e-1baf-d5ac-b683-9609315ba19d.png)

## 接続の確認
### 接続リソース
"接続リソース"が正しく作成されていると、2~3分まって更新すると状態が **"不明"**から**"接続済"** になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/779aea41-eb80-8a6a-69d8-f0ab249e77f5.png)

### 仮想ネットワークゲートウェイ 
仮想ネットワークゲートウェイ → [BGPピア] から下記のように確認することができます。
これはクラウド側 (Vnet-Hub) 10.100.0.0/16 側の仮想ネットワークゲートウェイを確認した結果です。
オンプレ側 (Vnet-Onp) ：172.16.0.0/16 のルートを学習していることが分かります。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/a8677c32-3f7a-632a-4e5a-e5d932baa0ce.png)


### VM による ping の確認
予め受け側のマシンで管理者権限でコマンドプロンプトを起動して下記コマンドで ping 応答を許可しておきます。（ここで説明は省きますが、NSG も許可しておきます)
```cmd:cmd
netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol=icmpv4:8,any dir=in action=allow
```
下記の通り、クラウド側 (Vnet-Hub)：10.100.1.4 からオンプレ側 (Vnet-Onp)：172.16.1.4 へ pingコマンドを教えて打って、応答が返ってきていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/a855d9ee-cb33-8a60-3625-1fcee4028c53.png)


# 参考
https://learn.microsoft.com/ja-jp/azure/vpn-gateway/tutorial-site-to-site-portal

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-vpngateways

https://qiita.com/hikaru_motomiya/items/a2e9e11b1a2246b8e30d

https://zenn.dev/microsoft/articles/8d1558a8a2127c