LGTM

Looks Good To Me

Large BGP Community がやってくる前に,Community マッチをおさらいしよう

2017 / 02月,BGP Large Communities Attribute (RFC8092) がRFC 化された.

これは新たに 4Bytes:4Bytes:4Bytes のBGP Community を使えるようにするもので,既存の

  • BGP Community (RFC1997) - 2Bytes:2Bytes
  • Extended BGP Community (RFC4360) - 4Bytes:2Bytes もしくは 2Bytes:4Bytes

に比べて空間を広く使うことができる.BGP Community の先頭2バイト(もしくは4バイト) はGlobal Administrator と呼ばれ,ふつうは事業者のグローバルAS番号をあてる.加えて操作対象のAS番号,たとえば顧客のAS番号をBGP Community に含めたいケースがあり,これまでのBGP Community では空間が足りなかった.

近々BGP Community 空間が拡張されるにあたり「いま設定しているBGP Community 正規表現だいじょうぶなんだっけ?」と思って,いくつかの実装でマッチ方法を復習した.

Community マッチ方法

Juniper JUNOS

  • Community 表現(横) がマッチ対象(縦) にマッチするか
  • アルファベットはBGP Community を10進で表現したときの1ケタ.4ケタ = 2Bytes,6ケタ = 4Bytes
  • Large BGP Community 実装はなさそう
⬇️対象 \ 表現➡️ bbb:xxx bbb:xxx.* bbbL:xxx.*
bbb:xxx ⭕️ する ⭕️ する ❌ しない
abbb:xxx ❌ しない ⭕️ する ❌ しない
target:abbb:xxx ❌ しない ⭕️ する ❌ しない
target:aaabbb:xxx ❌ しない ❌ しない ⭕️ する
bbb:xxxy ❌ しない ⭕️ する ❌ しない

想像するに

  • L キーワードの有無で長さマッチ
  • \d+:\d+ パターンであれば^\d+:\d+$ と解釈.それ以外はそのまま

Cisco IOS-XR

  • 正規表現(横) がマッチ対象(縦) にマッチするか
  • アルファベットはBGP Community を10進で表現したときの1ケタ.4ケタ = 2Bytes
  • community-set の例.ほかにextcommunity-set キーワードがある
  • Large BGP Community 実装はなさそう
⬇️対象 \ 表現➡️ bbb:xxx bbb:* ios-regex ‘bbb:xxx’ ios-regex ‘bbb:xxx.*’
bbb:xxx ⭕️ する ⭕️ する ⭕️ する ⭕️ する
abbb:xxx ❌ しない ❌ しない ⭕️ する ⭕️ する
target:abbb:xxx ❌ しない ❌ しない ❌ しない ❌ しない
target:aaabbb:xxx ❌ しない ❌ しない ❌ しない ❌ しない
bbb:xxxy ❌ しない ⭕️ する ⭕️ する ⭕️ する

想像するに

  • community-set キーワード,extcommunity-set キーワードで分離.異なるものにマッチしない
  • ワイルドカードは 文頭 / 文末 を前提にしてマッチ
  • 正規表現は 文頭 / 文末 でなくてもマッチ

gobgp

  • 正規表現(横) がマッチ対象(縦) にマッチするか
  • アルファベットはBGP Community を10進で表現したときの1ケタ.4ケタ = 2Bytes,6ケタ = 4Bytes
  • community の例.ほかにext-communitylarge-community キーワードがある
  • Large BGP Community 対応バージョン
⬇️対象 \ 表現➡️ bbb:xxx bbb:xxx.*
bbb:xxx ⭕️ する ⭕️ する
abbb:xxx ❌ しない ⭕️ する
target:abbb:xxx ❌ しない ❌ しない
target:aaabbb:xxx ❌ しない ❌ しない
bbb:xxxy ❌ しない ⭕️ する
aaa:bbb:xxx ❌ しない ❌ しない
  • communityext-communitylarge-community キーワードで分離.異なるものにマッチしない
  • \d+:\d+ パターンであれば^\d+:\d+$ と解釈.それ以外はそのまま

Quagga

  • 正規表現(横) がマッチ対象(縦) にマッチするか
  • アルファベットはBGP Community を10進で表現したときの1ケタ.4ケタ = 2Bytes,6ケタ = 4Bytes
  • community-list の例.ほかにextcommunity-listlarge-community-list キーワードがある
  • Large BGP Community 対応バージョン
⬇️対象 \ 表現➡️ bbb:xxx bbb:xxx.*
bbb:xxx ⭕️ する ⭕️ する
abbb:xxx ⭕️ する ⭕️ する
target:abbb:xxx ❌ しない ❌ しない
target:aaabbb:xxx ❌ しない ❌ しない
bbb:xxxy ⭕️ する ⭕️ する
aaa:bbb:xxx ❌ しない ❌ しない
  • community-listextcommunity-listlarge-community-list キーワードで分離.異なるものにマッチしない
  • そのまま正規表現マッチ

Large BGP Community に対する懸念

2バイトの5ケタAS事業者が^ccccc:xxx$ と書くべきところを「ふつう2Bytes:2Bytes だし」とサボってccccc:xxx$ と書いてしまった場合に,意図しないLarge BGP Community にマッチして誤動作しないかを気にしていた.aaa:ccccc:xxxaaa:bccccc:xxx にマッチするかもなと.

4ケタ以下事業者は^ 忘れてないだろうし,4バイト事業者はうまくBGP Community を使えていないのでは と思われるので,問題になるとすれば2バイト5ケタかなと.

上記のようにまとめてみると,各実装とも既存の2Bytes:2Bytes Community と4Bytes:4Bytes:4Bytes のLarge BGP Community をキーワードで分離させる方針のようなので,杞憂かもしれない.

(JUNOS でExtended Community にマッチしてしまう細かな問題はあるかもしれない)

JUNOS のL キーワードはこれでいいんだっけ?

「4バイトの場合はL キーワードを使え」とドキュメントに書いているが,4Bytes:2Bytes もしくは 2Bytes:4Bytes だけであればこれでよかった.ところが4Bytes:4Bytes:4Bytes になると破綻するように思う.

aaa:bbb:ccc のうち,aaa はAS番号固定かもしれないが,bbb, ccc は2バイトレンジかもしれないし,4バイトレンジかもしれない.L の有無について4パターン併記しないといけない? それはつらい.

どういう実装で出してくるか楽しみだが,「L キーワードは捨てて,あらゆるCommunity について文頭~文末まで正規表現で文字列マッチします」というのがかえって分かりやすい気がする.

*1:手元に古いのしかなかった 😭