AzureのBastionでパブリックIPなしにLinux VMへSSH接続する方法|踏み台サーバー不要のセキュア接続手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのBastionでパブリックIPなしにLinux VMへSSH接続する方法|踏み台サーバー不要のセキュア接続手順
「本番のLinux VMにSSH接続したいけど、パブリックIPを付けたくない。でも踏み台サーバーを別途立てると管理が増えるし、踏み台自体がセキュリティリスクになる…」

こうした悩みを解決するのが 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ポートの許可が必要


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

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 sshaz 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

作成後のVMにはプライベートIPのみ付与されていることを確認します。

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

PublicIPNone になっていることを確認してください。インターネットからは直接到達できない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

接続に成功すると、通常のSSHセッションと同じようにLinuxシェルが開きます。

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 ~]$

VMのIPアドレスがプライベートIP(10.0.0.4)のみであることを確認できます。

パスワード認証を使う場合は --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.

Standardティアへのアップグレードか、PortalのBrowser SSHを使用してください。

本記事のまとめ

やりたいこと コマンド・手順
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
Azure Bastionを使えば、パブリックIPをVMに付けることなくSSH接続が実現し、攻撃面を最小化できます。特にStandardティアの az network bastion ssh はスクリプトへの組み込みもしやすく、運用自動化との親和性も高いです。Azure上でLinuxサーバーを構築・運用するための体系的なスキルを習得したい方は、下記のセミナーも参考にしてください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

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

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

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

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

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

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

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

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

この記事を書いた人

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

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

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