AzureのRoute TableとUser Defined Routeを設定する方法|サブネットのカスタムルーティングをazコマンドで実践

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのRoute TableとUser Defined Routeを設定する方法|サブネットのカスタムルーティングをazコマンドで実践
「AzureでVNetを使った多層構成を組んでいると、フロントエンドとバックエンドのサブネットを分けたのに、トラフィックが意図しないルートを通ってしまう」という問題に直面します。
デフォルトのシステムルートでは、同一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で実際の有効ルートを確認できる


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

なぜ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経由で学習 オンプレミス拠点との接続
UDRで指定する「ネクストホップ(Next Hop)」には、以下の種類があります。

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

実行結果の例(末尾がRoute TableのリソースIDになっていればOK):

/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
注意点:NoneでドロップしたいCIDRよりも広いデフォルトルート(0.0.0.0/0)がUDRに存在する場合でも、より長いプレフィックスが優先されます。Azureのルート選択は「最長プレフィックス一致(Longest Prefix Match)」で動作するため、0.0.0.0/0があっても10.0.3.0/24向けにNoneを設定すれば、そちらが優先されます。

Azureのネットワーク設計をハンズオン形式で体系的に学びたい方は、現役エンジニアが解説するAzure実践講座もあわせて活用ください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
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

実行結果の例(実環境で取得・サブスクリプションIDはマスク済み):

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

「Source」列が「User」になっているルートがUDRです。Stateが「Active」なら有効、「Invalid」なら上位のUDRに上書きされた状態を示します。インターネット向けデフォルトルートがInvalidになっていれば、UDRが正しく機能しています。

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
UDRとNSGは役割が異なります。NSGで通信の許可・拒否を制御し、UDRでトラフィックの経路を制御する。この2つを組み合わせることで、Azureのネットワークセキュリティ設計は格段に柔軟になります。

次のステップとして、Azure Firewallと組み合わせた強制トンネリング(Forced Tunneling)の構成や、ハブアンドスポーク設計でのUDR活用も検討してみてください。

次に読む記事
Linux ポート確認の全コマンド
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

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

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

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

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

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

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

登録10秒/合わなければ解除3秒 / 詳細はこちら

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

この記事を書いた人

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

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

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