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-community
,large-community
キーワードがある- Large BGP Community 対応バージョン
⬇️対象 \ 表現➡️ | bbb:xxx | bbb:xxx.* |
---|---|---|
bbb:xxx | ⭕️ する | ⭕️ する |
abbb:xxx | ❌ しない | ⭕️ する |
target:abbb:xxx | ❌ しない | ❌ しない |
target:aaabbb:xxx | ❌ しない | ❌ しない |
bbb:xxxy | ❌ しない | ⭕️ する |
aaa:bbb:xxx | ❌ しない | ❌ しない |
community
,ext-community
,large-community
キーワードで分離.異なるものにマッチしない\d+:\d+
パターンであれば^\d+:\d+$
と解釈.それ以外はそのまま
Quagga
- 正規表現(横) がマッチ対象(縦) にマッチするか
- アルファベットはBGP Community を10進で表現したときの1ケタ.4ケタ = 2Bytes,6ケタ = 4Bytes
community-list
の例.ほかにextcommunity-list
,large-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-list
,extcommunity-list
,large-community-list
キーワードで分離.異なるものにマッチしない- そのまま正規表現マッチ
Large BGP Community に対する懸念
2バイトの5ケタAS事業者が^ccccc:xxx$
と書くべきところを「ふつう2Bytes
:2Bytes
だし」とサボってccccc:xxx$
と書いてしまった場合に,意図しないLarge BGP Community にマッチして誤動作しないかを気にしていた.aaa:ccccc:xxx
やaaa: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:手元に古いのしかなかった 😭