サブネットを追加するたびに両側の設定を更新しなければならず、変更漏れで特定サーバーへの通信が届かなくなる、というケースはよく起きます。
この記事では、Azure仮想ネットワークゲートウェイにBGPを設定して、経路を動的に広報する方法を解説します。
azコマンドによる構築手順とTerraformのHCLコードで管理する自動化方法の両方を紹介します。RHEL 9系/Ubuntu 24.04 LTSを搭載したオンプレミスLinuxサーバーとAzure間のサイト間VPNを想定環境として説明します。
この記事のポイント
・BGPを有効にするにはVpnGw1以上のSKUが必要(BasicはBGP非対応)
・az network vnet-gateway createの--enable-bgpフラグでBGPを有効にできる
・Terraformはenable_bgp=trueとbgp_settingsブロックでASNとピアIPを管理
・BGP学習経路はaz network vpn-connection list-learned-routesで確認する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Azure仮想ネットワークゲートウェイとBGPの役割
Azure仮想ネットワークゲートウェイ(Virtual Network Gateway)は、VNetとオンプレミスや他のVNetを接続するためのマネージドリソースです。用途によってVPN GatewayとExpressRoute Gatewayの2種類があります。この記事ではVPN Gatewayを対象とします。
BGP(Border Gateway Protocol)は、ルーターとルーターの間で経路情報を動的に交換するプロトコルです。
静的ルートと違い、BGPを設定すると接続先からサブネットの追加・削除が自動的に伝わります。
オンプレミスのネットワーク構成が変わる場面では、BGPによる動的ルーティングが効果的です。
BGPを利用する際の前提条件は次のとおりです。
・VPN GatewayのSKUがVpnGw1以上(BasicはBGP非対応)
・オンプレミス側のルーターまたはLinuxサーバー(FRRouting等)がBGPをサポートしていること
・Azure側のASN(デフォルト65515)とオンプレミス側のASNが異なること
SKUがBasicのまま試すと「Cannot enable BGP on a Basic VPN Gateway」というエラーになります。
VpnGw1以上に変更してから先に進んでください。
azコマンドでBGP対応VNet Gatewayを構築する
ここでは、既存のVNetにBGP対応のVPN Gatewayを作成する手順を示します。事前に Azure CLI(az)をインストールして `az login` でサインインしておいてください。
1. GatewaySubnetを作成する
VNet Gatewayには「GatewaySubnet」という名前のサブネットが必要です。この名前は固定であり、変更できません。推奨サイズは/27以上です。
# リソースグループとVNetを作成する RG=rg-vpngw-demo VNET=vnet-demo LOCATION=japaneast az group create --name $RG --location $LOCATION az network vnet create \ --name $VNET \ --resource-group $RG \ --location $LOCATION \ --address-prefix 10.1.0.0/16 # GatewaySubnetを追加する(名前は必ずGatewaySubnet) az network vnet subnet create \ --vnet-name $VNET \ --resource-group $RG \ --name GatewaySubnet \ --address-prefix 10.1.255.0/27
2. パブリックIPアドレスを用意する
VPN GatewayはパブリックIPアドレスを必要とします。BGPを利用する場合、Standard SKUの静的IPが必要です。
# Standard SKUの静的パブリックIPを作成する az network public-ip create \ --name pip-vpngw-demo \ --resource-group $RG \ --location $LOCATION \ --sku Standard \ --allocation-method Static
3. VPN GatewayをBGP有効で作成する
`--enable-bgp true` を指定することでBGPが有効になります。`--asn` にはAzure側のAS番号を指定します。デフォルトは65515です。
Gatewayの作成には25分~45分程度かかります。
# BGP有効でVPN Gatewayを作成する(--no-waitで非同期実行) az network vnet-gateway create \ --name vpngw-demo \ --resource-group $RG \ --location $LOCATION \ --public-ip-address pip-vpngw-demo \ --vnet $VNET \ --gateway-type Vpn \ --vpn-type RouteBased \ --sku VpnGw1 \ --enable-bgp true \ --asn 65515 \ --no-wait # 作成状況を確認する(Succeeded になるまで待つ) az network vnet-gateway show \ --name vpngw-demo \ --resource-group $RG \ --query "provisioningState" \ --output tsv
# BGP設定を確認する(bgpSettings.bgpPeeringAddressがピアIPアドレス) az network vnet-gateway show \ --name vpngw-demo \ --resource-group $RG \ --query "bgpSettings"
{ "asn": 65515, "bgpPeeringAddress": "10.1.255.254", "bgpPeeringAddresses": null, "peerWeight": 0 }
4. LocalNetworkGatewayにBGP情報を設定する
LocalNetworkGateway(LNG)はオンプレミス側のネットワーク情報を表すリソースです。BGPを使う場合、オンプレミス側のASNとBGPピアIPアドレスを指定します。
`--address-prefixes` は省略できます(BGPで経路を動的に受け取るため)。
# オンプレミス側のパブリックIPとBGP設定でLNGを作成する az network local-gateway create \ --name lng-onprem-demo \ --resource-group $RG \ --location $LOCATION \ --gateway-ip-address "203.0.113.1" \ --asn 65000 \ --bgp-peering-address "192.168.100.1" \ --peer-weight 0 # 設定を確認する az network local-gateway show \ --name lng-onprem-demo \ --resource-group $RG \ --query "{asn:bgpSettings.asn, peerIp:bgpSettings.bgpPeeringAddress, gwIp:gatewayIpAddress}"
5. VPN接続でBGPを有効にする
VNet GatewayとLocal Network Gatewayを結ぶ接続リソースを作成し、BGPを有効にします。# BGP有効の接続リソースを作成する az network vpn-connection create \ --name conn-to-onprem \ --resource-group $RG \ --location $LOCATION \ --vnet-gateway1 vpngw-demo \ --local-gateway2 lng-onprem-demo \ --shared-key "YourSharedKey" \ --enable-bgp true
TerraformでBGPルーティングを管理する
azコマンドで設定した内容をTerraformのHCLコードで管理すると、変更履歴をGitで追跡でき、複数環境への適用も簡単になります。ここでは主要な3つのリソースのBGP関連設定を示します。
1. 変数ファイルとプロバイダー設定
# variables.tf variable "resource_group_name" { default = "rg-vpngw-tf" } variable "location" { default = "japaneast" } variable "azure_asn" { default = 65515 } variable "onprem_asn" { default = 65000 } variable "onprem_bgp_peering_address" { default = "192.168.100.1" } variable "onprem_gateway_ip" { default = "203.0.113.1" }
2. azurerm_virtual_network_gatewayにbgp_settingsを書く
`enable_bgp = true` とあわせて `bgp_settings` ブロックでASNを指定します。SKUは必ずVpnGw1以上を設定してください。
# main.tf(VNet Gateway部分) resource "azurerm_virtual_network_gateway" "this" { name = "vpngw-tf-demo" resource_group_name = var.resource_group_name location = var.location type = "Vpn" vpn_type = "RouteBased" sku = "VpnGw1" enable_bgp = true bgp_settings { asn = var.azure_asn } ip_configuration { name = "ipconfig1" public_ip_address_id = azurerm_public_ip.this.id private_ip_address_allocation = "Dynamic" subnet_id = azurerm_subnet.gateway.id } }
3. azurerm_local_network_gatewayのBGP設定
LocalNetworkGateway側にも `bgp_settings` を追加します。`asn` にオンプレミス側のAS番号を、`bgp_peering_address` にBGPピアIPを指定します。
# main.tf(Local Network Gateway部分) resource "azurerm_local_network_gateway" "this" { name = "lng-onprem-tf" resource_group_name = var.resource_group_name location = var.location gateway_address = var.onprem_gateway_ip bgp_settings { asn = var.onprem_asn bgp_peering_address = var.onprem_bgp_peering_address peer_weight = 0 } }
4. azurerm_virtual_network_gateway_connectionでBGPを有効にする
接続リソースに `enable_bgp = true` を設定することで、BGPによる経路交換が始まります。# main.tf(接続リソース部分) resource "azurerm_virtual_network_gateway_connection" "this" { name = "conn-onprem-tf" resource_group_name = var.resource_group_name location = var.location type = "IPsec" virtual_network_gateway_id = azurerm_virtual_network_gateway.this.id local_network_gateway_id = azurerm_local_network_gateway.this.id shared_key = "YourSharedKey" enable_bgp = true }
BGP設定の変更もコードで管理できるので、ネットワーク変更の経緯をGitのコミット履歴から追跡できます。
Azureのネットワーク設計をIaCで管理する方法については、Azureハンズオン講座の詳細もご参照ください。
BGP経路広報の動作確認方法
接続が確立したら、次のコマンドで経路が正しく広報されているか確認できます。VPN接続の状態確認:
# 接続状態を確認する(Connected になっていることを確認) az network vpn-connection show \ --name conn-to-onprem \ --resource-group $RG \ --query "{status:connectionStatus, bgpEnabled:enableBgp}"
{ "bgpEnabled": true, "status": "Connected" }
# BGPで学習した経路一覧を表示する az network vpn-connection list-learned-routes \ --name conn-to-onprem \ --resource-group $RG \ --vnet-gateway vpngw-demo
[ { "asPath": "65000", "localAddress": "10.1.255.254", "network": "192.168.0.0/24", "nextHop": "192.168.100.1", "origin": "EBgp", "sourcePeer": "192.168.100.1", "weight": 0 } ]
VM側で有効ルートを確認する場合は次のコマンドを使います。
# VMのNICに適用されている有効ルートを確認する az network nic show-effective-route-table \ --name nic-vm-name \ --resource-group $RG \ --output table
よくあるエラーと対処法
「Cannot enable BGP on a Basic VPN Gateway」が出る場合BasicはBGP非対応です。SKUをVpnGw1以上に変更する必要があります。
既存GatewayのSKU変更は `az network vnet-gateway update --sku VpnGw1` で行いますが、一時的にゲートウェイが切断されます。
BGPピアリングが確立しない場合
次の3点を順番に確認してください。
・VPN接続のステータスがConnectedになっているか(IPsecが先に確立している必要がある)
・LNGに設定したBGPピアIPが、オンプレミス側ルーターの実際のピアIPと一致しているか
・オンプレミス側のASNとAzure側のASNが重複していないか(同じASNは使えない)
「Terraform plan時にbgp_settingsの差分が出続ける」場合
`bgp_settings.asn` の値がAzure APIが返す整数型とHCLの数値型で食い違う場合があります。
`asn = 65515` のように整数で記述し、文字列(`"65515"`)にしないことで解消できます。
まとめ
Azure仮想ネットワークゲートウェイのBGPルーティング設定について、azコマンドとTerraformの両方の手順を解説しました。| やりたいこと | コマンド・リソース |
|---|---|
| BGP有効でVPN Gatewayを作成する | az network vnet-gateway create --enable-bgp true --asn 65515 |
| BGP設定を確認する | az network vnet-gateway show --query "bgpSettings" |
| オンプレミス側のBGP情報を登録する | az network local-gateway create --asn 65000 --bgp-peering-address |
| 接続でBGPを有効にする | az network vpn-connection create --enable-bgp true |
| TerraformでVNet GatewayのBGPを設定する | azurerm_virtual_network_gateway { enable_bgp = true } |
| BGP学習経路を確認する | az network vpn-connection list-learned-routes |
ネットワーク構成の変更をコードで追跡できるため、複数人での運用にも対応しやすくなります。
AzureとTerraformを組み合わせたIaC運用まで実践で学べる講座を用意しています。
詳しくは >> Azureハンズオン講座の詳細ページ をご確認ください。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:Azureネットワーク構成図からaz CLIコマンドでリソース棚卸を自動化する|設計と実態の乖離を検出
- この記事の属するカテゴリ:Azureへ戻る

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