Azure内の通信をダブルNATする

駆け出しアーキテクトのやまぱんです。
今回は Azure 内の通信をダブルNATする環境を作ってみました。



### 今回やりたいこと
VM-A から VM-B への通信にダブル NAT かましたい。

* [x]  ダブル NAT：SNATとDNATをかますこと

具体的には下記のようなイメージです。
+ A からみた場合、B の宛先 IP ではなく別にの IP にアドレスに向けて通信してる
なおかつ
+ B からみた場合、A の送信元 IP ではなく別の IP アドレスから通信が来てる
ように見せる

ちなみに (ダブル) NATしない場合は同一 Vnet 内だったらそのままのプライベートIPで通信できますし、Vnet 違いであれば VNetピアリング(仮想ネットワーク ピアリング)で通信することができます。

・仮想ネットワーク ピアリング
https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-network-peering-overview

### なんでそんなことしたいか
プライベートネットワーク内でも、複数企業や組織が利用している場合があると思います。
その組織間でお互いにNWの構成(IPアドレス、5タプル情報)をセキュリティの観点等からお互いに見せたくないといったそういったニーズにこたえられます。



### なにを使うか
これを Azure 上で実現するには、"Azure Private Link サービス" と ロードバランサー を使います。

:::note info
Azure 上の通信をダブル NATするには　Azure Private Link サービスを使う
:::

https://learn.microsoft.com/ja-jp/azure/private-link/private-link-service-overview

### 今回作った構成
まず先にポンチ絵です。
今回はこのような環境を作って VM-A(10.0.0.4) から VM-B(10.2.0.5) への通信にダブル NAT をかましたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/30593ccc-93c6-49b7-de7e-c0193a84af2f.png)

### 環境を作る
参考までに簡単に手順を簡単に紹介します。全てのリソースは東日本リージョンを指定して作っています。
実際に作る際は下記も参考にして進めてください。
https://learn.microsoft.com/ja-jp/azure/private-link/private-link-service-overview

ポンチ絵と実際のリソース名の紐づけ
>VM-A：VM-Win2019 (10.0.0.4)
VM-B：VM-Win2019-2 (10.0.0.5)
Vnet-A：RG-normal-vnet (10.0.0.0/16)
　Subnet-A:default (10.0.0.0/24)
Vnet-B：temp-vnet (10.2.0.0/16)
　Subnet-B:default (10.2.0.0/16)
LB：LB-temp
Private link service：PrivateLink-01


#### Vnet-B 側

##### 1.LB を作る
内部ロードバランサーを作ります。

##### 2.VM-B を作る

##### 3.VM-B をLB の配下におき、NATの設定をする
今回は下記のような設定値で実施しました。

+ フロントエンド IP
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/dcf1ad12-9504-68c4-d058-6b49bdf9e696.png)
+ バックエンドプール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/48b6cd75-5702-f999-deb8-332e8cc69686.png)
+ インバウンド NAT 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/8c766367-ce09-e3db-f0f9-fe643525df7a.png)
RDPするのでフロントエンドもバックエンドもポート3389 で RDP という名前のインバウンド規則を設定しました。

##### 4.プライベートリンクサービスを作る
 Azure Portal からプライベートリンクサービスを検索して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/abf069db-1998-d704-d5d1-59499ff6b9c1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/e8784e6a-c555-265d-5b85-254b6962be3d.png)

設定値は今回は下記で作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/3d0afabd-e68d-3bb4-4b12-6112dd2254e5.png)
作成後 NAT IP が 10.2.0.6 が割り当てられました。

#### Vnet-A 側
続いて　Vnet-A 側！

##### 1.先ほど環境を作ったプライベートリンクサービスのエイリアスをコピーしておきます。
(Dynamic(動的)で 割り当てられた NAT IP もこちらから確認できます。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/84d09853-e47b-9c86-08fa-0f3dbd8aa5ab.png)

##### 2.プライベートエンドポイントを　Vnet-A に作成！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/b338c503-bdc6-f8b1-19b4-68f9d2bea0ab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/ba5180df-a659-9024-20d1-2bb029fce06a.png)

作成途中で先ほどコピーしたエイリアスを貼り付けウィザードに従って作成します。
今回の設定値は以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/6bb38277-d857-d95e-8fe5-c5d85da611a3.png)


これで環境作成は完了！

### 試す
VM-A から VM-B へRDP して確認してみたいと思います。
具体的には　VM-A から Private EndPoint に対して RDP をして、VM-Bにつながる想定です。
なお、今回 Vnet-A と Vnet-B の間の Vnet ピアリング は 構成していないので VM-A から VM-B のアドレス 10.2.0.5 に向けて RDP してもVnetが違うのでつながりません。


IPアドレス
+ VM-A：VM-Win2019 (10.0.0.4)
+ Private EndPoint (10.0.0.6)
+ VM-B：VM-Win2019-2 (10.2.0.5)
+ プライベートリンクサービス(10.2.0.6)

#### DNAT の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/b4cd494b-4ba5-ccea-87b1-8ba4b43cf6f9.png)


VM-A から RDP をした窓を見ると  Private EndPoint の 10.0.0.6 となっているが実際のプライベート IP は 10.2.0.5で、DNAT が効いてることが分かります。
 → VM-A からみると 10.0.0.6 (Private EndPoint のIP) が　VM-B のアドレス(宛先)と見えるが実際は違ってる。

#### SNAT の確認
SNAT の確認には VM-B のパケットキャプチャを取ってみたいと思います。
Azure VM のパケットキャプチャの取り方は下記をご参照ください。

https://qiita.com/aktsmm/items/6d77b8af1eb10f28cab5
とって、wireshark でみた結果が下記です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/ebb395f7-51a9-b1fa-7d6e-e763e6ae25a1.png)

でてるIPアドレスは VM-B 自身の 10.2.0.5 とプライベートリンクサービスの NAT IP が 10.2.0.6 のみで SNAT も効いてることが分かります。
 →  VM-B からみると 10.2.0.6 (プライベートリンクサービスの NAT IP) が VM-A のアドレス(送信元)と見えるが実際は違ってる。


### おわり
今回はすべて東日本にリソースを作りましたが、リージョンが違っても可能です。
またオンプレミスからの通信でも可能です。
下記公式 Docs 抜粋。
>Private Link サービスには、任意のパブリック リージョン内の承認されたプライベート エンドポイントからアクセスできます。 プライベート エンドポイントは、同じ仮想ネットワークとリージョン間でピアリングされた仮想ネットワークから到達できます。 プライベート エンドポイントには、プライベート VPN または ExpressRoute 接続を使用して、グローバルピアリングされた仮想ネットワーク、およびオンプレミスから到達できます。
https://learn.microsoft.com/ja-jp/azure/private-link/private-link-service-overview#details