🚅
[GA]Azure ExpressRoute プライベート ピアリングのカスタム BGP コミュニティを構成する
モチベ
- ExpressRouteの検証ができるというタイミングでちょうどよく以下の機能がGA
- つまるところ、AzureのVNET毎に個別のBGPコミュニティ値(12076:"カスタム値")を流すことができるという機能
- オンプレ側でルートフィルターをかけるときにちょっと便利だったり、Prefixよりそっちに慣れてる人もいるよねっていう嬉しいよねって感じ
- これは試すしかないと思い、チャレンジしてみる
環境設定と動作確認
- ExpressRouteに繋がっている以下のようなHub-Spoke環境を用意する
HubのVNETに対してBGPコミュニティ値をセットする
- Azure CloudShellで以下を入力する
#仮想ネットワークの取得
$virtualnetwork = @{
Name = 'vnet-clab-hub-001'
ResourceGroupName = '20230714-cloudlab'
}
$vnet = Get-AzVirtualNetwork @virtualnetwork
#BGPコミュニティの設定
$vnet.BgpCommunities = @{VirtualNetworkCommunity = '12076:49999'}
$vnet | Set-AzVirtualNetwork
これで、12076:49999
がBGPで10.0.0.0/16
と一緒に流れるはず。
オンプレ側スイッチの設定
- Ciscoのスイッチ上でBGPの情報を確認
Router#show ip bgp 10.0.0.0/16
BGP routing table entry for 10.0.0.0/16, version 9
Paths: (1 available, best #1, table default)
Not advertised to any peer
Refresh Epoch 1
12076, (received & used)
172.16.0.2 from 172.16.0.2 (172.16.0.2)
Origin IGP, localpref 100, valid, external, best
Community: 791462735 791462748
rx pathid: 0, tx pathid: 0x0
-
Community: 791462735 791462748
に注目- これを2^16=65536で割るとASNが出る
- 791462735/65536 = 12076.7629 =12076 = MicrosoftのAS番号
- Mod(791462735) = 49999
- つまり、
12076:49999
を表している
- 一方、
791462748
については12076:50012
と書き直すことができる- これは、Azureの東日本リージョンのプライベートピアリングを表すコミュニティ値になっている
- https://learn.microsoft.com/ja-jp/azure/expressroute/expressroute-routing#bgp
つまり、このCommunity値を解読することで、それがAzureの東日本リージョンからPrivate Peeringを通して流れてきていて、それがHubのVNETに関するものであることがわかる
Spoke側に別のBGPコミュニティ値を付与する
以下を実行すると、Spoke(10.10.0.0/16)のアドレスも広報されてきていることがわかるので、そっちも試す
Router#show ip bgp
BGP table version is 9, local router ID is 10.100.10.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.0.0.0/16 172.16.0.2 0 12076 i
*> 10.10.0.0/16 172.16.0.2 0 12076 i
*> 10.100.10.0/24 0.0.0.0 0 32768 i
Spoke 側には12076:48888
を付けてみる
#仮想ネットワークの取得
$virtualnetwork = @{
Name = 'vnet-clab-spoke-001'
ResourceGroupName = '20230714-cloudlab'
}
$vnet = Get-AzVirtualNetwork @virtualnetwork
#BGPコミュニティの設定
$vnet.BgpCommunities = @{VirtualNetworkCommunity = '12076:48888'}
$vnet | Set-AzVirtualNetwork
動作確認
- Cisco上で確認
Router#show ip bgp 10.10.0.0/16
BGP routing table entry for 10.10.0.0/16, version 10
Paths: (1 available, best #1, table default)
Not advertised to any peer
Refresh Epoch 1
12076, (received & used)
172.16.0.2 from 172.16.0.2 (172.16.0.2)
Origin IGP, localpref 100, valid, external, best
Community: 12076:48888 12076:50012
rx pathid: 0, tx pathid: 0x0
- Community値から、そのアドレス帯がspoke-001であることがわかる(実際には複数のVNETに対して同じコミュニティ値を設定することになろうかと思う)
- Spoke-001+α(特定のコミュニティ値の付いた)のネットワークから来たルートを隣のBGPルータに再広報しないようにとか、自分がルートを受信するタイミングで拒否するように、コミュニティ値ベースで設定ができる
BGP Communityによる経路の切り捨て
- CiscoスイッチのConfigを変えて、
12076:48888
を受け取らないようにしてみる- 最後の
permit 20
は明示的な許可として必要
- 最後の
Router(config)#ip community-list 1 permit 12076:48888
Router(config)#route-map COMMUNITY_ACTION deny 10
Router(config-route-map)#match community 1
Router(config-route-map)#router bgp 65150
Router(config-router)#neighbor 172.16.0.2 route-map COM
Router(config-router)#neighbor 172.16.0.2 route-map COMMUNITY_ACTION in
Router(config)#route-map COMMUNITY_ACTION permit 20
動作確認
- 受け取っている経路
Router#show ip bgp nei 172.16.0.2 received-routes
BGP table version is 330, local router ID is 10.100.10.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.0.0.0/16 172.16.0.2 0 12076 i
* 10.10.0.0/16 172.16.0.2 0 12076 i
*> 10.50.0.0/16 172.16.0.2 0 12076 i
*> 10.60.0.0/16 172.16.0.2 0 12076 i
*> 10.200.0.0/16 172.16.0.2 0 12076 i
*> 10.210.0.0/16 172.16.0.2 0 12076 i
- 実際に見えている経路
- フィルタをかけた
12076:48888
のアドレス空間が切り捨てられていることがわかる
- フィルタをかけた
Router#show ip bgp
BGP table version is 330, local router ID is 10.100.10.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.0.0.0/16 172.16.0.2 0 12076 i
*> 10.50.0.0/16 172.16.0.2 0 12076 i
*> 10.60.0.0/16 172.16.0.2 0 12076 i
*> 10.100.10.0/24 0.0.0.0 0 32768 i
*> 10.200.0.0/16 172.16.0.2 0 12076 i
*> 10.210.0.0/16 172.16.0.2 0 12076 i
- pingも通らないことを確認
おわり
- 各VNETからカスタムコミュニティ値を付けて広報できることを確認した
- そのカスタムコミュニティ値ベースでオンプレ側でフィルタをかけられることも確認した
- その結果、疎通できなくなることも確認した
- "劇的に変わるわけじゃないけど、やりたい人もいるよねー"っていう所感です。
GitHubで編集を提案
Discussion