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:手元に古いのしかなかった 😭