こうした悩みを解決するのが Azure Bastion です。VMにパブリックIPを割り当てることなく、AzureのバックボーンネットワークからLinux VMへ直接SSH接続できます。踏み台サーバーの維持コストも不要です。
この記事では、Azure Bastionの仕組みから、AzureBastionSubnetの作成・Bastionホストのデプロイ・
az network bastion ssh によるCLI接続まで、実機ログを交えながら解説します。動作確認環境はAzure CLI 2.61 / RHEL 9.4 / Ubuntu 24.04 LTS です。AWS Systems Manager Session Manager(SSM)との比較も添えるので、クラウド環境の選定判断にも活用してください。この記事のポイント
・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はMicrosoftが運用・パッチ管理を担うマネージドサービスです。踏み台サーバーとの最大の違いは、Bastion自体のOSメンテナンスが不要な点にあります。SSHトラフィックはインターネットを経由せず、Azureのバックボーンネットワーク内で完結するため、VM側に22番ポートをインターネットに公開する必要もありません。接続は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分かかる
ティアはDeveloper・Basic・Standardの3種類があります(2026年時点)。
・Developerティア(無料):1 VNetに1個まで利用可能。PortalのBrowser SSH/RDPが使える。
az network bastion ssh やポートフォワードは利用不可・Basicティア:PortalのBrowser SSH/RDPが使える。CLIからの
az network bastion ssh は利用不可・Standardティア:Browser SSH/RDPに加え、
az network bastion ssh や az network bastion tunnel が使える。スケールアウトも可能(/24を推奨)注意:DeveloperティアおよびBasicティアではAzure CLIからの
az network bastion ssh は利用できません。スクリプトや自動化での接続が必要な場合はStandardティアを選んでください。コストを抑えたい検証環境ではDeveloperティア(無料)から始め、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アドレス)以上を指定してください。Standardティアでスケールアウトする環境では /24 にしておくと余裕が生まれます。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" }
az network vnet subnet show --resource-group rg-bastion-demo --vnet-name myVNet --name AzureBastionSubnet --query "{name:name,prefix:addressPrefix}" --output table Name Prefix ------------------- --------------- AzureBastionSubnet 10.0.1.0/26
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" } }
az network bastion show --resource-group rg-bastion-demo --name myBastion --query "provisioningState" --output tsv Succeeded
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 --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= echo # /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 --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 に変更し、接続後にパスワードを入力します。ただし鍵認証の方がセキュリティ上推奨です。VM自体にパブリックIPがないことをさらに確認したい場合は、VM内から外部向け通信経路を確認します。
# VM内からNICのIPアドレスを確認する(プライベートIPのみ) [azureuser@myLinuxVM ~]$ ip addr show eth0 2: eth0:
mtu 1500 inet 10.0.0.4/24 brd 10.0.0.255 scope global eth0 valid_lft forever preferred_lft forever # 外部への通信がBastion経由になっていることを確認する [azureuser@myLinuxVM ~]$ curl -s ifconfig.me 20.xx.xxx.xxx # BastionのパブリックIPが出ていれば正常
curl ifconfig.me の結果がBastionのパブリックIPと一致していれば、VM自体はパブリックIPを持たずBastion経由でインターネットに通信できている証拠です。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できます。
AWS Systems Manager Session Managerとの比較
AWSには Azure Bastion と同様のユースケースに対応する「AWS Systems Manager Session Manager(SSM)」があります。VPC内のEC2インスタンスにパブリックIPなしでSSH的な接続ができるサービスです。両者の主な違いを整理します。| 比較項目 | Azure Bastion(Standard) | AWS SSM Session Manager |
|---|---|---|
| エージェント | VM側に不要 | SSM Agent必須(Amazon Linux/Ubuntu 22.04以降はプリインストール済み) |
| 接続方法 | azコマンド・Azureポータル | awsコマンド・AWSマネジメントコンソール |
| コスト | Bastionリソース料金(約0.19USD/時間~)+データ転送料 | Session Manager自体は無料(EC2・VPCエンドポイント料が別途) |
| IAM・RBAC連携 | Azure RBACの「Bastion Reader」ロールで制御 | IAMポリシーでセッション開始を制御 |
| セッションログ | Azure Monitor Diagnostic Settings経由 | CloudWatch Logs・S3への自動保存が容易 |
| ポートフォワード | Standard SKUで対応 | 対応(ポートフォワードセッションタイプ) |
最大の違いは「エージェントが必要かどうか」です。Azure BastionはVM側のOSに何もインストールせずにVNetのサブネット構成だけで動きます。AWS SSMはエージェントが必要ですが、Amazon LinuxやUbuntu 22.04以降のAMIにはSSM Agentがプリインストールされているため、新規構築では追加手順はほぼ不要です。
コスト面ではAWS SSMが有利です。Session Manager自体の利用料は無料で、VPCエンドポイント(PrivateLink)を使わない場合はインターネット経由で追加費用なく利用できます。Azure Bastionは時間単位の課金が発生するため、使用頻度の低い環境ではDeveloperティア(無料)を活用するか、使わない時間帯に
az network bastion delete で削除することでコストを抑えられます。VNet内でLinux VMのプライベートIPからFQDNで名前解決する設計を組み合わせると、Bastion経由の接続でもホスト名でVMを指定できます。LinuxのDNS設定(resolv.conf・nmcli)と合わせてAzure Private DNSを設計すると、管理が楽になります。
接続できない時のトラブルシュート
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・ポート5701・8080 を許可(Standardティアのインスタンス間通信)
・アウトバウンド(送信):宛先 VirtualNetwork(サービスタグ)・ポート22 を許可
・アウトバウンド(送信):宛先 AzureCloud(サービスタグ)・ポート443 を許可
3. VMのNSGがポート22を拒否している場合
VM側のNSGで22番ポートへの受信が許可されていないと、Bastionからの接続も拒否されます。VMのNSGインバウンドルールで、ソースをAzureBastionSubnetのCIDR(例:10.0.1.0/26)に絞ってポート22を許可することで、インターネット公開せずに接続できます。この方法であればBastionサブネット以外からのSSHを完全に遮断できます。ポート22の状態確認については、Linux ポート確認の全コマンドも参考にしてください。
4. az network bastion sshが「not available」となる場合
BasicティアまたはDeveloperティアで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名> --sku Standard |
| BastionでSSH接続する(CLI) | az network bastion ssh --name <Bastion名> --target-resource-id --auth-type ssh-key |
| BastionでSSH接続する(Portal) | VM「接続」>「Bastionを介して接続」から実行 |
| Bastionの状態を確認する | az network bastion show --resource-group <RG> --name <Bastion名> --query provisioningState |
| VMにパブリックIPがないことを確認する | az vm show --resource-group <RG> --name <VM名> --show-details --query "{privateIP:privateIps,publicIP:publicIps}" -o table |
az network bastion ssh はスクリプトへの組み込みもしやすく、運用自動化との親和性も高いです。Azure上でLinuxサーバーを構築・運用するための体系的なスキルを習得したい方は、下記のセミナーも参考にしてください。
Azure対応セミナーの詳細を見る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 次のページへ:AzureとAWS VPCのネットワーク設計を比較する|VNet・NAT・NSGとVPC・SG・IGWの対応関係をazコマンドで実践
- 前のページへ:AzureのVNetピアリングを設定する方法|ハブアンドスポーク構成とazコマンドによる実践手順
- この記事の属するカテゴリ:Azureへ戻る

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