Azure仮想ネットワークゲートウェイのBGPルーティングを設定する|Terraformで経路広報を自動化

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Azure > Azure仮想ネットワークゲートウェイのBGPルーティングを設定する|Terraformで経路広報を自動化
オンプレミスのLinuxサーバーとAzure VNetをVPN接続した場合、静的ルートの管理が手間になることがあります。
サブネットを追加するたびに両側の設定を更新しなければならず、変更漏れで特定サーバーへの通信が届かなくなる、というケースはよく起きます。

この記事では、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で確認する


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

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設定の確認は次のコマンドで行えます。

# 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 }

`bgpPeeringAddress` がAzure側のBGPピアIPアドレスです。オンプレミス側の設定に使います。

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 }

Terraformの適用は `terraform plan` で差分を確認してから `terraform apply` で実行してください。
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で受け取った経路の確認:

# 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 } ]

`origin: EBgp` と表示されていれば、オンプレミス側からBGPで経路を受け取っていることを確認できます。
VM側で有効ルートを確認する場合は次のコマンドを使います。

# VMのNICに適用されている有効ルートを確認する az network nic show-effective-route-table \ --name nic-vm-name \ --resource-group $RG \ --output table

BGPで広報された経路は `Source: VirtualNetworkGateway`・`State: Active` として表示されます。

よくあるエラーと対処法

「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
BGPの設定をTerraformで管理することで、変更のたびに手作業でazコマンドを実行する手間が減り、設定ミスも防ぎやすくなります。
ネットワーク構成の変更をコードで追跡できるため、複数人での運用にも対応しやすくなります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、
AzureとTerraformを組み合わせたIaC運用まで実践で学べる講座を用意しています。
詳しくは >> Azureハンズオン講座の詳細ページ をご確認ください。

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

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

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

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

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

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

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

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

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。