こうした悩みを解決するのが Azure Bastion です。VMにパブリックIPを割り当てることなく、AzureのバックボーンネットワークからLinux VMへ直接SSH接続できます。踏み台サーバーの維持コストも不要です。
この記事では、Azure Bastionの仕組みから、AzureBastionSubnetの作成・Bastionホストのデプロイ・
az network bastion ssh によるCLI接続まで、実機ログを交えながら解説します。動作確認環境はRHEL 9.4 / Ubuntu 24.04 LTS です。この記事のポイント
・Azure BastionでVMのパブリックIPを0件にしてSSH接続できる
・AzureBastionSubnetは/26以上(64アドレス以上)のCIDRが必須
・az network bastion sshはStandardティア以上で利用可能
・NSGはBastionサブネット向けに443・8080ポートの許可が必要
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Azure BastionとSSH踏み台サーバーの違い
Linux VMへのSSH接続方法は大きく3つあります。・パブリックIP直接接続:VMにパブリックIPを付けて直接SSHする。シンプルだが、IPが公開されるため攻撃にさらされる
・踏み台(ジャンプ)サーバー:パブリックIPを持つ踏み台VMを経由してSSHする。管理対象が増え、踏み台自体のセキュリティ管理が必要
・Azure Bastion:AzureのマネージドサービスがSSHトンネルを提供する。VMにパブリックIPが不要で、管理コストも最小
Azure Bastionの特徴は、SSHトラフィックがインターネットを経由せず、Azureのバックボーンネットワーク内で完結する点です。接続はAzure PortalのブラウザSSHか、Azure CLIの
az network bastion ssh コマンドを使います。| 接続方法 | VMのパブリックIP | 管理コスト | セキュリティ |
|---|---|---|---|
| パブリックIP直接接続 | VM側に必要 | 低 | インターネット公開 |
| 踏み台サーバー経由 | 踏み台VMに必要 | 高(踏み台の管理) | 踏み台自体がリスク |
| Azure Bastion | VMには不要 | 低(マネージド) | バックボーン経由 |
Azure Bastionの構成要素と前提条件
Azure Bastionを使うには、以下の3つが必要です。・AzureBastionSubnet:Bastionホスト専用の固定名サブネット。/26以上(64アドレス以上)のCIDRが必須
・パブリックIP(Standard SKU):BastionホストがAzure外と通信するためのIP。接続先VMには付けない
・Bastionホスト:マネージドサービス本体。デプロイに5~10分かかる
ティアはBasicとStandardの2種類があります。
・Basicティア:PortalのBrowser SSH/RDPが使える。CLIからの
az network bastion ssh は利用不可・Standardティア:Browser SSH/RDPに加え、
az network bastion ssh や az network bastion tunnel が使える注意:BasicティアではAzure CLIからの
az network bastion ssh は利用できません。スクリプトや自動化での接続が必要な場合はStandardティアを選んでください。コストを抑えたい場合はBasicで始め、CLI接続が必要になったらStandardへ切り替えるのが現実的です。
Azure CLIでBastionを構築する手順
ここでは、新規VNetにAzure Bastionを構築する手順を解説します。1. リソースグループとVNetの作成
まずリソースグループとVNetを作成します。# リソースグループを作成 az group create \ --name rg-bastion-demo \ --location japaneast # VNetとデフォルトサブネットを作成 az network vnet create \ --resource-group rg-bastion-demo \ --name myVNet \ --address-prefix 10.0.0.0/16 \ --subnet-name default \ --subnet-prefix 10.0.0.0/24
2. AzureBastionSubnetの作成
サブネット名はAzureBastionSubnet と完全一致している必要があります。大文字・小文字を含めて変更不可です。CIDRは /26(64アドレス)以上を指定してください。az network vnet subnet create \ --resource-group rg-bastion-demo \ --vnet-name myVNet \ --name AzureBastionSubnet \ --address-prefix 10.0.1.0/26
{ "addressPrefix": "10.0.1.0/26", "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-bastion-demo/providers/Microsoft.Network/virtualNetworks/myVNet/subnets/AzureBastionSubnet", "name": "AzureBastionSubnet", "provisioningState": "Succeeded" }
3. Bastionホスト用パブリックIPの作成
BastionホストにはStandard SKUの静的パブリックIPが必要です。az network public-ip create \ --resource-group rg-bastion-demo \ --name myBastionPublicIP \ --sku Standard \ --allocation-method Static \ --location japaneast
4. Bastionホストのデプロイ
az network bastion create コマンドでBastionホストを作成します。デプロイには5~10分かかります。az network bastion create \ --resource-group rg-bastion-demo \ --name myBastion \ --vnet-name myVNet \ --public-ip-address myBastionPublicIP \ --sku Standard \ --location japaneast
{ "dnsName": "bst-xxxxxxxx-xxxx.japaneast.bastion.azure.com", "name": "myBastion", "provisioningState": "Succeeded", "sku": { "name": "Standard" } }
5. パブリックIPなしのLinux VMを作成する
--public-ip-address "" を指定することで、パブリックIPなしのVMを作成できます。az vm create \ --resource-group rg-bastion-demo \ --name myLinuxVM \ --image RedHat:RHEL:9-lvm-gen2:latest \ --size Standard_B2s \ --vnet-name myVNet \ --subnet default \ --public-ip-address "" \ --admin-username azureuser \ --generate-ssh-keys # az vm show --resource-group rg-bastion-demo --name myLinuxVM --show-details
az vm show \ --resource-group rg-bastion-demo \ --name myLinuxVM \ --show-details \ --query "{privateIP:privateIps,publicIP:publicIps}" \ -o table PrivateIP PublicIP ----------- ---------- 10.0.0.4 None
PublicIP が None になっていることを確認してください。インターネットからは直接到達できないVMが完成しました。VNet内のプライベートな名前解決については、Linux DNS 設定の基本も参考にしてください。az network bastion sshでLinux VMへ接続する(Standardティア)
Standardティアでは、Azure CLIのaz network bastion ssh コマンドを使って自分のPCから直接SSH接続できます。1. VMのリソースIDを取得する
VM_ID=$(az vm show \ --resource-group rg-bastion-demo \ --name myLinuxVM \ --query id \ -o tsv) echo $VM_ID # /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-bastion-demo/providers/Microsoft.Compute/virtualMachines/myLinuxVM
2. Bastionを経由してSSH接続する
az network bastion ssh \ --resource-group rg-bastion-demo \ --name myBastion \ --target-resource-id $VM_ID \ --auth-type ssh-key \ --username azureuser \ --ssh-key ~/.ssh/id_rsa
Authenticated to myLinuxVM via Bastion. [azureuser@myLinuxVM ~]$ hostname myLinuxVM [azureuser@myLinuxVM ~]$ ip addr show eth0 | grep "inet " inet 10.0.0.4/24 brd 10.0.0.255 scope global eth0 [azureuser@myLinuxVM ~]$
パスワード認証を使う場合は
--auth-type password に変更し、接続後にパスワードを入力します。ただし鍵認証の方がセキュリティ上推奨です。3. azure-bastion拡張機能が入っていない場合
初回実行時に拡張機能のインストールを求めるメッセージが表示されることがあります。The command requires the extension azure-bastion. Do you want to install it now? (Y/n):
Y を入力して自動インストールしてください。または事前に以下で手動インストールできます。az extension add --name bastion
Azure PortalからのBrowser SSH接続(Basic・Standard両ティア対応)
Azure PortalのBrowser SSHはBasicとStandard両方のティアで使えます。自分のPCにAzure CLIが入っていない環境でも接続できる点が利点です。接続手順:
・Azure Portalで対象のLinux VMのリソースページを開く
・左メニューの「接続」>「Bastionを介して接続」を選択
・ユーザー名と認証方法(SSH秘密鍵またはパスワード)を入力する
・「接続」ボタンをクリックすると、ブラウザ内でSSHターミナルが開く
ブラウザのみで接続が完結するため、Windows環境でも追加ソフトのインストールなしでSSHできます。
接続できない時のトラブルシュート
1. 「BastionSubnetNotFound」エラーが出る場合
AzureBastionSubnetの名前が間違っている場合に発生します。サブネット名は大文字・小文字を含めて完全一致が必要です。# サブネット名を確認する az network vnet subnet list \ --resource-group rg-bastion-demo \ --vnet-name myVNet \ --query "[].name" \ -o table Result --------------------- AzureBastionSubnet default
AzureBastionSubnet という名前が正確に存在することを確認してください。2. NSGがBastionサブネットをブロックしている場合
AzureBastionSubnetにNSGを付けている場合、以下のルールが必要です。・インバウンド(受信):ソース GatewayManager(サービスタグ)・ポート443 を許可
・インバウンド(受信):ソース AzureLoadBalancer(サービスタグ)・ポート443 を許可
・アウトバウンド(送信):宛先 VirtualNetwork(サービスタグ)・ポート22 を許可
・アウトバウンド(送信):宛先 AzureCloud(サービスタグ)・ポート443 を許可
3. VMのNSGがポート22を拒否している場合
VM側のNSGで22番ポートへの受信が許可されていないと、Bastionからの接続も拒否されます。VMのNSGインバウンドルールで、ソースをVirtualNetworkに絞ってポート22を許可することで、インターネット公開せずに接続できます。ポート22の状態確認については、Linux ポート確認の全コマンドも参考にしてください。
4. az network bastion sshが「not available」となる場合
Basicティアでaz network bastion ssh を実行するとエラーになります。(BastionOperationNotSupported) Bastion host 'myBastion' doesn't support native client.
本記事のまとめ
| やりたいこと | コマンド・手順 |
|---|---|
| AzureBastionSubnetを作成する | az network vnet subnet create --name AzureBastionSubnet --address-prefix 10.0.1.0/26 |
| Bastionホストを作成する | az network bastion create --name <名前> --vnet-name <VNet名> --public-ip-address <IP名> |
| BastionでSSH接続する(CLI) | az network bastion ssh --name <Bastion名> --target-resource-id <VM_ID> |
| BastionでSSH接続する(Portal) | VM「接続」>「Bastionを介して接続」から実行 |
| Bastionの状態を確認する | az network bastion show --resource-group <RG> --name <Bastion名> --query provisioningState |
az network bastion ssh はスクリプトへの組み込みもしやすく、運用自動化との親和性も高いです。Azure上でLinuxサーバーを構築・運用するための体系的なスキルを習得したい方は、下記のセミナーも参考にしてください。
Azure対応セミナーの詳細を見る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:AzureとAWS VPCのネットワーク設計を比較する|VNet・NAT・NSGとVPC・SG・IGWの対応関係をazコマンドで実践
- 前のページへ:AzureのVNetピアリングを設定する方法|ハブアンドスポーク構成とazコマンドによる実践手順
- この記事の属するカテゴリ:Azureへ戻る

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