Azure UDR(ユーザー定義ルート)完全ガイド!カスタムルートでVNet通信を自在に制御
生徒
「Azure(アジュール)で仮想ネットワークを作ったのですが、特定の通信だけファイアウォールを経由させたいんです。どうすればいいですか?」
先生
「それはAzure UDR(User Defined Route:ユーザー定義ルート)を使うのが一番ですね。標準のルートをカスタマイズして、通信の行き先を自由に変更できるんですよ。」
生徒
「標準のルート以外にも道を作れるってことですか?設定が難しそうで不安です。」
先生
「仕組みさえ分かれば大丈夫です。ルーティング(経路制御)の基礎から、実際の活用シーンまで、初心者の方にも分かりやすく丁寧に解説していきますね!」
1. Azure UDR(ユーザー定義ルート)とは?基本概念を解説
Azure(アジュール)の仮想ネットワーク(Virtual Network、通称VNet:ブイネット)内では、デフォルトで「システムルート」という道筋が自動的に作られています。これにより、同じVNet内のサブネット間やインターネットへの通信が特に設定しなくても行えるようになっています。
しかし、企業(エンタープライズ)のシステムでは、「セキュリティを高めるために、全ての通信を一度ネットワーク仮想アプライアンス(NVA)やAzure Firewall(アジュール・ファイアウォール)に通したい」という要望がよくあります。ここで登場するのがUDR(User Defined Route:ユーザー定義ルート)です。
UDRは、システムが自動で作ったルートよりも優先される「カスタムルート」です。道路標識を自分で書き換えて、車(データパケット)を好きな場所へ誘導するようなイメージだと考えると分かりやすいでしょう。これを活用することで、高度なネットワークセキュリティやトラフィック制御が可能になります。ちなみに、UDRを設定するためのリソース(入れ物)をルートテーブルと呼びます。
2. なぜUDRが必要なのか?主な活用シーン
なぜ標準のルートだけでは不十分なのでしょうか。それは、デフォルトの状態では「最短距離で通信を届ける」ことしか考えていないからです。現実の運用では、あえて「寄り道」をさせたいケースがあります。
- セキュリティ検査: インターネットへ出る通信を、必ずセキュリティ製品を通してから送信したい場合。
- ハブアンドスポーク構成: 中央のVNet(ハブ)に通信を集約し、各VNet(スポーク)間の通信を監視したい場合。
- オンプレミス連携: 特定のIPアドレス宛ての通信を、VPNゲートウェイ経由で社内ネットワークに送りたい場合。
このように、通信の透明性を確保し、企業のガバナンス(統制)を効かせるためにUDRは必須の技術となっています。Azureの設計を学ぶ上で、避けては通れない重要なキーワードの一つです。
3. ルーティングの優先順位と動作の仕組み
Azureにはルートの優先順位が決まっています。複数のルートが競合した場合、どの道が選ばれるかを知っておくことはトラブルシューティングにおいても重要です。基本的には、以下のルールで決定されます。
1. 最長プレフィックス一致(Longest Prefix Match): 送信先IPアドレスに対して、最も細かく範囲を指定しているルートが優先されます。例えば、「10.0.0.0/16」よりも「10.0.1.0/24」の方が優先されます。
2. ルートの種類による優先度: 同じプレフィックス(範囲)の場合、以下の順で優先されます。
- ユーザー定義ルート(UDR)
- BGPルート(ExpressRouteなど)
- システムルート
つまり、UDRを作れば、システムが勝手に決めたルートを「上書き」して自分の思い通りの経路に変更できるというわけです。これを「ルートのオーバーライド」と呼ぶこともあります。設定した内容は、サブネット(Subnet)単位で関連付けることで効果を発揮します。
4. UDR設定時の重要なパラメータ「次ホップの種類」
ルートテーブルにルートを追加する際、必ず指定しなければならないのが「次ホップ(Next Hop)」です。これは、データが次にどこへ向かうべきかを指定するものです。主に以下の5つのタイプがあります。
| 次ホップの種類 | 説明 |
|---|---|
| 仮想アプライアンス(Virtual Appliance) | Azure FirewallやサードパーティのFW、ルーターなどのIPアドレスを指定します。 |
| 仮想ネットワーク(Virtual Network) | VNet内の別の場所に送ります。通常はシステムルートで処理されます。 |
| VNet ゲートウェイ(VNet Gateway) | VPN接続やExpressRouteを介して、オンプレミス環境へ通信を送る際に使います。 |
| インターネット(Internet) | Azureが提供する既定のインターネットゲートウェイへ直接通信を送ります。 |
| なし(None) | 通信を破棄(ドロップ)します。特定の宛先への通信を遮断したいときに使います。 |
最もよく使われるのは「仮想アプライアンス」です。ここに社内で導入しているファイアウォールのプライベートIPアドレスを入力することで、全てのトラフィックを検査対象にすることができます。
5. Azure CLIを使ってルートテーブルを作成してみよう
管理ポータル(GUI)からも設定できますが、エンジニアとしてはコマンドライン(CLI)での操作にも慣れておきたいところです。ここでは、Azure CLIを使ってルートテーブルを作成し、特定のルートを追加する流れを確認しましょう。
まずは、リソースグループとルートテーブルを作成するコマンドです。初心者の方でも、一行ずつ実行すれば環境が構築できます。
az network route-table create --name MyRouteTable --resource-group MyResourceGroup --location japaneast
{ "location": "japaneast", "name": "MyRouteTable", "resourceGroup": "MyResourceGroup", "provisioningState": "Succeeded" }
次に、このルートテーブルに「全ての通信(0.0.0.0/0)をファイアウォール(10.0.0.4)に送る」というルールを追加します。これをデフォルトルートの変更と呼びます。
az network route-table route create --name ToFirewall --resource-group MyResourceGroup --route-table-name MyRouteTable --address-prefix 0.0.0.0/0 --next-hop-type VirtualAppliance --next-hop-ip-address 10.0.0.4
{ "addressPrefix": "0.0.0.0/0", "nextHopIpAddress": "10.0.0.4", "nextHopType": "VirtualAppliance", "name": "ToFirewall" }
最後に、このルートテーブルを特定のサブネットに適用(関連付け)します。これで、そのサブネット内の仮想マシン(VM)からの通信が制御されるようになります。
az network vnet subnet update --name MySubnet --vnet-name MyVNet --resource-group MyResourceGroup --route-table MyRouteTable
{ "name": "MySubnet", "routeTable": { "id": ".../MyRouteTable" }, "provisioningState": "Succeeded" }
6. PowerShellを利用したルート情報の確認方法
設定したルートが正しく反映されているか、PowerShell(パワーシェル)を使って確認することもよくあります。特に運用フェーズでは、どのルートが有効になっているか(有効なルート:Effective Routes)を調べることがトラブル解決の近道です。
以下のスクリプトは、特定のネットワークインターフェース(NIC)に適用されている全てのルート(システムルート含む)を表示する例です。実行結果をしっかり見る癖をつけましょう。
$resourceGroup = "MyResourceGroup"
$nicName = "MyVMNic1"
# ネットワークインターフェースに適用されている有効なルートを取得
Get-AzEffectiveRouteTable -NetworkInterfaceName $nicName -ResourceGroupName $resourceGroup
実行結果のイメージは以下の通りです。Source列が「User」となっているものが、あなたが作成したUDRです。Stateが「Active」になっていれば正常に機能しています。
Source State AddressPrefix NextHopType NextHopIpAddress
------- ----- ------------- ----------- ----------------
Default Active 10.0.0.0/16 VnetLocal
User Active 0.0.0.0/0 VirtualAppliance 10.0.0.4
Default Active 0.0.0.0/0 Internet
このように、UDRがデフォルト(Default)のインターネット行きルートを上書きしていることが確認できますね。これを視認できることが、Azureネットワーク管理者への第一歩です。
7. Python SDKを使った自動化のサンプルコード
クラウドの利点は自動化(プログラマブル)であることです。大量のVNetに対して一括でUDRを適用したい場合などは、Python(パイソン)などのプログラミング言語を使って操作するのが効率的です。
以下は、Azure SDK for Pythonを使用して、既存のルートテーブルに新しいルートを追加するシンプルなプログラムです。ライブラリのインポートから実際の処理まで、流れを追ってみてください。
from azure.identity import DefaultAzureCredential
from azure.mgmt.network import NetworkManagementClient
# 認証情報の取得
credential = DefaultAzureCredential()
subscription_id = "your-subscription-id"
network_client = NetworkManagementClient(credential, subscription_id)
# ルートのパラメータ定義
route_parameters = {
"address_prefix": "192.168.1.0/24",
"next_hop_type": "VirtualAppliance",
"next_hop_ip_address": "10.0.0.10"
}
# ルートの作成または更新
poller = network_client.routes.begin_create_or_update(
"MyResourceGroup",
"MyRouteTable",
"OnPremRoute",
route_parameters
)
route_result = poller.result()
print(f"ルート {route_result.name} の作成に成功しました。")
プログラムを使うことで、人為的なミスを防ぎつつ、コードとしてインフラの構成を管理(IaC:Infrastructure as Code)できるようになります。開発者にとってもUDRの知識は非常に役立ちます。
8. データベース連携時のUDR活用例(SQL Server)
実際のシステム構成では、Webサーバーからデータベース(SQL Serverなど)への通信経路を制限したい場合があります。例えば、データベースが設置されているサブネットにUDRを適用し、特定の管理用サーバー以外からのアクセス経路を遮断する、あるいはログ監視サーバーを経由させるといった構成です。
まずは、データベース上のユーザー情報を管理するテーブルの例を見てみましょう。セキュリティが重要なデータが含まれていることがわかります。
id | username | role | last_login
---+--------------+---------+--------------------
1 | admin_user | Admin | 2026-03-25 10:00
2 | web_app_svc | Service | 2026-03-27 09:15
3 | audit_mgr | Auditor | 2026-03-26 15:30
4 | dev_tester | Guest | 2026-03-20 12:00
特定のメンテナンス時間中に、全てのDB通信を監視用プロキシ(10.0.2.100)経由にするためにSQLで設定情報を管理し、それを元にプログラムがUDRを書き換えるような高度な運用も考えられます。以下は設定変更を記録するSQLのイメージです。
-- 通信経路の変更ステータスを更新する例
UPDATE network_configs
SET next_hop_ip = '10.0.2.100',
updated_at = CURRENT_TIMESTAMP
WHERE target_subnet = 'DB_Subnet';
-- 更新後の確認
SELECT * FROM network_configs WHERE target_subnet = 'DB_Subnet';
実行後のテーブル状態は以下のようになります。こうした設定値と実際のUDRの状態を同期させることで、堅牢なシステムが構築されます。
config_id | target_subnet | next_hop_ip | updated_at
----------+---------------+-------------+--------------------
101 | DB_Subnet | 10.0.2.100 | 2026-03-27 16:00
102 | Web_Subnet | 10.0.0.4 | 2026-03-20 08:00
9. UDRを使う際の注意点とトラブル防止策
非常に便利なUDRですが、設定を間違えると「通信が全く繋がらない!」という事態を招きます。以下のポイントを必ずチェックしましょう。
- 非対称ルーティング(Asymmetric Routing): 行きの道と帰りの道が異なると、ファイアウォールなどの機器が「知らない戻り通信」としてパケットを破棄してしまうことがあります。往復の経路を意識して設計しましょう。
- ネクストホップのIP有効性: 次ホップに指定したIPアドレスが、実際にパケットを転送(フォワーディング)できる設定になっているか確認が必要です。Azure VMをルーターにする場合は「IP転送の有効化」設定を忘れずに行いましょう。
- サービスへの影響: UDRはサブネット全体に影響します。安易に変更すると、そのサブネットで動いている全てのアプリが通信断になるリスクがあります。深夜などのメンテナンス時間に行うのが鉄則です。
まずは検証環境(サンドボックス)でテストを行い、意図した通りにパケットが流れることを確認してから本番環境へ適用するようにしましょう。ネットワークのトラブルは目に見えにくいため、前述した「有効なルート」の確認機能が最大の武器になります。
10. 今後の学習ステップ:より高度なネットワーク制御へ
UDRをマスターしたら、次はさらに高度なネットワーク概念に触れてみましょう。AzureにはUDRと組み合わせて使うことで真価を発揮するサービスがたくさんあります。
例えば、Azure Firewall(フルマネージドのセキュリティサービス)や、Virtual WAN(拠点間接続を統合管理するサービス)などです。これらを組み合わせることで、グローバル規模の巨大なネットワークでも、一元的にルートを制御し、高いセキュリティを維持できるようになります。
また、最近ではAzure Route Server(ルート・サーバー)というサービスも登場しています。これはBGPというプロトコルを使って、UDRを手動で書かなくても動的にルートを交換できる仕組みです。大規模な環境ではUDRの管理が大変になるため、自動化の手段として注目されています。
ネットワークの世界は奥が深いですが、その基本となるのは「パケットをどこへ送るか」というシンプルなルールです。UDRはそのルールを自分で定義するための第一歩。ぜひ、自分の手で設定を動かして、その挙動を体感してみてください。クラウドエンジニアとしてのスキルが大きく飛躍すること間違いなしです!
まとめ
Azure UDR(ユーザー定義ルート)は、クラウド上のネットワークトラフィックを緻密に制御し、企業のセキュリティ要件や運用ルールを適用するための強力な武器です。標準のシステムルートでは実現できない「特定のファイアウォールを経由させる」「通信を強制的に遮断する」「オンプレミス環境へ特定の経路で流す」といった高度なルーティングを、ルートテーブルというリソースを通じて実現します。
実務においては、単にルートを作成するだけでなく、サブネットへの関連付けや「次ホップ」の正確な指定、そして何より「有効なルート(Effective Routes)」を用いた動作確認が不可欠です。ネットワーク構成が複雑になればなるほど、最長プレフィックス一致の原則や優先順位の理解がトラブルシューティングの鍵となります。
C#によるルートテーブル情報の取得サンプル
開発現場では、アプリケーションからインフラの状態を監視したり、動的に設定を確認したりすることもあります。以下は、C#(Azure SDK for .NET)を使用して、特定のルートテーブルに設定されているルート一覧を取得するプログラムの例です。
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Network;
using System;
// Azureのリソース操作を行うサンプルクラス
class AzureNetworkManager
{
public static async System.Threading.Tasks.Task GetRouteDetails()
{
string subscriptionId = "your-subscription-id";
string resourceGroupName = "MyResourceGroup";
string routeTableName = "MyRouteTable";
ArmClient client = new ArmClient(new DefaultAzureCredential());
ResourceIdentifier routeTableId = RouteTableResource.CreateResourceIdentifier(subscriptionId, resourceGroupName, routeTableName);
RouteTableResource routeTable = client.GetRouteTableResource(routeTableId);
Console.WriteLine($"ルートテーブル: {routeTableName} の詳細を取得します。");
await foreach (RouteResource route in routeTable.GetRoutes())
{
Console.WriteLine($"ルート名: {route.Data.Name}");
Console.WriteLine($"宛先アドレス: {route.Data.AddressPrefix}");
Console.WriteLine($"次ホップの種類: {route.Data.NextHopType}");
}
}
}
実行結果は以下のようになります。
ルートテーブル: MyRouteTable の詳細を取得します。
ルート名: ToFirewall
宛先アドレス: 0.0.0.0/0
次ホップの種類: VirtualAppliance
ルート名: OnPremRoute
宛先アドレス: 192.168.1.0/24
次ホップの種類: VirtualAppliance
COBOLでのルーティング設定管理のイメージ
レガシーシステムとの連携において、ネットワーク構成情報をフラットファイルで管理し、バッチ処理で解析する場合のコードイメージです。
IDENTIFICATION DIVISION.
PROGRAM-ID. ROUTE-CHECK.
DATA DIVISION.
FILE SECTION.
FD ROUTE-FILE.
01 ROUTE-RECORD.
05 ROUTE-NAME PIC X(20).
05 DEST-IP PIC X(15).
05 NEXT-HOP PIC X(15).
PROCEDURE DIVISION.
OPEN INPUT ROUTE-FILE.
READ ROUTE-FILE
AT END DISPLAY "NO DATA FOUND"
NOT AT END
DISPLAY "CHECKING ROUTE: " ROUTE-NAME
DISPLAY "DESTINATION: " DEST-IP
DISPLAY "NEXT HOP: " NEXT-HOP
END-READ.
CLOSE ROUTE-FILE.
STOP RUN.
生徒
「先生、Azure UDRについて詳しく教えていただきありがとうございました!ルートテーブルを作ってサブネットに紐付けるだけで、通信の流れをガラッと変えられるんですね。」
先生
「その通りです。特に『0.0.0.0/0』を仮想アプライアンスに向ける設定は、エンタープライズ環境のセキュリティ強化で非常によく使われるテクニックですよ。何か一番印象に残ったことはありますか?」
生徒
「優先順位の話が面白かったです!自分で設定したUDRがシステムルートよりも優先される(オーバーライドする)という仕組みを聞いて、自分がネットワークの主導権を握っている感じがしました。」
先生
「いい視点ですね。でも、その分責任も重大です。間違ったIPを次ホップに指定すると、重要なデータベースへの通信が途切れてしまうかもしれませんからね。」
生徒
「はい、さっきのSQLでの管理例のように、設定変更の履歴をしっかり残したり、PowerShellで『有効なルート』をこまめに確認したりする習慣をつけようと思います。データベースのテーブルも確認してみたのですが、こんな感じで管理するんですね。」
id | route_label | target_cidr | priority | status
---+----------------+-----------------+----------+---------
1 | Internet_GW | 0.0.0.0/0 | 100 | Active
2 | VPN_OnPrem | 172.16.0.0/12 | 200 | Active
3 | DMZ_Filter | 10.0.1.0/24 | 50 | Inactive
先生
「素晴らしい!その調子でSQLを使って設定値を管理し、それをPythonやCLIで反映させる自動化(IaC)にも挑戦してみてください。コマンドラインでの確認も忘れずにね。」
az network route-table route list --resource-group MyResourceGroup --route-table-name MyRouteTable
[
{
"addressPrefix": "0.0.0.0/0",
"nextHopIpAddress": "10.0.0.4",
"nextHopType": "VirtualAppliance",
"name": "ToFirewall"
}
]
生徒
「ありがとうございます!次はAzure Firewallと組み合わせて、もっと本格的なハブアンドスポーク構成を構築してみます!」