「本番環境でいきなり外部へのHTTPS接続がリトライを繰り返してタイムアウトするようになった」
このような問題の多くは、SNATポートの枯渇またはアウトバウンドIPの不固定に起因しています。AzureのLinux VMは、デフォルトではロードバランサー経由のSNATや一時的なパブリックIPでアウトバウンド通信を行いますが、設計によってはSNATポートが枯渇したり送信元IPが不規則に変動したりします。
この記事では、Azure NAT Gateway(az network nat gateway)を使ってサブネットのアウトバウンド通信を固定IPで制御する方法を解説します。NAT Gatewayの作成からサブネットへの関連付け、Linux VMからの動作確認、SNATポート枯渇の診断とパブリックIPを追加する手順まで、azコマンドの実践例と実機ログを交えて解説します。
動作確認環境:Azure CLI 2.61 / RHEL 9.4(Azure VM上で動作確認済み)
この記事のポイント
・NAT GatewayをサブネットにつけるだけでアウトバウンドIPを固定できる
・SNATポートは1IPあたり64,000個で枯渇するとタイムアウトになる
・IPを追加するだけでSNATポートを64,000個ずつ増やせる
・MonitorのUsed SNAT Portsでポート枯渇の予兆を監視できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜAzure NAT Gatewayが必要なのか(デフォルトの問題と限界)
AzureのLinux VMは、作成時の設定によって次のいずれかのパスでアウトバウンド通信を行います。
・パブリックIPを直接アタッチ:VMのIPがそのまま送信元になる(固定だが、VMにIPを露出させる)
・ロードバランサー経由のSNAT:共有のフロントエンドIPで変換(SNATポートが制限される)
・デフォルトアウトバウンドアクセス:VNetが自動的に一時的なIPを割り当て(2025年以降、新規VMでは廃止方針)
特に問題になりやすいのが「ロードバランサー経由のSNAT」です。Azure Standard Load BalancerのSNATは1バックエンドインスタンスあたりポート数が割り当てられますが、接続先が多くなるとSNATポートが枯渇します。枯渇するとアウトバウンド接続がドロップし、HTTPタイムアウトやDNS名前解決の失敗として現れます。
また「デフォルトアウトバウンドアクセス」は2025年9月以降、新規に作成するVMでは廃止されつつあります。Azureの公式推奨はNAT Gatewayをサブネットに関連付けることで、シンプルかつ予測可能なアウトバウンド設計を実現することです。
NAT Gatewayを使う主なメリットをまとめます。
・固定のパブリックIP:送信元IPが変動しないため、外部サービスのIPフィルタリングに対応できる
・大量のSNATポート:1つのパブリックIPで最大64,000ポート(IPを追加すれば線形に増加)
・フルマネージド:可用性・スケーリングをAzureが自動で管理
・サブネット単位で適用:プライベートサブネット全体に一括適用できる
NAT Gatewayの構成要素と設計方針
NAT Gatewayを設定するには、次の3つのリソースが必要です。
| リソース | 役割 | 注意点 |
|---|---|---|
| パブリックIPアドレス | NAT後の送信元IPとなる固定グローバルIP | Standard SKUが必須(Basic SKUは不可) |
| NAT Gatewayリソース | SNATポートの管理とIP変換を行うフルマネージドゲートウェイ | ゾーン冗長にするかゾーン指定かを選択する |
| サブネットへの関連付け | 特定のサブネットのアウトバウンドをNAT Gateway経由にする | 1サブネットに関連付けできるNAT Gatewayは1つのみ |
パブリックIPプレフィックス(Public IP Prefix)を使う選択肢もあります。これは連続したIPアドレスのブロック(例:/28 = 16アドレス)をまとめて固定できるため、外部ベンダーに「この範囲のIPからアクセスします」と申告する場合に便利です。ただし本記事では基本構成として単一のパブリックIPを使う方法を解説します。
設計のポイントとして、NAT Gatewayのアイドルタイムアウトのデフォルトは4分です。長時間続く接続(例:DBコネクションプーリング)がある場合は、アプリ側のKeepAlive設定と合わせて120秒程度に調整することを検討してください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Azureの学習をもっと体系的に進めたいなら、Azure実践ハンズオン講座をご覧ください。現役エンジニアが教える実務直結カリキュラムで、VM構築からインフラ管理まで一気に習得できます。
NAT Gatewayを設定する手順
実際のazコマンドを使って、NAT Gatewayの作成からサブネットへの関連付け、Linux VMからの動作確認まで順を追って説明します。
前提として、リソースグループ(rg-demo)とVNet(vnet-demo、アドレス空間 10.1.0.0/16)、サブネット(snet-private、10.1.1.0/24)が作成済みであることとします。VNetの作成やAzure CLIのセットアップがまだの場合は、先にそちらを済ませてから本記事の手順を進めてください。
1. 既存VNetとサブネットの確認
まず、対象のVNetとサブネットが正しく存在するか確認します。
# vnet list: リソースグループ内のVNetとサブネットを確認 az network vnet list --resource-group rg-demo --query "[].{Name:name, AddressSpace:addressSpace.addressPrefixes[0]}" -o table # サブネット一覧の確認(NatGwがnoneならNAT Gateway未設定) az network vnet subnet list --resource-group rg-demo --vnet-name vnet-demo --query "[].{Name:name, Prefix:addressPrefix, NatGw:natGateway}" -o table
実行結果の例:
Name Prefix NatGw ------------ ------------- ------ snet-private 10.1.1.0/24 None snet-public 10.1.2.0/24 None
NatGwがNoneならNAT Gateway未設定です。これからNAT Gatewayを作成して関連付けていきます。
2. Standard SKUのパブリックIPアドレスを作成する
NAT GatewayにはStandard SKUの静的パブリックIPが必要です。Basic SKUは使用できないため注意してください。
# Standard SKU・静的パブリックIPの作成 az network public-ip create --resource-group rg-demo --name pip-natgw-01 --sku Standard --allocation-method Static --location japaneast # IPアドレスの確認 az network public-ip show --resource-group rg-demo --name pip-natgw-01 --query "{Name:name, IP:ipAddress, SKU:sku.name}" -o table
実行結果の例:
Name IP SKU ------------- --------------- -------- pip-natgw-01 20.x.xxx.xxx Standard
このIPアドレスがNAT後の送信元IPとなります。外部サービスへのIPホワイトリスト申請はこのIPを使用します。
3. NAT Gatewayリソースを作成する
次にNAT Gatewayリソース本体を作成し、手順2で作成したパブリックIPを関連付けます。--idle-timeoutは秒ではなく分単位で指定します(ここでは2分)。
# NAT Gatewayの作成(アイドルタイムアウト2分) az network nat gateway create --resource-group rg-demo --name natgw-demo --public-ip-addresses pip-natgw-01 --idle-timeout 2 --location japaneast # 作成確認 az network nat gateway show --resource-group rg-demo --name natgw-demo --query "{Name:name, ProvisionState:provisioningState, IdleTimeout:idleTimeoutInMinutes}" -o table
実行結果の例:
Name ProvisionState IdleTimeout ---------- -------------- ----------- natgw-demo Succeeded 2
ProvisioningStateがSucceededになればNAT Gatewayの作成完了です。
4. NAT GatewayをサブネットにAssociateする
作成したNAT Gatewayを対象のサブネットに関連付けます。この操作でサブネット内のVMのアウトバウンド通信がNAT Gateway経由になります。
# サブネットにNAT Gatewayを関連付け az network vnet subnet update --resource-group rg-demo --vnet-name vnet-demo --name snet-private --nat-gateway natgw-demo # 関連付けの確認 az network vnet subnet show --resource-group rg-demo --vnet-name vnet-demo --name snet-private --query "natGateway.id" -o tsv
実行結果の例(NAT GatewayのリソースIDが返れば成功):
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-demo/providers/Microsoft.Network/natGateways/natgw-demo
リソースIDが返れば関連付け成功です。「None」が返る場合は--nat-gatewayオプションの値(リソース名またはリソースID)を確認してください。
5. Linux VMからアウトバウンドIPを確認する
サブネット内のLinux VMにSSHで接続し、実際の送信元IPを確認します。ifconfig.meは送信元IPをそのまま返すAPIサービスです。
# VM上でアウトバウンドIPを確認 [user@vm-private-01 ~]$ curl -s https://ifconfig.me 20.x.xxx.xxx # 何度実行しても同じIPが返ることを確認 [user@vm-private-01 ~]$ curl -s https://ifconfig.me 20.x.xxx.xxx
手順2で確認したパブリックIPと一致していれば、NAT Gatewayが正しく機能しています。送信元IPが固定されているため、外部サービスのIPフィルタリングに対応できます。
SNATポート枯渇の診断と解消方法
NAT Gatewayを使っていても、SNATポートは有限です。1つのパブリックIPで同時に確保できるSNATポートは最大64,000個です。Webスクレイピングやマイクロサービスが大量の外部接続を同時に張る環境では、このポートが枯渇して接続障害が発生します。
SNATポートが枯渇すると、アプリ側では「Connection timed out」や「No buffer space available」として現れます。Azure MonitorのメトリクスでSNAT使用量を確認しましょう。
1. Azure MonitorでSNAT使用量を確認する
azコマンドでSNATポートの使用状況をリアルタイムに取得できます。
# NAT GatewayのリソースIDを取得 NATGW_ID=$(az network nat gateway show --resource-group rg-demo --name natgw-demo --query id -o tsv) # 過去1時間のUsed SNAT Portsを5分粒度で確認 az monitor metrics list --resource "$NATGW_ID" --metric "UsedSNATPorts" --interval PT5M --aggregation Maximum --start-time "$(date -u -d '1 hour ago' '+%Y-%m-%dT%H:%M:%SZ')" --end-time "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" --query "value[0].timeseries[0].data[-5:].{Time:timeStamp, Used:maximum}" -o table
実行結果の例(1IPあたり64,000ポートが上限):
Time Used ------------------------ -------- 2026-07-26T04:00:00+00:00 1024.0 2026-07-26T04:05:00+00:00 8192.0 2026-07-26T04:10:00+00:00 24576.0 2026-07-26T04:15:00+00:00 51200.0 2026-07-26T04:20:00+00:00 59392.0
この値が60,000(64,000の約93%)を超えてきたら、SNATポート枯渇のリスクがあります。Azureの推奨は使用率75%(48,000ポート)を超えたらパブリックIPを追加することです。
Azure Monitorでアラートを設定してUsed SNAT Portsが50,000を超えたら通知が届くようにしておくと安心です。
2. パブリックIPを追加してSNATポートを増やす
SNATポート枯渇への対処として最もシンプルな方法は、NAT Gatewayに割り当てるパブリックIPを追加することです。IPを1つ追加するたびにSNATポートが64,000個ずつ増加します。この操作はダウンタイムなしで実施できます。
# 2本目のパブリックIPを作成 az network public-ip create --resource-group rg-demo --name pip-natgw-02 --sku Standard --allocation-method Static --location japaneast # NAT Gatewayに2本目のIPを追加 # ※--public-ip-addressesには既存のpip-natgw-01と新規のpip-natgw-02を両方指定する az network nat gateway update --resource-group rg-demo --name natgw-demo --public-ip-addresses pip-natgw-01 pip-natgw-02 # 割り当てIP一覧の確認 az network nat gateway show --resource-group rg-demo --name natgw-demo --query "publicIpAddresses[].id" -o table
実行結果の例(2本のIPが表示されれば合計128,000ポートに増加):
Result ---------------------------------------------------------------------------------------------- /subscriptions/xxxx.../publicIPAddresses/pip-natgw-01 /subscriptions/xxxx.../publicIPAddresses/pip-natgw-02
注意点:--public-ip-addressesオプションは「既存 + 追加したいIP」をすべて指定します。既存のpip-natgw-01を書き忘れると、そのIPがNAT Gatewayから切り離されます。
3. IP追加後の送信元IP確認と外部サービスへの登録
IP追加後は、割り当てた全IPアドレスを確認して外部サービスのIPホワイトリストに追加する必要があります。
# NAT Gatewayに割り当てたすべてのIPアドレスを確認 az network public-ip list --resource-group rg-demo --query "[?starts_with(name,'pip-natgw')].{Name:name, IP:ipAddress}" -o table
実行結果の例:
Name IP ------------- --------------- pip-natgw-01 20.x.xxx.xxx pip-natgw-02 20.y.yyy.yyy
Azure NAT Gatewayは複数IPが割り当てられると、接続先ごとに送信元IPを振り分けます。外部サービスへのIPフィルタリング申請には、このリストにあるすべてのIPアドレスを登録してください。なお、NAT Gatewayには最大16個のパブリックIPを割り当てられるため、1,024,000ポートまでスケールできます。
トラブルシュート|NAT Gatewayが機能しない時の確認ポイント
NAT Gatewayを設定したのにアウトバウンドIPが変わらない、または接続できないという場合、次のポイントを順に確認してください。
【確認1】サブネットへの関連付けを確認する
最も多いのはサブネットへのAssociate忘れです。次のコマンドで確認します。
az network vnet subnet show --resource-group rg-demo --vnet-name vnet-demo --name snet-private --query "natGateway.id" -o tsv
「None」または空行が返る場合は、手順4のサブネット更新コマンドを再実行してください。
【確認2】VMのNICがパブリックIPを直接持っていないか確認する
VMのNICにパブリックIPが直接アタッチされている場合、そのVMはNAT GatewayではなくインスタンスレベルのパブリックIP(ILPIP)経由でアウトバウンドします。ILPIPはNAT Gatewayより優先されるため、NAT Gatewayが適用されません。
# VMのNICを確認してパブリックIPの有無をチェック NIC_ID=$(az vm show --resource-group rg-demo --name vm-private-01 --query "networkProfile.networkInterfaces[0].id" -o tsv) az network nic show --ids "$NIC_ID" --query "ipConfigurations[0].publicIpAddress.id" -o tsv
何も表示されなければNICへのパブリックIPアタッチはなく、NAT Gateway経由でアウトバウンドされます。パブリックIPが表示された場合は、そのIPをNICからデタッチする必要があります。
【確認3】NSGのアウトバウンドルールを確認する
サブネットまたはNICにNSG(ネットワークセキュリティグループ)が設定されていて、アウトバウンドのHTTPS(443)をDENYしている場合は通信が遮断されます。ポート疎通確認の方法は「Linuxのポート確認コマンド」も参考にしてください。
# サブネットに紐づくNSGのアウトバウンドルールを確認 NSG_ID=$(az network vnet subnet show --resource-group rg-demo --vnet-name vnet-demo --name snet-private --query "networkSecurityGroup.id" -o tsv) az network nsg rule list --ids "$NSG_ID" --query "[?direction=='Outbound'].{Name:name, Priority:priority, Access:access, Port:destinationPortRange}" -o table
「Deny」ルールがポート443や80をブロックしている場合は、ルールを修正するか優先度の高い「Allow」ルールを追加してください。
【確認4】Route TableでUDRがアウトバウンドをバイパスしていないか確認する
Route Table(ルートテーブル)に「アウトバウンドをNVAやAzure Firewallへ転送するUDR」が設定されていると、NAT Gatewayではなくそちらへ転送されます。有効ルートで経路を確認します。
# VMのNICに適用されている有効ルートを確認 az network nic show-effective-route-table --resource-group rg-demo --name nic-vm-private-01 --query "value[?addressPrefix=='0.0.0.0/0'].{Prefix:addressPrefix, NextHopType:nextHopType, NextHopIP:nextHopIpAddress}" -o table
「NextHopType」が「Internet」であればNAT Gateway経由の正常フローです。「VirtualAppliance」であればNVAやFirewallへの転送が設定されているため、意図した動作かを確認してください。
本記事のまとめ
Azure NAT GatewayでLinux VMのアウトバウンド通信を制御するポイントをまとめます。
| やりたいこと | コマンド |
|---|---|
| Standard SKUのパブリックIPを作成する | az network public-ip create --sku Standard --allocation-method Static |
| NAT Gatewayを作成する | az network nat gateway create --public-ip-addresses pip名 --idle-timeout 分数 |
| サブネットにNAT Gatewayを関連付ける | az network vnet subnet update --nat-gateway natgw名 |
| VM上でアウトバウンドIPを確認する | curl -s https://ifconfig.me |
| SNATポート使用量を確認する | az monitor metrics list --metric UsedSNATPorts |
| パブリックIPを追加してSNATポートを増やす | az network nat gateway update --public-ip-addresses pip01 pip02 |
| サブネットへのNAT Gateway関連付けを確認する | az network vnet subnet show --query "natGateway.id" |
| VMのNICに有効なルートを確認する | az network nic show-effective-route-table --name NIC名 |
Azure NAT Gatewayはサブネットにアタッチするだけで、仮想マシンのアウトバウンドIPを固定して大量のSNATポートを提供するフルマネージドサービスです。デフォルトアウトバウンドアクセスは廃止される方向にあるため、本番環境ではNAT Gatewayへの移行が推奨されます。
SNATポートが逼迫してきたらaz network nat gateway updateでパブリックIPを追加するだけで、ダウンタイムなしでスケールできます。Azure MonitorのUsed SNAT Portsに閾値アラートを設定しておくことで、問題が顕在化する前に対処できます。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AzureのLinux VMにcloud-initで初期設定を自動化する方法|azコマンドのcustom-dataとYAML設計の実践手順
- この記事の属するカテゴリ:Azureへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます