駆け出しアーキテクトのやまぱんです。
今回は Azure 内の通信をダブル NAT する環境を作ってみました。
今回やりたいこと
VM-A から VM-B への通信にダブル NAT かましたい。
- ダブル 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 サービス" と ロードバランサー を使います。
Azure 上の通信をダブル NAT するには Azure Private Link サービスを使う
今回作った構成
まず先にポンチ絵です。
今回はこのような環境を作って VM-A(10.0.0.4) から VM-B(10.2.0.5) への通信にダブル NAT をかましたいと思います。

環境を作る
参考までに簡単に手順を簡単に紹介します。全てのリソースは東日本リージョンを指定して作っています。
実際に作る際は下記も参考にして進めてください。
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 の設定をする
今回は下記のような設定値で実施しました。
4.プライベートリンクサービスを作る
Azure Portal からプライベートリンクサービスを検索して作成します。


設定値は今回は下記で作成しました。

作成後 NAT IP が 10.2.0.6 が割り当てられました。
Vnet-A 側
続いて Vnet-A 側!
1.先ほど環境を作ったプライベートリンクサービスのエイリアスをコピーしておきます。
(Dynamic(動的)で 割り当てられた NAT IP もこちらから確認できます。)

2.プライベートエンドポイントを Vnet-A に作成!
作成途中で先ほどコピーしたエイリアスを貼り付けウィザードに従って作成します。
今回の設定値は以下です。

これで環境作成は完了!
試す
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 の確認
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 でみた結果が下記です。
でてる 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






