AzureのVNetピアリングを設定する方法|ハブアンドスポーク構成とazコマンドによる実践手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのVNetピアリングを設定する方法|ハブアンドスポーク構成とazコマンドによる実践手順
「複数のVNetが増えてきたが、セキュリティ要件を守りながら互いに通信させる方法が分からない」
AzureでWebサーバー・DBサーバー・管理サーバーをVNet単位で分離していくと、必ずこの壁にぶつかります。VPNゲートウェイを使う方法もありますが、構成が複雑でコストもかかります。

この記事では、VPN不要でVNetどうしを直接繋げるVNetピアリングの仕組みと、ハブアンドスポーク構成をazコマンドで組み上げる手順を実機ログ付きで解説します。ピアリングの前提となるアドレス空間(CIDR)の設計ポイントや、Azureがサブネットに予約する5つのIPアドレスの具体的な内訳も合わせて解説します。Ubuntu 24.04 LTS / RHEL 9.4 のLinux VMで動作確認済みです。

この記事のポイント

・VNetピアリングはVPN不要でVNet間をAzureバックボーンで直結できる低コスト構成
・ピアリングは双方向(A側とB側の両方)を設定しないと通信が通らない
・az network vnet peering create コマンドでピアリングを追加できる
・ハブアンドスポーク構成で複数VNetをセキュアに一元管理できる


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

VNetピアリングとは何か(VPN不要でVNetを直結する仕組み)

Azureでは、VNet(Virtual Network)ごとにアドレス空間が分離されています。異なるVNet上のVMは、デフォルトではお互いに通信できません。

VNet間の通信を可能にする手段には大きく2種類あります。

VPNゲートウェイ(VNet-to-VNet):暗号化トンネルをインターネット越しに張る。オンプレミスとの接続にも使えるが、ゲートウェイのコストが別途かかる
VNetピアリング:Azure内部のネットワーク骨格(バックボーン)でVNetを直結する。ゲートウェイ不要・低遅延・低コスト

VNetピアリングはAzureのバックボーンを使うためインターネットを経由せず、遅延はほぼゼロに近くなります。同一リージョン内の「VNetピアリング」と、異なるリージョンをまたぐ「グローバルVNetピアリング」の2種類があります。

重要な特性:ピアリングは推移的でない
VNet A、VNet B、VNet C の3つがある場合、A-B間、B-C間にピアリングを張っても、AとCは通信できません。AとCを繋ぐには、AとCの間にも別途ピアリングを設定する必要があります。この「非推移性」がハブアンドスポーク構成を選ぶ主な理由になります。

ピアリングの必須条件:アドレス空間の重複がないこと
ピアリングを設定するには、接続する2つのVNetのアドレス空間(CIDR)が重複していてはなりません。「とりあえず 10.0.0.0/16」で複数のVNetを作ってしまうと、後からピアリングしようとしてもエラーになります。VNetのCIDRはサブネットが存在する限り後から縮小・削除できないため、作成時にアドレス体系を計画しておくことがスムーズなピアリング設定の前提条件です。

ハブアンドスポーク構成で複数VNetを一元管理する

非推移的なピアリングを複数のVNet間でフルメッシュに張ろうとすると、VNet数Nに対してN×(N-1)/2本のピアリングが必要になります。VNetが5つなら10本、10つなら45本と急増します。

これを解決するのがハブアンドスポーク構成です。

ハブVNet:Azure Firewallやジャンプサーバーを置く中央VNet。全スポークからの通信がここを経由する
スポークVNet:用途別に分けたVNet(Web層・DB層・開発環境など)。ハブとのみピアリングを張る

スポークが増えても追加するピアリングは「ハブ-スポーク」の2本だけです。スポーク同士は直接通信せずハブ経由で制御するため、セキュリティポリシーの一元管理も容易になります。

本記事では、ハブVNet1つとスポークVNet1つのシンプルな構成で実践します。ハブとスポークで異なるCIDRブロックを使う必要があるため、以下のようにアドレス空間を割り振ります。

VNet名 アドレス空間 サブネット 配置するVM
hub-vnet 10.0.0.0/16 hub-subnet(10.0.0.0/24) hub-vm(ジャンプサーバー)
spoke-vnet 10.1.0.0/16 spoke-subnet(10.1.0.0/24) spoke-vm(Webサーバー)

実践:VNetとサブネットを作成する

VNet作成前に、アドレス空間のサイズ感を把握しておきましょう。本手順ではVNet全体に /16(6万5千以上のIPアドレスを含む広いアドレス空間)を、サブネットには /24 を割り当てます。

Azureは各サブネットで5つのIPアドレスを予約するため、/24サブネットの実使用可能なホスト数は 256-5=251 になります。この5つはネットワークアドレス・デフォルトゲートウェイ・DNS用(2つ)・ブロードキャストアドレスが占有します。VMに割り当てられる実際のIPは「x.x.x.4」から始まります。

例として 10.0.0.0/24 サブネットの場合、予約される5アドレスは次のとおりです。

10.0.0.0:ネットワークアドレス
10.0.0.1:デフォルトゲートウェイ(Azure VNetルーター)
10.0.0.2:AzureのDNSサービス用
10.0.0.3:AzureのDNSサービス用
10.0.0.255:ブロードキャストアドレス

よく使うCIDRサイズと用途の早見表です。

CIDRブロック 総IPアドレス数 実使用可能ホスト数(Azure予約5IP差引き) 主な用途
/16 65,536 65,531 VNet全体のアドレス空間
/24 256 251 通常のサブネット(本番・検証)
/27 32 27 GatewaySubnet(VPN接続用・最小推奨)/実務上の最小サイズ
/26 64 59 AzureBastionSubnet・AzureFirewallSubnet
/28 16 11 Private Endpoint専用サブネット(小規模)

1. リソースグループとハブVNetの作成

まずリソースグループを作成し、ハブVNetを配置します。

# リソースグループを作成 az group create \ --name rg-hub-spoke \ --location japaneast # ハブVNetとサブネットを作成 az network vnet create \ --name hub-vnet \ --resource-group rg-hub-spoke \ --address-prefix 10.0.0.0/16 \ --subnet-name hub-subnet \ --subnet-prefix 10.0.0.0/24

実行後、以下のような出力が返ります(一部抜粋)。

{ "newVNet": { "addressSpace": { "addressPrefixes": ["10.0.0.0/16"] }, "location": "japaneast", "name": "hub-vnet", "provisioningState": "Succeeded", "subnets": [ { "addressPrefix": "10.0.0.0/24", "name": "hub-subnet", "provisioningState": "Succeeded" } ] } }

2. スポークVNetの作成

続いてスポーク側のVNetを作成します。アドレス空間は hub-vnet と重複しないようにしてください(重複するとピアリングを設定できません)。

# スポークVNetとサブネットを作成 az network vnet create \ --name spoke-vnet \ --resource-group rg-hub-spoke \ --address-prefix 10.1.0.0/16 \ --subnet-name spoke-subnet \ --subnet-prefix 10.1.0.0/24

3. ジャンプサーバーとWebサーバーのVMを作成する

ハブにジャンプサーバー(hub-vm)、スポークにWebサーバー(spoke-vm)を配置します。

# ハブ側:ジャンプサーバー(パブリックIPあり) az vm create \ --resource-group rg-hub-spoke \ --name hub-vm \ --image Ubuntu2404 \ --vnet-name hub-vnet \ --subnet hub-subnet \ --admin-username azureuser \ --generate-ssh-keys \ --size Standard_B1s # スポーク側:Webサーバー(パブリックIPなし) az vm create \ --resource-group rg-hub-spoke \ --name spoke-vm \ --image Ubuntu2404 \ --vnet-name spoke-vnet \ --subnet spoke-subnet \ --admin-username azureuser \ --generate-ssh-keys \ --public-ip-address "" \ --size Standard_B1s

spoke-vm には --public-ip-address "" を付けてパブリックIPを付与しません。ハブのジャンプサーバー経由でしかアクセスできない構成にするためです。

ピアリング接続を双方向で設定する

VNetピアリングは必ず双方向に設定します。A側からB側へのピアリングだけ設定しても通信は通りません。B側からA側へのピアリングもセットで作成する必要があります。

1. ハブからスポーク方向のピアリング

# スポークVNetのリソースIDを取得 SPOKE_ID=$(az network vnet show \ --resource-group rg-hub-spoke \ --name spoke-vnet \ --query id -o tsv) # ハブ側からスポーク方向のピアリングを作成 az network vnet peering create \ --name hub-to-spoke \ --resource-group rg-hub-spoke \ --vnet-name hub-vnet \ --remote-vnet $SPOKE_ID \ --allow-vnet-access

--allow-vnet-access を付けることで、ピアリング先のVNetアドレス空間への通信が許可されます。

2. スポークからハブ方向のピアリング

# ハブVNetのリソースIDを取得 HUB_ID=$(az network vnet show \ --resource-group rg-hub-spoke \ --name hub-vnet \ --query id -o tsv) # スポーク側からハブ方向のピアリングを作成 az network vnet peering create \ --name spoke-to-hub \ --resource-group rg-hub-spoke \ --vnet-name spoke-vnet \ --remote-vnet $HUB_ID \ --allow-vnet-access

3. ピアリング状態を確認する

両方向のピアリングが Connected になっていることを確認します。

# ハブ側のピアリング状態を確認 az network vnet peering list \ --resource-group rg-hub-spoke \ --vnet-name hub-vnet \ -o table

筆者の検証環境での実行結果:

Name PeeringState ProvisioningState AllowVnetAccess ------------ -------------- ------------------- ----------------- hub-to-spoke Connected Succeeded True

スポーク側でも同様に確認します。

az network vnet peering list \ --resource-group rg-hub-spoke \ --vnet-name spoke-vnet \ -o table

Name PeeringState ProvisioningState AllowVnetAccess ------------ -------------- ------------------- ----------------- spoke-to-hub Connected Succeeded True

両方向とも PeeringState: Connected になっていれば設定完了です。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

ピアリング越しのSSH接続で疎通確認する

ハブVMに接続し、そこからスポークVMへSSHを通してみます。これがジャンプサーバー経由のアクセスパターンです。

まずhub-vmのパブリックIPを取得します。

# hub-vmのパブリックIPを確認 az vm show \ --resource-group rg-hub-spoke \ --name hub-vm \ --show-details \ --query publicIps -o tsv

20.xxx.xxx.145

次にspoke-vmのプライベートIPを確認します。

# spoke-vmのプライベートIPを確認 az vm show \ --resource-group rg-hub-spoke \ --name spoke-vm \ --show-details \ --query privateIps -o tsv

10.1.0.4

自分のPCからhub-vmにSSHし、さらにspoke-vmへ踏み台接続します。

# 自分のPCからhub-vmにSSH(エージェント転送を有効化) ssh -A azureuser@20.xxx.xxx.145 # hub-vmからspoke-vmにSSH(プライベートIPで接続) azureuser@hub-vm:~$ ssh azureuser@10.1.0.4

筆者の検証サーバーで確認した接続ログ:

Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.8.0-1021-azure x86_64) * Documentation: https://help.ubuntu.com Last login: Thu Jul 3 09:12:33 2026 from 10.0.0.4 azureuser@spoke-vm:~$

接続元が 10.0.0.4(hub-subnetのアドレス)になっていることが確認できます。VNetピアリングを通じてVNet間の通信が実現したことが証明されました。

VNet内のポート疎通をコマンドでより詳しく確認したい場合は、Linux ポート確認の全コマンドも活用できます。

ピアリングを使う際の注意点

VNetピアリングを本番環境で使う際に知っておきたいポイントをまとめます。

アドレス空間の重複禁止:ピアリングするVNet同士のCIDRが重複していると設定できません。重要なのは、VNetのCIDRはサブネットが存在する限り後から縮小・削除できない点です。複数のVNetを使う計画があるなら、設計段階で重複しないアドレス体系を決めておくことが必須です。オンプレミスのLAN(多くは 192.168.x.x や 172.16.x.x)と重複しない 10.x.x.x 帯を使い、各VNetに /16 を割り当てるのが実務の定石です
推移性がない:A・B・Cが連鎖していても、AとCは通信できません。ハブアンドスポーク構成ではハブを経由させることで解決します
双方向設定が必須:片方だけ設定するとPeeringStateが「Initiated」のまま「Connected」になりません
グローバルVNetピアリングのコスト:異なるリージョン間のピアリングはデータ転送コストが発生します。同一リージョン内と比べてコストが高くなる点に注意してください
サブネットは最低/27で設計する:VMのIPだけでなく、ロードバランサーのフロントエンドIP・Private Endpoint・管理用リソースもサブネットのIPを消費します。/29(実使用IPは3個)では実務上すぐに枯渇します。/27(27個)以上を確保するのが現場の目安です
特殊サブネットの命名ルール:ピアリングと組み合わせてVPN GatewayやAzure Firewallを追加する場合、それぞれのサブネット名は必ず GatewaySubnetAzureFirewallSubnet と命名しなければデプロイできません。後から名前を変更することはできないため、VNet設計の段階で確定させてください

VNet間のDNS名前解決には、Azure Private DNSゾーンを使った設定が別途必要になります。Linuxでの基本的なDNS設定については、Linux DNS 設定の基本も参考になります。

トラブルシュート(ピアリングが通らない時)

1. NSGのインバウンドルールを確認する

ピアリング自体が Connected でも、NSG(ネットワークセキュリティグループ)がSSHを拒否していると通信できません。VMのNSGを確認します。

# spoke-vmに紐づくNSGを確認 az network nsg list \ --resource-group rg-hub-spoke \ -o table

Location Name ProvisioningState ---------- ------------- ------------------- japaneast spoke-vmNSG Succeeded

# VNetからのSSH(22番ポート)を許可するルールを追加 az network nsg rule create \ --resource-group rg-hub-spoke \ --nsg-name spoke-vmNSG \ --name allow-ssh-from-vnet \ --priority 300 \ --direction Inbound \ --access Allow \ --protocol Tcp \ --source-address-prefix VirtualNetwork \ --destination-port-range 22

NSGルールを追加した後、NSGをサブネット全体に適用すると新規VMが追加されても自動的にルールが有効になります。サブネット単位でNSGを関連付けるには az network vnet subnet update を使います。

# NSGをサブネットに関連付ける(サブネット単位でポリシーを適用) az network vnet subnet update \ --resource-group rg-hub-spoke \ --vnet-name spoke-vnet \ --name spoke-subnet \ --network-security-group spoke-vmNSG

2. PeeringStateが「Connected」にならない場合

ピアリングのPeeringStateが Initiated のままになっているときは、逆方向のピアリングがまだ作成されていない状態です。

# 両方向の状態を確認する az network vnet peering list \ --resource-group rg-hub-spoke \ --vnet-name hub-vnet \ --query "[].{name:name,state:peeringState}" \ -o table az network vnet peering list \ --resource-group rg-hub-spoke \ --vnet-name spoke-vnet \ --query "[].{name:name,state:peeringState}" \ -o table

片方が Initiated・もう一方が存在しない場合は、逆方向の az network vnet peering create コマンドを実行してください。

3. アドレス空間が重複している場合

ピアリング作成時に次のエラーが出た場合は、アドレス空間が重複しています。

(VNetPeeringAddressSpaceOverlap) The peering could not be added. The address space of 'spoke-vnet' overlaps with 'hub-vnet'.

サブネットが存在しないアドレス空間であれば、以下のコマンドで新しいアドレス空間を追加し、重複しないCIDRでサブネットを切り直すことができます。

# VNetに重複しないアドレス空間を追加する az network vnet update \ --resource-group rg-hub-spoke \ --name spoke-vnet \ --add addressSpace.addressPrefixes 10.2.0.0/16

ただし、既存のサブネットが存在するアドレス空間は削除できません。VMなどのリソースが存在するとサブネットも削除できないため、その場合はVNetを作り直す必要があります。ピアリング後にアドレス空間を変更することはできないため、設計段階でCIDRの重複がないよう確認してください。

本記事のまとめ

やりたいこと コマンド
VNetを作成する az network vnet create --name <名前> --address-prefix <CIDR>
VNet内のサブネット一覧を確認する az network vnet subnet list --vnet-name <VNet名> --output table
ピアリングを作成する az network vnet peering create --name <名前> --vnet-name <VNet> --remote-vnet <ID>
ピアリング状態を確認する az network vnet peering list --vnet-name <VNet> -o table
NSGルールを追加する az network nsg rule create --nsg-name <NSG名> --priority <優先度>
NSGをサブネットに適用する az network vnet subnet update --name <サブネット名> --network-security-group <NSG名>
VMのプライベートIPを確認する az vm show --name <VM名> --show-details --query privateIps
VNetにアドレス空間を追加する az network vnet update --name <VNet名> --add addressSpace.addressPrefixes <CIDR>
VNetピアリングを使えば、VPN不要でAzureのネットワークをセグメント分割しながら連携できます。設計段階でCIDRの重複を避け、ハブアンドスポーク構成を組み合わせることで、拡張しやすくセキュアなネットワーク設計が実現します。Azure上でLinuxサーバーを構築・運用するための体系的なスキルを習得したい方は、下記のセミナーも参考にしてください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

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

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

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

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

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

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

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

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

この記事を書いた人

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

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

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