デフォルトのシステムルートでは、同一VNet内のサブネット間はすべて相互通信が可能です。本番環境でAzure Firewallや仮想アプライアンスを経由させたい場合、このままでは要件を満たせません。
この記事では、AzureのRoute Table(ルートテーブル)とUser Defined Route(UDR)を使って、サブネット単位でカスタムルーティングを設定する手順を解説します。
実行環境:Azure CLI 2.60以降、Japan Eastリージョン。Route Tableの作成からサブネットへのアタッチ、有効ルートの確認まで、azコマンドを使って一気通貫で説明します。
この記事のポイント
・UDRを使うとサブネット単位でトラフィックの経路を強制できる
・az network route-table createとroute createの2ステップで設定できる
・ネクストホップにはVirtualAppliance・Internet・Noneなど5種類ある
・az network nic show-effective-route-tableで実際の有効ルートを確認できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜAzureでカスタムルーティング(UDR)が必要になるのか
AzureのVNetを作成すると、Microsoftが管理するシステムルートが自動で設定されます。このシステムルートのおかげで、サブネットを追加するだけでVNet内の相互通信が確立されます。一見便利なのですが、本番環境の多層構成(3-tier)を組もうとするとすぐに壁にぶつかります。たとえば以下のような要件が実務では頻繁に発生します。
・Webサーバーからの全アウトバウンドをAzure Firewall経由に強制したい
・DBサブネットからインターネットへの直接アクセスをブロックしたい
・特定のサブネット間のみ通信を許可し、それ以外はドロップしたい
NSG(ネットワークセキュリティグループ)だけではルートを変更できず、通過するだけです。トラフィックの「経路そのもの」を変えるには、UDR(User Defined Route)が必要です。
システムルートとUser Defined Route(UDR)の違い
Azureのルーティングには3種類あり、優先度の高い順にUDR、BGPルート、システムルートです。| ルートの種類 | 管理者が操作できるか | 優先度 | 代表的な用途 |
|---|---|---|---|
| システムルート | 削除・変更不可(無効化のみ可) | 低 | VNet内デフォルト通信、インターネット送出 |
| User Defined Route(UDR) | 作成・変更・削除可 | 高 | Azure Firewall経由の強制、プライベートルーティング |
| BGPルート | VPN Gateway/ExpressRoute経由で学習 | 中 | オンプレミス拠点との接続 |
・VirtualAppliance:Azure FirewallなどのプライベートIPアドレスを指定する
・Internet:インターネットへ直接送出する(デフォルト動作の明示的指定)
・VirtualNetworkGateway:VPN GatewayまたはExpressRouteへ転送する
・VnetLocal:VNet内の通常ルーティングを使用する
・None:パケットをドロップする(ブラックホール化)
Route TableとUDRをazコマンドで設定する手順
ここでは、Webサブネット(10.0.1.0/24)からのアウトバウンドを仮想アプライアンス(10.0.2.4)経由に変更する例を解説します。構成イメージ:
・VNet: 10.0.0.0/16(名前: myVNet)
・Webサブネット: 10.0.1.0/24(ルート制御対象)
・アプライアンスサブネット: 10.0.2.0/24(仮想Firewall配置先)
・仮想アプライアンスのプライベートIP: 10.0.2.4
1. リソースグループとVNetを準備する
まずリソースグループとVNetを作成します。既存のリソースがある場合はこの手順をスキップしてください。# リソースグループを作成する az group create --name myRG --location japaneast # VNetとWebサブネットを作成する az network vnet create --resource-group myRG --name myVNet --address-prefix 10.0.0.0/16 --subnet-name webSubnet --subnet-prefix 10.0.1.0/24 # アプライアンス用サブネットを追加する az network vnet subnet create --resource-group myRG --vnet-name myVNet --name applianceSubnet --address-prefix 10.0.2.0/24
2. Route Tableを作成する
Route Tableはサブネットにアタッチする「ルーティングのコンテナ」です。Route Table自体は空の状態で作成し、後からルート(UDR)を追加します。# Route Tableを作成する # --disable-bgp-route-propagation: BGPルートの自動学習を無効化するか指定 az network route-table create --resource-group myRG --name myRouteTable --location japaneast --disable-bgp-route-propagation false # 作成確認 az network route-table list --resource-group myRG --output table
Location Name ProvisioningState ResourceGroup ----------- ------------- ------------------- --------------- japaneast myRouteTable Succeeded myRG
3. カスタムルート(UDR)を追加する
次に、Route Table内にUDRを追加します。ここでは「すべてのアウトバウンド(0.0.0.0/0)を仮想アプライアンス(10.0.2.4)経由にする」ルートを設定します。# UDR(カスタムルート)を追加する az network route-table route create --resource-group myRG --route-table-name myRouteTable --name defaultToFirewall --address-prefix 0.0.0.0/0 --next-hop-type VirtualAppliance --next-hop-ip-address 10.0.2.4 # 追加したルートの一覧を確認する az network route-table route list --resource-group myRG --route-table-name myRouteTable --output table
AddressPrefix Name HasBgpOverride NextHopIpAddress NextHopType ProvisioningState --------------- ------------------ ---------------- ------------------ ----------------- ------------------- 0.0.0.0/0 defaultToFirewall False 10.0.2.4 VirtualAppliance Succeeded
4. Route Tableをサブネットにアタッチする
Route Tableを作成しただけではルーティングは変わりません。対象サブネットへアタッチすることで初めて有効になります。# webSubnetにRoute Tableをアタッチする az network vnet subnet update --resource-group myRG --vnet-name myVNet --name webSubnet --route-table myRouteTable # アタッチを確認する az network vnet subnet show --resource-group myRG --vnet-name myVNet --name webSubnet --query routeTable.id --output tsv
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myRG/providers/Microsoft.Network/routeTables/myRouteTable
5. 設定を確認する
Route TableのUDRが正しく設定されているかを確認します。# Route Tableの詳細(UDR一覧含む)を確認する az network route-table show --resource-group myRG --name myRouteTable --output json # アタッチされているサブネット一覧も確認できる az network route-table show --resource-group myRG --name myRouteTable --query subnets[].id --output tsv
ネクストホップの種類とユースケース別の選び方
実務でよく使うネクストホップの組み合わせを整理します。| 要件 | 宛先アドレス | ネクストホップ |
|---|---|---|
| 全アウトバウンドをAzure Firewall経由にする | 0.0.0.0/0 | VirtualAppliance(FirewallプライベートIP) |
| 特定のCIDRへの通信をドロップする | 対象CIDR(例:192.168.0.0/16) | None |
| オンプレミス向け通信をVPN Gatewayへ送る | オンプレCIDR | VirtualNetworkGateway |
| 特定の宛先だけ直接インターネット送出する | 特定IP・CIDR | Internet |
| VNet内の通常ルーティングに戻す | 対象CIDR | VnetLocal |
Azureのネットワーク設計をハンズオン形式で体系的に学びたい方は、現役エンジニアが解説するAzure実践講座もあわせて活用ください。
Azure対応セミナーの詳細を見る >>
ルーティングが効かない時のトラブルシュート
UDRを設定したのにトラフィックが意図した経路を通らない場合、以下の順序で調査します。1. 有効ルート(Effective Routes)を確認する
VMのNIC(ネットワークインターフェース)に対して実際に有効なルートを確認するコマンドが、最も重要なデバッグ手段です。# まずVMのNIC名を確認する az vm show --resource-group myRG --name myWebVM --query networkProfile.networkInterfaces[].id --output tsv # NICの有効ルートを確認する(NIC名を取得後) az network nic show-effective-route-table --resource-group myRG --name myWebVMNic --output table
Source State Address Prefix Next Hop Type Next Hop IP -------- ------- ---------------- ------------------- ----------- Default Active 10.0.0.0/16 VnetLocal User Active 0.0.0.0/0 VirtualAppliance 10.0.2.4 Default Invalid 0.0.0.0/0 Internet
2. NSGとの役割を分けて切り分ける
NSGはパケットの許可・拒否を制御し、Route Tableはパケットの経路を制御します。「NSGで許可しているのに通信できない」場合はルーティングの問題、「ルートは正しいのに通信できない」場合はNSGの問題と切り分けられます。Linux VM内でLinux ポート確認の全コマンドを使って、VM側でのポートの開放状況を確認することも有効な切り分け手段です。ssコマンドやlsofで待ち受けポートを確認し、OSレベルの問題かネットワークレベルの問題かを分離しましょう。
3. BGPルート伝播の影響を確認する
Route Table作成時に「--disable-bgp-route-propagation false」(デフォルト)を指定すると、VPN Gatewayが学習したBGPルートがRoute Tableに自動追加されます。意図しないBGPルートが有効ルートに表示される場合は「--disable-bgp-route-propagation true」で伝播を無効にしてください。# BGPルート伝播を無効にしてRoute Tableを更新する az network route-table update --resource-group myRG --name myRouteTable --disable-bgp-route-propagation true
本記事のまとめ
AzureのRoute TableとUser Defined Route(UDR)を使えば、VNet内のサブネット単位でトラフィックの経路を細かく制御できます。デフォルトのシステムルートでは実現できない「Azure Firewall経由の強制」や「特定CIDRのブラックホール化」も、azコマンド数行で設定できます。| やりたいこと | コマンド |
|---|---|
| Route Tableを作成する | az network route-table create --resource-group RG名 --name テーブル名 --location japaneast |
| UDR(カスタムルート)を追加する | az network route-table route create --route-table-name テーブル名 --name ルート名 --address-prefix CIDR --next-hop-type ホップ種別 |
| Route Tableをサブネットにアタッチする | az network vnet subnet update --vnet-name VNet名 --name サブネット名 --route-table テーブル名 |
| 有効ルートを確認する | az network nic show-effective-route-table --resource-group RG名 --name NIC名 |
| UDRを削除する | az network route-table route delete --route-table-name テーブル名 --name ルート名 |
| Route Tableをサブネットからデタッチする | az network vnet subnet update --vnet-name VNet名 --name サブネット名 --remove routeTable |
次のステップとして、Azure Firewallと組み合わせた強制トンネリング(Forced Tunneling)の構成や、ハブアンドスポーク設計でのUDR活用も検討してみてください。
次に読む記事
・Linux ポート確認の全コマンド
Azure対応セミナーの詳細を見る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:Azure Update ManagerでLinux VMのパッチを一元管理する方法|更新プログラムの評価とスケジュール適用
- この記事の属するカテゴリ:Azureへ戻る

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