Azureのネットワークの基本概念である「仮想ネットワーク」と「サブネット」の考え方についてまとめます。Azureでは「仮想ネットワーク」の中に複数の「サブネット」を設ける事ができます。同一の「仮想ネットワーク」に属する「サブネット」同士は互いにルーティングできる状態になっています。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
事前設定
以下、リソースグループを作成します。
az group create --name MyResourceGroup --location japaneast
仮想ネットワークとサブネットを作成します。
az network vnet create \ --resource-group MyResourceGroup \ --name Vnet01 \ --address-prefix 172.16.0.0/16 az network vnet subnet create \ --resource-group MyResourceGroup \ --name Subnet01 \ --vnet-name Vnet01 \ --address-prefixes 172.16.1.0/24
構成図
+---------------------------------------------+ | | | +-----------------+ +--------------------+ | | | Subnet01 | | AzureBastionSubnet | | | | 172.16.1.0/24 | | 172.16.254.0/26 | | | +-----------------+ +--------------------+ | | | | Vnet01 | | 172.16.0.0/16 | +---------------------------------------------+
Azure Bastion サービス
Azure Bastion サービスの作成
「Azure Bastion サービス」が使用するサブネットを定義します。サブネット名は「AzureBastionSubnet」以外は認められません。サブネット長は26以下という制約条件もあります。
az network vnet subnet create \ --resource-group MyResourceGroup \ --name AzureBastionSubnet \ --vnet-name Vnet01 \ --address-prefixes 172.16.254.0/26
「Azure Bastion サービス」が使用するパブリックIPアドレスを作成します。パブリックIPアドレスが変動するのは不都合ですので、skuはBasicではなくStandardを指定するのが無難でしょう。
az network public-ip create \ --resource-group MyResourceGroup \ --name MyBastionIp \ --sku Standard
以下のようなコマンドで「Azure Bastion サービス」を作成します。
az network bastion create \ --resource-group MyResourceGroup \ --name MyBastion \ --vnet-name Vnet01 \ --public-ip-address MyBastionIp
疎通確認
仮想マシン Linuxの場合
動作確認用の仮想マシンを作成します。Bastion サービスを定義する場合は、仮想マシンにパブリックIPアドレスを付与する必要はありませんので、public-ip-addressは「””」を指定します。
az vm create \ --resource-group MyResourceGroup \ --name ubuntu010 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --public-ip-address ""
仮想マシンの「接続」画面を開きます。「Bastion」「Bastionを使用する」の順に押下します。
ユーザ名と認証情報を入力し、「接続」を押下します。
Linuxのコンソールへ接続できた事を確認します。
仮想マシン Windowsの場合
az vm create \ --resource-group MyResourceGroup \ --name windows020 \ --image MicrosoftWindowsDesktop:Windows-10:win10-21h2-pro-g2:latest \ --size Standard_B2s \ --admin-username azureuser \ --admin-password P@ssw0rd1234 \ --public-ip-address ""
仮想マシンの「接続」画面を開きます。「Bastion」「Bastionを使用する」の順に押下します。
ユーザ名と認証情報を入力し、「接続」を押下します。
Windowsのコンソールへ接続できた事を確認します。
仮想マシンスケールセット Linuxの場合
動作確認用の仮想マシンスケールセットを作成します。
デフォルト設定ではインターネットから仮想マシンへのssh接続が設定されています。Bastionサービスを使用する場合はssh接続を削除すべきですが、削除方法の説明が長くなるため、本ページではssh接続の削除方法の説明は省略します。
az vmss create \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --image UbuntuLTS \ --vm-sku Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys
仮想マシンスケールセットの「インスタンス」画面を開きます。「インスタンス名(MyScaleSet01_1)」を押下します。
ユーザ名と認証情報を入力し、「接続」を押下します。
Windowsのコンソールへ接続できた事を確認します。
仮想マシンスケールセット Windowsの場合
動作確認用の仮想マシンスケールセットを作成します。
デフォルト設定ではインターネットから仮想マシンへのrdp接続が設定されています。Bastionサービスを使用する場合はrdp接続を削除すべきですが、削除方法の説明が長くなるため、本ページではrdp接続の削除方法の説明は省略します。
az vmss create \ --resource-group MyResourceGroup \ --name MyScaleSet02 \ --image MicrosoftWindowsDesktop:Windows-10:win10-21h2-pro-g2:latest \ --vm-sku Standard_B2s \ --admin-username azureuser \ --admin-password P@ssw0rd1234
仮想マシンスケールセットの「インスタンス」画面を開きます。「インスタンス名(MyScaleSet02_2)」を押下します。
ユーザ名と認証情報を入力し、「接続」を押下します。
Windowsのコンソールへ接続できた事を確認します。
Azure Bastion サービスのチューニング
「すべてのサービス」から、「ネットワーキング」「Bastion」「Bastion名(MyBastion)」の順に画面遷移するとBastionの設定画面が現れます。ここで「構成」を押下すると、以下チューニング可能なパラメタが現れます。
設定 | 意味 |
---|---|
レベル(SKU) | Basic, Standardの2通りのレベルを選択できる。Standardの方が機能が多いが、その分、高額費用となる |
ネイティブクライアントサポート | ネイティブクライアント機能を有効にするか否か |
インスタンス数 | インスタンス数を多くすればするほど、それだけ多くの接続を処理できる |
レベル(SKU)は「Basic」「Standard」の2通りが選べます。それぞれのレベル(SKU)で使用可能な機能は「Bastion の構成設定について」を参照ください。また、「Basic」「Standard」で価格も大きく異なります。2022年4月時点では、Basicは0.19$/Hrsで、Standardは0.29$/Hrsです。
ネイティブクライアントサポートは、文字通りブラウザではなくTeraTermなどのターミナルソフトを使って接続する機能です。クラウドリフトの段階で現行のTeraTermマクロ等を使った運用から脱却できない場合ならば、この機能はプレビュー段階ではあるものの非常に有用かと思います。
インスタンス数を増やせば、それだけ多くの同時接続を実現できます。デフォルト設定かつ最小値は2です。中程度のワークロードならば、インスタンス1つあたり25同時RDP接続と50同時SSH接続をサポートします。
ネイティブクライアントによる接続
前提条件
Azure Bastion サービスはブラウザだけではなく、TeraTermやPuttyなどのネイティブクライアントで接続する事もできます。このネイティブクライアント機能は、現時点では「プレビュー機能」ですので、使用は自己責任である事をご理解ください。
ネイティブクライアント機能を使うには、レベル(SKU)が「Standard」であり、「ネイティブクライアントサポート」にチェックが入っている事を確認します。
2022年4月時点では、az network bastionコマンドは開発段階であり発展途上です。そのため、今のところazコマンドでbastionの設定を変える事はできません。
Tunnel(ポートフォワード)による接続
以下のようなコマンドでローカルホストのポートを仮想マシンのポートへポートフォワードできます。tcp22やtcp3389へポートフォワードするように設定すれば、sshやrdpによる接続が可能です。
az network bastion tunnel \ --resource-group <リソースグループ名> \ --name <Bastion名> \ --target-resource-id <仮想マシンのリソースID> \ --resource-port <仮想マシンのポート番号> \ --port <ローカルホストのポート番号>
操作例を以下に示します。このように操作すれば、ローカルホストのtcp10022へ接続すれば、仮想マシンのtcp22へ接続されます。
VM_ID=$(az vm show \ --resource-group MyResourceGroup \ --name ubuntu010 \ --query "id" \ --output tsv ) az network bastion tunnel \ --resource-group MyResourceGroup \ --name MyBastion \ --target-resource-id ${VM_ID} \ --resource-port 22 \ --port 10022
以下のようなsshコマンドを使用すると、仮想マシンへ接続する事できます。
ssh localhost -l azureuser -p 10022
az network bastion tunnelコマンドを入力すると、Ctrl+Cを入力しない限りポートフォワードされたままの状態になります。ですので、az network bastion tunnelコマンドを入力後、別ターミナルを立ち上げてsshなどで接続すると良いでしょう。
これは初学者向けの説明です。ある程度のスキルを保有している方はやりやすいように操作ください。
RDPやSSHによる接続
以下のようなコマンドでRDPやSSHで直接接続する事もできます。将来の仕様変更に期待したいですが、2022年4月時点ではWindows OSくらいしかサポートされず、それ以外のOSを使用する場合は、前述の「Tunnel(ポートフォワード)」を使った方が良いでしょう。
az network bastion rdp \ --resource-group <リソースグループ名> \ --name <Bastion名> \ --target-resource-id <仮想マシンのリソースID> \ az network bastion ssh \ --resource-group <リソースグループ名> \ --name <Bastion名> \ --target-resource-id <仮想マシンのリソースID> \ --auth-type "ssh-key" \ --username <ユーザ名> \ --ssh-key <秘密鍵のファイルパス>
補足
課金額について
Bastion サービスは仮想マシンに比べれば割高なサービスです。2022年4月時点では、Basicは0.19$/Hrsで、Standardは0.29$/Hrsです。以下は、約90分程度Bastionサービスを起動した場合の請求額のスクリーンショットです。端数切り上げなのか72.84円を請求されている事が分かります。
要塞ホスト 仮想マシン
「Bastion サービス」が高価と感じるならば、要塞ホスト(踏み台サーバ)を仮想マシンで構築する方法もあります。パブリックIPアドレスを付与したStandard_B1sの仮想マシンを1台だけ構築すれば、「Bastion サービス」よりも安価な運用が出来るでしょう。
ただし、「Bastion サービス」はマネージドでセキュリティ関連の考慮がなされますので、仮想マシンで要塞ホストを作る場合は自己責任でセキュリティを担保する必要があります。仮想マシンで要塞ホストを作るのは、原則としてSandboxや家庭用などの用途に留めた方が良いでしょう。
稀に「Bastion サービス」では実現できないセキュリティ機能を求められる事もあります(例:RDPの録画)。極端な低予算の場合はBastionサービスを使わない選択もありますが、逆に高度過ぎる要求でBastionサービスを使わない意思決定をする事もあります。