AzureのLoad Balancer Inbound NAT Rulesで複数Linux VMへSSHポートを割り当てる方法|az network lb inbound-nat-ruleによる実践

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Azure > AzureのLoad Balancer Inbound NAT Rulesで複数Linux VMへSSHポートを割り当てる方法|az network lb inbound-nat-ruleによる実践
「1つのパブリックIPで、管理しているLinux VMを全部SSHで区別してアクセスしたい。でも、VMごとにパブリックIPを払い出すのはコストがかかる」
そんな時に使えるのが、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で代替する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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

NSGルールの宛先ポートに「50001」を指定しているのは、LBのInbound NAT Rulesがフロントエンドポートを変換してバックエンドへ転送する際、NSGはLBが受け取った段階のポート(フロントエンドポート)で評価されるためだ。「22番を許可すればよい」と思って設定するとSSH接続に失敗する、よくあるはまりポイントの一つだ。

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

作成したNATルールの確認は 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

Azureでは複数のLinux VMを1つのIPアドレスで管理するアーキテクチャが増えており、VNet設計から運用までを体系的に習得したい場合はAzureのLinux実践講座も参考にしてほしい。

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

確認したIPアドレスを使ってSSH接続する:

# VM1へポート50001経由でSSH接続 ssh -p 50001 azureuser@20.78.xxx.xxx # VM2へポート50002経由でSSH接続 ssh -p 50002 azureuser@20.78.xxx.xxx

VM1に接続後、ホスト名とIPアドレスを確認すると正しく振り分けられていることがわかる:

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

ポート転送が正しく機能しているかは、VM内で ssコマンドを使ったポート確認 でも確認できる。VM1内で 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
AzureのInbound NAT Rulesは、VMの台数が増えてもポート番号を50001・50002・50003…と増やしていくだけでスケールできる。Standard Load Balancerのコストは比較的安価なため、開発・ステージング環境の管理コンソール代わりにも活用しやすい構成だ。一方で本番環境ではBastionやSSMを組み合わせたゼロトラスト設計も検討してほしい。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、AzureのLinux実践講座ではVNet設計・Inbound NAT・セキュリティ設定まで実機ハンズオンで習得できます。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。