BIGLOBEエンジニアブログ

アクセスカウンタ

RSS BMPサーバを実装してくれた救世主があらわれました。

<<   作成日時 : 2014/08/08 10:37   >>

トラックバック 0 / コメント 0

ネットワークエンジニアのつちやたいじです。
嫌いなものはトマトですが、トマトクリームパスタとマルゲリータは大好きです。

さて、以下の記事を投稿させてさせていただきましたが、続報です。

(前回記事)GREEさん、Cisco Systemsさんとネットワーク共同検証をしました。
http://engineer.biglobe.ne.jp/201407/article_1.html


ここでは「BMP受信を実装しているサーバサイドのソフトウェアが、現状ではまともに動作するものが無い!」
と紹介させていただきましたが、

JANOG 34の発表者で、たまたまお知り合いになった
NTTソフトウェアイノベーションセンタの石田 渉さんが


BMPサーバを作ってくれました。JANOG34発表後から一ヶ月足らずで。



というわけで、早速使ってみました。


今回作っていただいたBMPサーバは、SDNフレームワークRyuを利用して実装されています。

Ryu SDN Framework
http://osrg.github.io/ryu/


Ryu BMP Server(と呼ぶのが正しいようです。石田さん曰く) のインストールの手順と使い方は、
石田さんご本人からJANOGメーリングリストにて、このように紹介されています。

==========================================================
使い方は以下のとおりになります。dockerを利用しなくてもgithubからryuをインストールすれば利用可能ですが、dockerを利用する方法が一番簡単だと思います。今流行ですし:)

BMPサーバとなるマシンで

1. dockerのインストール (Ubuntuを想定しています、適宜環境に合わせて下さい)
$ aptitude install docker.io

2. dockerhubからdockerイメージをダウンロード
$ docker pull osrg/ryu

3. ポート11019を外部に公開してコンテナを起動し、bashでコンテナ内にログイン(※)
$ docker run -it --name ryu -p 11019:11019 osrg/ryu /bin/bash

4. bmpサーバを起動(デフォルトでポート11019でlistenします
$ ryu run ./ryu-master/ryu/app/bmpstation.py

あとはルータのBMPサーバの設定をコンテナが起動しているサーバに向ければ、BMPのログを見ることができます。

機能としてはまだBMPのログが吐かれるだけ(しかも見辛い)ですが、
徐々に機能拡張予定です(BMPはver3に対応しています)。
==========================================================
(※)指定するポート番号に11019に限らずに、WELL KNOWNポートでなければ何番でもいいようです。


さっそくLinuxマシンにRyu BMP Serverをインストールして、ルータにBMP設定を入れて動かしてみました。
ルータのBMP設定例はJANOG34の発表資料で紹介しています。

JANOG34 ルーティングテーブルを覗きたい┃_・)ジー BMP共同検証
http://www.janog.gr.jp/meeting/janog34/doc/janog34-rtabl-taiji-2.pdf


実行結果はこのようになりました。
(ログのなかで、BIGLOBEネットワーク情報が含まれる部分はいくつか別の値に差し替えしています。)

<< ルータ Cisco ASR1000(IOS-XE 3.13S) から受信したBMPメッセージ >>

BMPInitiation(info=[],len=6,type=4,version=3)

BMPPeerUpNotification(is_post_policy=False,len=184,local_address='0.0.0.0',
local_port=179,peer_address='0.0.0.0', peer_as=65002,peer_bgp_id='192.168.1.1',
peer_distinguisher=0,peer_type=0,
received_open_message=
BGPOpen(bgp_identifier='192.168.1.1',hold_time=90,len=59,my_as=65002,opt_param=
[BGPOptParamCapabilityMultiprotocol(afi=1,cap_code=1,cap_length=4,length=6,
reserved=0,safi=1,type=2),
BGPOptParamCapabilityRouteRefresh(cap_code=2,cap_length=0,length=2,type=2),
BGPOptParamCapabilityUnknown(cap_code=128,cap_length=0,cap_value='',length=2,type=2),
BGPOptParamCapabilityUnknown(cap_code=64,cap_length=2,cap_value='\x00x',length=4,type=2),
BGPOptParamCapabilityFourOctetAsNumber(as_number=65002,cap_code=65,
cap_length=4,length=6,type=2)],opt_param_len=30,type=1,version=4),
remote_port=60003,sent_open_message=
BGPOpen(bgp_identifier='192.168.1.2',hold_time=180,len=57,my_as=65001,
opt_param=
[BGPOptParamCapabilityMultiprotocol(afi=1,cap_code=1,cap_length=4,
length=6,reserved=0,safi=1,type=2),
BGPOptParamCapabilityUnknown(cap_code=128, cap_length=0,cap_value='',length=2,type=2),
BGPOptParamCapabilityRouteRefresh(cap_code=2,cap_length=0,length=2,type=2),
BGPOptParamCapabilityEnhancedRouteRefresh(cap_code=70,cap_length=0,length=2,type=2),
BGPOptParamCapabilityFourOctetAsNumber(as_number=65001,
cap_code=65,cap_length=4,length=6,type=2)],opt_param_len=28,type=1,version=4),
timestamp=0.0,type=3,version=3)

BMPRouteMonitoring(bgp_update=
BGPUpdate(len=78,nlri=[BGPNLRI(addr='1.0.6.0',length=24),
BGPNLRI(addr='1.0.7.0',length=24)],path_attributes=
[BGPPathAttributeOrigin(flags=64,length=1,type=1,value=0),
BGPPathAttributeAsPath(flags=64,length=26,type=2,value= [[xxxx, 2518, xxxx, xxxx, xxxx, xxxx]]),
BGPPathAttributeNextHop(flags=64,length=4,type=3,value='192.168.1.5'),
BGPPathAttributeMultiExitDisc(flags=128,length=4,type=4,value=0)],
total_path_attribute_len=47,type=2,withdrawn_routes=[],withdrawn_routes_len=0),
is_post_policy=False,len=126,peer_address='0.0.0.0',peer_as=65002,
peer_bgp_id='192.168.1.1',peer_distinguisher=0,peer_type=0,timestamp=0.0,type=0,version=3)

BMPStatisticsReport(is_post_policy=False,len=228,peer_address='0.0.0.0',
peer_as=65002,peer_bgp_id='192.168.1.1',peer_distinguisher=0,peer_type=0,
stats=[{'type': 0, 'value': 0, 'len': 4}, {'type': 1, 'value': 0, 'len': 4}, {'type': 2, 'value': 0,
'len': 4}, {'type': 3, 'value': 0, 'len': 4}, {'type': 4, 'value': 1141, 'len': 4},
{'type': 5, 'value': 0, 'len': 4}, {'type': 6, 'value': 0, 'len': 4},
{'type': 7, 'value': 36098, 'len': 8}, {'type': 8, 'value': 36098, 'len': 8},
{'type': 32767, 'value': '\x00\x00\x00\x00\x00\x00\x03\xe8', 'len': 8},
{'type': 32768, 'value': '\x00\x00\x00\x00\x00\x00\x03\xxx', 'len': 8},
{'type': 32769, 'value': '\x00\x00\x00\x00\x00\x00\x00\xxx', 'len': 8},
{'type': 32770, 'value': '\x00\x00\x00\x00\x00\x00\x03\xxx', 'len': 8},
{'type': 32771, 'value': '\x00\x00\x00\x00\x00\x00\x00\xxx', 'len': 8},
{'type': 32772, 'value': '\x00\x00\x00\x00\x00\x00\x03\xxx', 'len': 8},
{'type': 32773, 'value': '\x00\x00\x00\x00\x00\x00\x00\xxx', 'len': 8},
{'type': 32774, 'value': '\x00\x00\x00\x00\x00\x00\x05\xxx', 'len': 8}],
timestamp=0.0,type=1,version=3)


<< ルータ Juniper MX960(JUNOS 13.3R1.8)から受信したBMPメッセージ >>

BMPInitiation(info=[{'type': 0, 'value': u'This is MX960 BMP message', 'len': 25},
{'type': 1, 'value': bytearray(b'Juniper Networks, Inc. mx960 internet router,
kernel JUNOS 13.3R1.8, Build date: 2014-04-09 21:10:21 UTC Copyright (c)
1996-2014 Juniper Networks, Inc.'), 'len': 151},
{'type': 2, 'value': bytearray(b'MX960'), 'len': 5}],len=199,type=4,version=3)

BMPPeerUpNotification(is_post_policy=False,len=180,local_address='0.0.0.0',
local_port=179,peer_address='0.0.0.0',peer_as=65002,peer_bgp_id='192.168.1.3',
peer_distinguisher=0,peer_type=0,received_open_message=
BGPOpen(bgp_identifier='192.168.1.3',hold_time=90,len=53,my_as=65002,
opt_param=[
BGPOptParamCapabilityMultiprotocol(afi=1,cap_code=1,cap_length=4,length=6,reserved=0,safi=1,type=2),
BGPOptParamCapabilityUnknown(cap_code=128,cap_length=0,cap_value='',length=2,type=2),
BGPOptParamCapabilityRouteRefresh(cap_code=2,cap_length=0,length=2,type=2),
BGPOptParamCapabilityFourOctetAsNumber(as_number=65002,cap_code=65
,cap_length=4,length=6,type=2)],opt_param_len=24,type=1,version=4),remote_port=18772,
sent_open_message=BGPOpen(bgp_identifier='192.168.1.1',hold_time=90,len=59,
my_as=65002,opt_param=[BGPOptParamCapabilityMultiprotocol
(afi=1,cap_code=1,cap_length=4,length=6,reserved=0,safi=1,type=2),
BGPOptParamCapabilityUnknown(cap_code=128,cap_length=0,cap_value='',length=2,type=2),
BGPOptParamCapabilityRouteRefresh(cap_code=2,cap_length=0,length=2,type=2),
BGPOptParamCapabilityUnknown(cap_code=64,cap_length=2,cap_value='\x00x',length=4,type=2),
BGPOptParamCapabilityFourOctetAsNumber(as_number=65002,cap_code=65,
cap_length=4,length=6,type=2)],opt_param_len=30,type=1,version=4),
timestamp=1407320989.0,type=3,version=3)

BMPRouteMonitoring(bgp_update=BGPUpdate(len=102,nlri=[BGPNLRI(addr='xx.xx.xx.xx',length=24),
BGPNLRI(addr='xx.xx.xx.xx',length=24), BGPNLRI(addr='xx.xx.xx.xx',length=24)],path_attributes=
[BGPPathAttributeOrigin(flags=64,length=1,type=1,value=0),
BGPPathAttributeAsPath(flags=64,length=18,type=2,value=[[2518, xxxx, xxxx, xxxx]]),
BGPPathAttributeNextHop(flags=64,length=4,type=3,value='192.168.1.4'),
BGPPathAttributeMultiExitDisc(flags=128,length=4,type=4,value=0),
BGPPathAttributeLocalPref(flags=64,length=4,type=5,value=xxxx),
BGPPathAttributeCommunities(communities=[xxxxxxxxx],flags=192,length=4,type=8),
BGPPathAttributeUnknown(flags=128,length=4,type=9,value='\n\xcd\xxx '),
BGPPathAttributeUnknown(flags=128,length=4,type=10,value='\n\xcd\x01\xxx')],
total_path_attribute_len=67,type=2,withdrawn_routes=[],withdrawn_routes_len=0),
is_post_policy=False,len=150,peer_address='0.0.0.0',peer_as=65002,
peer_bgp_id='192.168.1.3',peer_distinguisher=0,peer_type=0,timestamp=1406883933.0,
type=0,version=3)

BMPStatisticsReport(is_post_policy=False,len=132,peer_address='0.0.0.0',peer_as=65002,
peer_bgp_id='192.168.1.3',peer_distinguisher=0,peer_type=0,stats=[{'type': 0, 'value': 0, 'len': 4},
{'type': 1, 'value': 25, 'len': 4}, {'type': 2, 'value': 0, 'len': 4}, {'type': 3, 'value': 0, 'len': 4},
{'type': 4, 'value': 0, 'len': 4}, {'type': 5, 'value': 1, 'len': 4}, {'type': 6, 'value': 0, 'len': 4}
{'type': 7, 'value': xxxxxxx, 'len': 8}, {'type': 8, 'value': xxxxxxx, 'len': 8}],
timestamp=1407320989.0,type=1,version=3)


おお、BMPメッセージを受信できました!!!


OSS(オープンソース・ソフトウエア)の1stリリースということで、
まだ人間には少し見づらい表示であったり、一部では解析しきれてないところもあるみたいですね。(※)

(※)石田さん曰く、解析しきれてない部分は
BMPのInternet Draft(http://tools.ietf.org/html/draft-ietf-grow-bmp-07)
で表現されている定義が曖昧だったり、メーカ特有の実装があるところのようです。

ネットワークの運用ツールとして使うにはまだこれからな印象ではありますが、
パケット解析ツールとしては既に十分使えるかもしれません。

BMPを活用することで、今までネットワーク運用の中で見逃していた情報を調査することができたり、
ネットワークトラブルの早期発見につなげることができるので、
Ryu BMP Serverの登場は非常に価値のある大きな一歩だと感じます。

OSSとして公開されているので、どんどん磨いて、うまく活用して、賢いネットワーク運用の仕組みに取り入れていきたいですね!


開発者の石田さんも、ネットワーク運用者からのフィードバックやリクエストを
期待されているようなので、気になった方はこちらまでメッセージしていただくのが良さそうです。

ryu-devel@lists.sourceforge.net

それではまた!

テーマ

月別リンク