そんな時に使えるのが、AzureのStandard Load BalancerにあるInbound NAT Rulesだ。1つのパブリックIPアドレスの異なるポート番号を各VMのSSHポート(22番)にマッピングすることで、IPアドレスを増やさずに複数VMへのSSHアクセスを実現できる。
この記事では、azコマンドを使ってLoad Balancer Inbound NAT Rulesを設定し、複数のLinux VMへSSHポートを割り当てる手順を解説する。Standard Load Balancerの制約事項と、AWSで同様の構成を実現する際との設計上の違いも整理した。動作確認環境はRHEL 9.4とUbuntu 24.04 LTSだ。
この記事のポイント
・az network lb inbound-nat-rule createで1パブリックIPから複数VMへSSH転送できる
・Inbound NAT Rulesを使うにはStandard SKUのLoad Balancerが必須
・NATルール作成後にaz network nic ip-config inbound-nat-rule addでVMと紐付ける
・AWSにはLBレベルのSSH NAT機能がなくBastionやSSM Session Managerで代替する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Inbound NAT Rulesとは何か
AzureのLoad Balancer(LB)にはInbound NAT Rulesという機能がある。LBのパブリックIPアドレスの特定ポートへの通信を、バックエンドの特定VM・特定ポートへ直接転送する仕組みだ。「ポートフォワーディング」と同等の機能をLBレベルで実装できる。例えば次のような構成を組める:
・パブリックIPアドレス
20.xxx.xxx.xxx:50001 → VM1の 10.0.1.10:22(SSH)・パブリックIPアドレス
20.xxx.xxx.xxx:50002 → VM2の 10.0.1.11:22(SSH)・パブリックIPアドレス
20.xxx.xxx.xxx:50003 → VM3の 10.0.1.12:22(SSH)各VMにパブリックIPを付与せずに済むため、IPアドレスのコスト削減と管理の一元化ができる。
Inbound NAT Rulesの利用条件:
・Load BalancerのSKUは Standard SKU が必須(Basic SKUは対象外)
・パブリックIPアドレスもStandard SKUで合わせる
・1つのNICに関連付けられるInbound NAT Rulesは原則1ルールのみ
・転送ポートは1から65534の範囲内で任意に設定できる
構成の全体設計
この記事では次の構成を構築する:・リソースグループ:
rg-nat-demo(japaneastリージョン)・VNet:
vnet-demo(アドレス空間: 10.0.0.0/16)・サブネット:
subnet-vms(10.0.1.0/24)・Standard Load Balancer:
lb-ssh・パブリックIPアドレス(Standard、静的割り当て):
pip-lb-ssh・Linux VM × 2台(プライベートIPのみ、パブリックIPなし)
・Inbound NAT Rule 1:フロントエンドポート50001 → VM1の22番ポート
・Inbound NAT Rule 2:フロントエンドポート50002 → VM2の22番ポート
パブリックIPを各VMに付けないため、このLBのパブリックIP(
pip-lb-ssh)がVMへのSSHの唯一の入口になる。NSGはサブネット側で設定し、ポート50001・50002のインバウンドを許可する。事前準備:VNetとLinux VMを作成する
1. リソースグループとVNetを作成する
# リソースグループを作成 az group create \ --name rg-nat-demo \ --location japaneast # VNetを作成 az network vnet create \ --resource-group rg-nat-demo \ --name vnet-demo \ --address-prefixes 10.0.0.0/16 # サブネットを追加 az network vnet subnet create \ --resource-group rg-nat-demo \ --vnet-name vnet-demo \ --name subnet-vms \ --address-prefixes 10.0.1.0/24
2. NSGを作成してサブネットに適用する
NATルールで使用するポート(50001・50002)をNSGで明示的に許可しておく。LBを経由してVMに到達するトラフィックでも、サブネットに適用されたNSGのインバウンドルールで評価が行われるため、ポートを許可しておかないとSSH接続がタイムアウトする。# NSGを作成 az network nsg create \ --resource-group rg-nat-demo \ --name nsg-vms # ポート50001(VM1向けSSH)を許可 az network nsg rule create \ --resource-group rg-nat-demo \ --nsg-name nsg-vms \ --name Allow-SSH-50001 \ --priority 100 \ --protocol Tcp \ --destination-port-ranges 50001 \ --access Allow \ --direction Inbound # ポート50002(VM2向けSSH)を許可 az network nsg rule create \ --resource-group rg-nat-demo \ --nsg-name nsg-vms \ --name Allow-SSH-50002 \ --priority 110 \ --protocol Tcp \ --destination-port-ranges 50002 \ --access Allow \ --direction Inbound # NSGをサブネットに適用 az network vnet subnet update \ --resource-group rg-nat-demo \ --vnet-name vnet-demo \ --name subnet-vms \ --network-security-group nsg-vms
3. プライベートIPのみのLinux VMを2台作成する
# VM1を作成(パブリックIPなし、プライベートIP固定) az vm create \ --resource-group rg-nat-demo \ --name vm1 \ --image Ubuntu2404 \ --admin-username azureuser \ --generate-ssh-keys \ --vnet-name vnet-demo \ --subnet subnet-vms \ --private-ip-address 10.0.1.10 \ --public-ip-address "" \ --nsg "" \ --size Standard_B1s # VM2を作成(パブリックIPなし、プライベートIP固定) az vm create \ --resource-group rg-nat-demo \ --name vm2 \ --image Ubuntu2404 \ --admin-username azureuser \ --generate-ssh-keys \ --vnet-name vnet-demo \ --subnet subnet-vms \ --private-ip-address 10.0.1.11 \ --public-ip-address "" \ --nsg "" \ --size Standard_B1s
--public-ip-address "" と --nsg "" を指定することで、az vm createが自動生成するパブリックIPとNSGの両方を作成しないようにしている。NSGはサブネット側(nsg-vms)でまとめて管理する設計だ。Load Balancerを作成してInbound NAT Rulesを設定する
1. Standard SKUのLoad Balancerを作成する
# Standard SKUのパブリックIPを作成(静的割り当て必須) az network public-ip create \ --resource-group rg-nat-demo \ --name pip-lb-ssh \ --sku Standard \ --allocation-method Static # Standard SKUのLoad Balancerを作成 az network lb create \ --resource-group rg-nat-demo \ --name lb-ssh \ --sku Standard \ --frontend-ip-name frontend-ip \ --public-ip-address pip-lb-ssh # バックエンドプールを作成 az network lb address-pool create \ --resource-group rg-nat-demo \ --lb-name lb-ssh \ --name backendpool-vms
2. Inbound NAT Rulesを作成する
# VM1用NATルール(フロントエンド50001 → バックエンド22番) az network lb inbound-nat-rule create \ --resource-group rg-nat-demo \ --lb-name lb-ssh \ --name nat-rule-vm1 \ --frontend-ip-name frontend-ip \ --protocol Tcp \ --frontend-port 50001 \ --backend-port 22 # VM2用NATルール(フロントエンド50002 → バックエンド22番) az network lb inbound-nat-rule create \ --resource-group rg-nat-demo \ --lb-name lb-ssh \ --name nat-rule-vm2 \ --frontend-ip-name frontend-ip \ --protocol Tcp \ --frontend-port 50002 \ --backend-port 22
az network lb inbound-nat-rule list で行える:az network lb inbound-nat-rule list \ --resource-group rg-nat-demo \ --lb-name lb-ssh \ --output table
Name Protocol FrontendPort BackendPort ProvisioningState ------------ ---------- -------------- ------------- ------------------ nat-rule-vm1 Tcp 50001 22 Succeeded nat-rule-vm2 Tcp 50002 22 Succeeded
3. VMのNICをNATルールに関連付ける
NATルールを作成しただけでは、どのVMのSSHへ転送するかが決まっていない。VMのNIC(ネットワークインターフェース)とNATルールを紐付ける作業が別途必要だ。# VM1のNIC名を確認 az vm show \ --resource-group rg-nat-demo \ --name vm1 \ --query "networkProfile.networkInterfaces[0].id" \ --output tsv | xargs basename # 出力例: vm1VMNic # VM1のNICにnat-rule-vm1を関連付ける az network nic ip-config inbound-nat-rule add \ --resource-group rg-nat-demo \ --nic-name vm1VMNic \ --ip-config-name ipconfig1 \ --lb-name lb-ssh \ --inbound-nat-rule nat-rule-vm1 # VM2のNICにnat-rule-vm2を関連付ける az network nic ip-config inbound-nat-rule add \ --resource-group rg-nat-demo \ --nic-name vm2VMNic \ --ip-config-name ipconfig1 \ --lb-name lb-ssh \ --inbound-nat-rule nat-rule-vm2
SSH接続の動作確認
パブリックIPを確認してからSSH接続テストを行う。# LBのパブリックIPアドレスを確認 az network public-ip show \ --resource-group rg-nat-demo \ --name pip-lb-ssh \ --query "ipAddress" \ --output tsv # 出力例: 20.78.xxx.xxx
# VM1へポート50001経由でSSH接続 ssh -p 50001 azureuser@20.78.xxx.xxx # VM2へポート50002経由でSSH接続 ssh -p 50002 azureuser@20.78.xxx.xxx
azureuser@vm1:~$ hostname vm1 azureuser@vm1:~$ ip addr show eth0 | grep "inet " inet 10.0.1.10/24 brd 10.0.1.255 scope global eth0
ss -tnlp | grep :22 を実行するとSSHデーモンが22番ポートで待ち受けているのが見えるはずだ。azureuser@vm1:~$ ss -tnlp | grep :22 LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=627,fd=3)) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=627,fd=4))
AWSとの設計比較
AWSで同様の「1つのパブリックIPから複数EC2へSSHを振り分ける」構成を実現する場合、AzureのようなLBレベルのNAT機能が直接存在しないため、代替手段を取ることになる。| 項目 | Azure(Inbound NAT Rules) | AWS(代替手段) |
|---|---|---|
| SSH振り分けの仕組み | Standard LBのInbound NAT Rulesでポートマッピング | NLBでは同等機能なし。EC2 Instance ConnectまたはSSM Session Managerを使用 |
| パブリックIP数 | 1つのIPで複数VMへSSH振り分け | SSM利用時はパブリックIP不要(VPCエンドポイント経由) |
| 認証方式 | SSHキーペア認証をそのまま使用 | SSM: IAMロール認証 / Instance Connect: IAMベース一時キー |
| 設定の複雑さ | LB作成→NATルール→NIC関連付けの3ステップ | SSMはSSMエージェント常駐とIAMロール設定が必要 |
| 追加コスト | Standard LB(約0.025USD/時間)+フロントエンドIP | SSMはほぼ無料(VPCエンドポイント使用時は0.01USD/時間追加) |
| 監査・ログ | NSGフローログ・Azure Monitor | SSMセッションログをS3/CloudWatch Logsへ記録可能 |
AzureのInbound NAT Rulesは「SSHのポート番号を変えるだけ」という直感的な設計だ。既存のSSHクライアントや運用ツールをそのまま使えるのが利点だが、ポート番号の管理台帳を自分で維持する必要がある。一方AWSのSSMは認証をIAMに一元化できるため、大規模環境や厳格な監査が求められる場合に優位性がある。用途と規模に合わせて選ぶとよい。
よくあるエラーと対処法
「The SKU of the load balancer must be Standard」エラー
Basic SKUのLBにInbound NAT Rulesを作成しようとすると発生する。Basic LBをStandardへアップグレードするコマンドは存在せず、LBを作り直す必要がある。既存のBasic LBがある場合は一度削除してからStandard SKUで再作成する。「The IpConfiguration is already associated with an inbound nat rule」エラー
1つのNIC IPコンフィグに複数のInbound NAT Rulesを関連付けようとすると発生する。既存の関連付けを先に解除してから再設定する。# 既存のNATルール関連付けを確認 az network nic show \ --resource-group rg-nat-demo \ --name vm1VMNic \ --query "ipConfigurations[0].loadBalancerInboundNatRules" \ --output table # 既存の関連付けを解除 az network nic ip-config inbound-nat-rule remove \ --resource-group rg-nat-demo \ --nic-name vm1VMNic \ --ip-config-name ipconfig1 \ --lb-name lb-ssh \ --inbound-nat-rule nat-rule-vm1
SSH接続がタイムアウトする
NSGのインバウンドルールでポート番号が正しく許可されているか確認する。ポイントはバックエンドポート(22番)ではなくフロントエンドポート(50001など)を許可することだ。# NSGのルール一覧を確認 az network nsg rule list \ --resource-group rg-nat-demo \ --nsg-name nsg-vms \ --output table
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| NATルールを作成する | az network lb inbound-nat-rule create --frontend-port 50001 --backend-port 22 |
| NICとNATルールを関連付ける | az network nic ip-config inbound-nat-rule add --inbound-nat-rule nat-rule-vm1 |
| NATルール一覧を確認する | az network lb inbound-nat-rule list --lb-name lb-ssh --output table |
| NICとNATルールの紐付けを解除する | az network nic ip-config inbound-nat-rule remove --inbound-nat-rule nat-rule-vm1 |
| フロントエンドポートを変更する | az network lb inbound-nat-rule update --frontend-port 50010 |
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、AzureのLinux実践講座ではVNet設計・Inbound NAT・セキュリティ設定まで実機ハンズオンで習得できます。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AzureのLinux VMにEntra ID認証でSSHログインする方法|az sshコマンドによるパスワードレス接続とAWS SSMとの比較
- この記事の属するカテゴリ:Azureへ戻る

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