Azure VNet (Azure VM) からの外部接続(インターネット接続) について考える

こんにちは、アーキテクトのやまぱんです。
補足コメントや質問、<font color="red">**いいね、拡散**</font>、是非お願いします🥺！
間違ってたら<font color="red">**優しく**</font>教えてください！


## きっかけ
**「既定の SNAT 通信が廃止されるし、いつ明示的な外部接続方法が必要になるかわからないから、Azure VM からの外部接続方法(インターネット接続)をまとめよ！」** との天啓が下りました。

:::note
+ Azure 既定の送信アクセスの動作変更のアナウンスに関する補足 (Tracking ID:3T84-PZZ)
https://jpaztech.github.io/blog/network/default-outbound-access-for-vms-will-be-retired/
> 2025 年 10 月 1 日よりも前に作成している既存の Azure VM は、現状、本通知の対象外となるため影響を受けませんが明示的に送信接続の設定を加えていただくことを推奨としています。
:::

追記　：　その後 RTT 比較もしてみました！

https://qiita.com/aktsmm/items/2dcee74c12c5ba0bd011

## 外部接続方法一覧表
さて早速ですが、外部接続方法の一覧とその機能の表になります。
表が大きくなるので 2 つに分けています。

+ 表1: 構成単位、IP 割当、NAT 方式、最大 SNAT ポート、タイムアウト、プロトコル、インバウンド接続

| |構成単位|IP 割当| NAT 方式|最大 SNAT ポート|タイムアウト|プロトコル|インバウンド接続|
|:-|:-|:-|:-|:-|:-|:-|:-|
|[既定のSNAT(*)](https://learn.microsoft.com/ja-jp/azure/virtual-network/ip-services/default-outbound-access)|VM or 可用性セット|**ランダム**|NAPT|1,024|4|TCP/UDP|なし|
|[NATGW](https://learn.microsoft.com/ja-jp/azure/nat-gateway/nat-overview)|サブネット|固定|NAPT|1,032,192(64,512/IP × 16)特定の宛先あたり 50,000 /IP |[4~120](https://learn.microsoft.com/ja-jp/azure/nat-gateway/nat-overview#connection-timeouts-and-timers)|TCP/UDP|なし|
|[Public IP](https://learn.microsoft.com/ja-jp/azure/virtual-network/ip-services/public-ip-addresses)|NIC|固定|**NAT**|-|[4](https://learn.microsoft.com/ja-jp/azure/virtual-network/ip-services/public-ip-addresses#sku)|TCP/UDP/**ICMP/ESP**|**あり**|
|[外部LB-送信規則](https://learn.microsoft.com/ja-jp/azure/load-balancer/outbound-rules)|バックエンドプール|固定|NAPT|64,000 / Public IP|[4~100](https://learn.microsoft.com/ja-jp/azure/load-balancer/load-balancer-tcp-reset#configurable-tcp-idle-timeout)|TCP/UDP|負荷分散規則やインバウンド NAT 規則 により可能|
|[外部LB-負荷分散規則](https://learn.microsoft.com/ja-jp/azure/load-balancer/manage-rules-how-to#load-balancing-rules)|バックエンドプール|固定|NAPT|1,024|4|TCP/UDP|**あり**|
|[Azure FW](https://learn.microsoft.com/ja-jp/azure/firewall/overview)|**VNet (跨ぎも可)** |固定|NAPT|624,000(2,496 / IP ×  250 ) |[4](https://learn.microsoft.com/ja-jp/azure/firewall/firewall-faq#azure-firewall---------------------------)|TCP/UDP|Azure FW の DNAT構成に依存|
|[Azure FW + NATGW](https://learn.microsoft.com/ja-jp/azure/firewall/integrate-with-nat-gateway)|**VNet (跨ぎも可)**|固定|NAPT|1,032,192(64,512/IP × 16)|[4](https://learn.microsoft.com/ja-jp/azure/firewall/firewall-faq#azure-firewall---------------------------)|TCP/UDP|Azure FW の DNAT構成に依存|

+ 表2: スループット、ユースケース

| |スループット| ユースケース|
|:-|:-|:-|
|[既定のSNAT(*)](https://learn.microsoft.com/ja-jp/azure/virtual-network/ip-services/default-outbound-access)|[VM に依存](https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-machine-network-throughput#expected-network-throughput)|テスト用 VM|
|[NATGW](https://learn.microsoft.com/ja-jp/azure/nat-gateway/nat-overview)|[MS Learn参照](https://learn.microsoft.com/ja-jp/azure/nat-gateway/nat-gateway-resource#performance)|大量アウトバウンド|
|[Public IP](https://learn.microsoft.com/ja-jp/azure/virtual-network/ip-services/public-ip-addresses)|[VM に依存](https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-machine-network-throughput#expected-network-throughput)|VM 単位 の Public IP 、インバウンド通信も必要な場合|
|[外部LB-送信規則](https://learn.microsoft.com/ja-jp/azure/load-balancer/outbound-rules)|[VM に依存](https://learn.microsoft.com/ja-jp/azure/load-balancer/load-balancer-faqs#azure-load-balancer-----------------------------)|・負荷分散<br>・サブネット未満の単位で送信接続制御|
|[外部LB-負荷分散規則](https://learn.microsoft.com/ja-jp/azure/load-balancer/manage-rules-how-to#load-balancing-rules)|[VM に依存](https://learn.microsoft.com/ja-jp/azure/load-balancer/load-balancer-faqs#azure-load-balancer-----------------------------)|負荷分散規則と同時に簡易送信接続を構成する場合|
|[Azure FW](https://learn.microsoft.com/ja-jp/azure/firewall/overview)|[MS Learn参照](https://learn.microsoft.com/ja-jp/azure/firewall/firewall-performance#performance-data)|集中管理|
|[Azure FW + NATGW](https://learn.microsoft.com/ja-jp/azure/firewall/integrate-with-nat-gateway)|[NATGW に準ずる](https://learn.microsoft.com/ja-jp/azure/nat-gateway/nat-gateway-resource#performance)|集中管理|


*NATGW は Azure NAT Gateway をさす。
*既定の SNAT は廃止が決定しています。Ref：[MS Learn](https://learn.microsoft.com/ja-jp/azure/virtual-network/ip-services/default-outbound-access)
+ 既定の SNAT を使う条件：
> 同じグループ（VM、可用性セット、またはVMスケールセット）内のすべての NIC が、Standard PIP、Standard Public LB、またはNAT Gatewayに関連付けられていないこと。VMSS (仮想マシンスケールセット) の一部ではないこと。


## VNet をまたがる集約構成をとれるか？
結論から言うと **Azure Firewall を用いた構成(Azure Firewall 単体 or Azure Firewall + NATGW) でのみ**、ルーティング次第で取れます。

また、 Azure Load Balancer や Azure NAT Gateway は以下のように VNet をまたぐ構成をサポートしていません。

:::note info
+ Azure Load Balancer
参考: Azure Load Balancer のコンポーネント 
https://learn.microsoft.com/ja-jp/azure/load-balancer/components#limitations

> ロード バランサーの規則は、2 つの仮想ネットワークにまたがることはできません。 すべてのロード バランサーのフロントエンドとそのバックエンド インスタンスは、1 つの仮想ネットワーク内に存在する必要があります。

+ Azure NAT Gateway
参考: Azure NAT Gateway とは 
https://learn.microsoft.com/ja-jp/azure/nat-gateway/nat-overview#nat-gateway-configurations

> NAT ゲートウェイは、複数の仮想ネットワークにまたがることはできません。
:::

その他の方法として NVA にアウトバウンド 接続をルーティングし、その NVA に Public IP をつけてアウトバウンド接続を構成するようなやや作りこむ方法もありますが、ここでは考慮しません。

#  Azure Firewall 単体か Azure Firewall ＋ NATGW か
集約化、および一括管理のために Azure Firewall を採用するとなった場合に、Azure Firewall  単体か Azure Firewall ＋ NATGW かの検討が必要になります。

:::note info
+ ポイント1 . Azure Firewall のゾーン冗長が必要か否か
　まず、**そもそも要件としてゾーン冗長が必要な場合、 Azure FW ＋ NATGW の構成は取れません。**
 Azure Portal の場合、以下より確認可能です。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/bfb1aa54-101a-ebfe-a545-77572b169d77.png)

+ ポイント2. Azure Firewall + NATGW のメリット
    1. 最大 SNAT ポート数が NATGW を使った時の方が多い
    2. NATGWの方が IP アドレスの集約ができる
　　Azure Firewall では 1 インスタンス (1 Public IP) あたり 2,496 個の SNAT ポート
　　NAT Gateway では 1 Public IP アドレスあたり 64,512 個の SNAT ポート
  
+ ポイント3. Azure Firewall のメリット
    NATGW が無い分コストが安い

+ ポイント4. IP アドレスの割り当て
    Azure Firewall ＋ NATGW はIP 割当がランダムなのに対し、Azure Firewall の場合は概ねプライマリ IP が枯渇したら次の IP を使うような動きになる

+ ポイント5. 最大 SNAT ポート数
    Azure Firewall ＋ NATGW ：の方が最大 SNAT ポート数は以下の通り大きいです。

| 構成方法|最大SNATポート数|
|:-|:-|
|Azure Firewall ＋ NATGW |1,032,192  (64,512/IP × 16) |
|Azure Firewall |624,000  (2,496 / IP × 250)|

 
その他、および詳細は下記参照
- Firewall からインターネットに SNAT して通信する時のパブリック IP の使われ方
https://jpaztech.github.io/blog/network/fw-snat/#Azure-Firewall-%E3%81%A8-NAT-Gateway-%E3%81%AE%E6%AF%94%E8%BC%83%E8%A1%A8

:::


+ NAT ゲートウェイを使用した SNAT ポートのスケーリング

https://jpaztech.github.io/blog/network/fw-snat/

##  Azure DDoS Protection について
Azure DDoS Protection は Public IP リソースに着けることが可能です。
（注意：[NATGW には DDoS プロテクション をつけられません](https://learn.microsoft.com/ja-jp/azure/nat-gateway/faq#ddos-------------ip-------nat---------------)が、他のリソースと異なり、送信専用接続なので考慮不要です)

不特定多数のIPアドレスからの通信を許可している場合、Azure DDoS Protection を付けないと万一の場合、特定の IP アドレス(NAT の Public IP) が DDoS 攻撃を受けるとそれが紐づくインスタンスリソースがダウンする可能性があるので、**重要なシステムの場合には必ず DDoS 保護 を有効に**しましょう。

また Azure には標準で Azure 基盤そのものに対する DDoS 保護(Azure DDoS インフラストラクチャ保護)が存在しますが、こちらはお客様固有のリソース・環境に対する保護ではありません。
> 他のサービスでは、既定のインフラストラクチャ レベル DDoS 保護が適用
Ref：https://learn.microsoft.com/ja-jp/azure/ddos-protection/ddos-protection-overview#architecture

特定の IP アドレスからのインバウンド通信しか NSG で許可していない場合は、Azure DDoS 保護 (有償プラン) を導入しても、インバウンド通信を軽減するような動き・攻撃を軽減する措置はそもそもとれないので、のこるメリットとしては監視できるメリットがあります。


+ Azure DDoS Protection とは何か?

https://learn.microsoft.com/ja-jp/azure/ddos-protection/ddos-protection-overview


## そもそもなぜ SNAT ポート数を気にするか
NAT（Network Address Translation）や SNAT（Source NAT）の概念を理解する際に、なぜ SNAT ポート数を気にする必要があるのか疑問に思うかもしれません。
これには一般論として以下のような理由があります。

### 1. ポートの数に限りがある
各 IP アドレスは最大 65535 のポートが使えます。一つの Public IP を多くの端末が共有すると、1 台当たりが利用可能な Public IP のポート数が限られてきます。例えば、企業のネットワークや家庭内の複数のデバイスがすべて同じパブリックIPアドレスを使用する場合、この限られたポート数がすぐに枯渇してしまいます。

### 2. ポートがすぐに解放されない
セッションが終了しても、ポートがすぐに解放されないことがあります。
これにより、実際には使用されていないポートも再利用できず、枯渇してしまう可能性が高まります。

### 3. アプリケーションによるポートの大量使用
特定のアプリケーションやサービスは、一度に大量のポートを使用するため、ポート枯渇の原因となります。


### 例え話で理解する
想像してみてください。ある家（内部ネットワーク）には、1本の電話線（1つのパブリックIPアドレス）しかありません。この家族は、電話をかけるために多くの電話番号（ポート）を共有します。しかし、電話線は限られた数の電話しか同時にかけられません。

もし家族全員が同時に電話をかけようとすると、使える電話番号がすぐになくなってしまいます。さらに、電話が終わってもすぐには電話番号を再利用できないことがあります。これがSNATでポートが枯渇する理由です。

### 対策
SNATポート枯渇を回避するためには、以下のような対策が考えられます。

+ 複数のパブリックIPアドレスを使用する。
+ ポートを効率的に管理する。


## その他参考
- Azure VM の送信接続 (SNAT) オプション まとめ
こちら非常に詳しくまとまっておる公式サポートブログです。

https://jpaztech.github.io/blog/network/snat-options-for-azure-vm/

> 送信規則は Standard SKU のパブリック ロードバランサーで利用可能な送信接続構成です。バックエンド プールに Azure VM を配置して送信規則を定義すると、フロントエンドのパブリック IP アドレスを使った SNAT が提供されます。
>
> 注意事項
複数のパブリック IP アドレス (フロントエンド IP 構成) をまとめて指定すると、バックエンド プール全体としては 64,000 x <IP アドレスの数> だけ SNAT ポートが用意されます。しかし、どれだけパブリック IP アドレスを追加しても、各 Azure VM に割り当てられる最大の SNAT ポート数は 64,000 までです。

+ Azure NAT Gateway とは

 https://learn.microsoft.com/ja-jp/azure/nat-gateway/nat-overview
 
> 完全にプライベートなままでインターネットにアウトバウンド接続できます。 インターネットからの未承諾のインバウンド接続は、NAT ゲートウェイ経由では許可されません。 **NAT ゲートウェイを通過できるのは、アウトバウンド接続への応答パケットとして到着するパケットのみです。**


+ Azure Firewall での SNAT/DNAT について

Azure Firewall での NAT 構成について非常にわかりやすく説明されています。


https://zenn.dev/microsoft/articles/zenn-azfw-snat-dnat

+ Azure Firewall のスケールアウトにはどのくらいの時間がかかりますか。 - Azure Firewall に関する FAQ

https://learn.microsoft.com/ja-jp/azure/firewall/firewall-faq#azure-firewall--------------------------

+ Azure NAT Gateway 接続のトラブルシューティング
>  TCP アイドル タイムアウト タイマーを 4 分より短く設定することはできません。

https://learn.microsoft.com/ja-jp/azure/nat-gateway/troubleshoot-nat-connectivity#possible-solutions-for-snat-port-exhaustion-or-hitting-simultaneous-connection-limits

+ Azure Firewall のキャパシティに関する問題およびその原因 / 対策について

https://jpaztech.github.io/blog/network/Azure_Firewall-capacity-issue/


## 謝辞
この記事を作成するにあたり、親愛なる同僚・仲間にアドバイスをいただきました、感謝します。

-----------------------------------------------------------
補足：2024/05/21(火) 時点での情報です。