🚅

[GA]Azure ExpressRoute プライベート ピアリングのカスタム BGP コミュニティを構成する

2023/07/15に公開

モチベ

  • ExpressRouteの検証ができるというタイミングでちょうどよく以下の機能がGA

https://azure.microsoft.com/ja-jp/updates/general-availability-expressroute-private-peering-support-for-bgp-communities/

https://learn.microsoft.com/ja-jp/azure/expressroute/how-to-configure-custom-bgp-communities

  • つまるところ、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と書き直すことができる

つまり、この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で編集を提案
Microsoft (有志)

Discussion