アクセスカウンタ

テーマ「ネットワーク」の記事 RSS

トップへ

初めての人のためのインターネットルーティング

2014/11/11 17:57
ネットワークエンジニアのつちやです。

「レバーを食べると翌日元気になる」という自己分析のもと、この一年間毎晩のようにレバーを食べていますが、
実際のところ真偽は知りません。

さて、Internet Week 2014という技術系のイベントの中の
「初めての人のためのインターネットルーティング」というプログラムで発表します。
https://internetweek.jp/program/t04/

このプログラムは、私がプログラム委員の一人としてイチから企画させていただいたプログラムだったりします。

インターネットを運用しているネットワークエンジニアにとって、現場で使われる技術やインターネットの仕組みの話、または企業間に発生するビジネス慣習などを教えてくれる場というのは、実はあまり用意されていません。

プログラマやサーバエンジニアと比較しても、そもそもネットワークエンジニアの絶対数が少ないことから、キーワードをwebで検索して見つかった先駆者たちの記事を参考に問題解決する、ということもあまり多くはありません。ネットワークエンジニアが扱う装置の多くが、一台あたり数百万〜数千万円レベルのものであることも、世間に情報が少ない一因かもしれません。

では、ネットワークエンジニアはどこで学ぶのかというと、ほとんどの場合が現場で学びます。
インターネットの運用現場で専門的な技術や知識と出会い、または自社や他社のエンジニアの先輩方に直接話を聞くことでビジネス的なバランス感覚や、広大なインターネットにおける自身の仕事の役割などを少しずつ理解していき、一人のエンジニアとして成長していきます。

そのため、エンジニアとして一人前に成長するまでにやはりどうしても時間がかかりますし、入社したばかりの若手社員にとっては「なんのこっちゃ」というモヤモヤした状況が数年続きます。

私自身、モヤモヤで不安だらけの日々が長かったので(今もまだモヤの中ですが)、次の若手エンジニアの方やネットワークのことを学ぶ機会が得られなかった方々にとって、ステップアップの助けになればという想いで、今回のプログラムを企画させていただきました。

私のパートは、インターネットやルーティング技術における基礎的な話が中心ですが、一緒に発表させていただくBIGLOBEの先輩エンジニアの川村さんやさくらインターネットの主任研究員の大久保さんのお話は、現役のベテランネットワークエンジニアだからこそ聞ける生々しいノウハウや知見がたっぷり詰まったものとなっています。(会場でしか公開できない情報もあるそうです)

ご興味があれば、ぜひお越しいいただいて、会場でしか味わえない発表者の温度感やインターネットの奥深さを感じていただければと思います。

最後に、私の資料の一部を抜粋して載せておきます。

それではまた。

画像


画像


画像


画像
記事へトラックバック / コメント

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

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

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

(前回記事)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

それではまた!
記事へトラックバック / コメント

GREEさん、Cisco Systemsさんとネットワーク共同検証をしました。

2014/07/31 16:36
はじめまして。ネットワークエンジニアのつちやたいじです。
普段はBIGLOBEのISPネットワークの運用や設計を担当しています。
好きなものはお肉と楽しいこと、嫌いなものはトマトとめんどくさいことです。

今回は、GREEさん、Cisco Systemsさんのエンジニアの方々とBMPという新しいプロトコルを
共同検証しましたので、その内容を紹介します。

GREEさんは言わずと知れた日本最大手のソーシャルサービス事業者さんです。
Cisco Systemsさんは、世界最大級のネットワーク機器メーカさんで、BIGLOBEネットワークでもCisco製のネットワーク機器をたくさん使っています。


インターネットとBGP

みなさんがいつも使っているインターネットは、組織所有のネットワークが無数に繋がり合って構成されています。
この組織所有のネットワーク同士が繋がるためには、お互いのルータ同士でBGP(Border Gateway Protocol)と呼ばれる世界標準のプロトコルを使い、情報をやり取りすることが必要です。

ここでやり取りされる情報の中には、経路情報という、お互いのネットワークが持っているIPアドレスの一覧情報があります。
ルータ同士が経路情報を交換することで、お互いのネットワークに通信できるようになります。
(例えるなら、経路情報とは住んでいる地域の住所一覧が載っているタウンページのようなイメージです。)

画像


そして、世界中の企業ネットワーク同士が、BGPを使って直接/間接的に経路交換することで、
世界中のどこへでも通信ができる仕組みを実現しています。
これがインターネットと呼ばれているものの正体です。


BGPについてご興味がある方は、JPNICさんで紹介されている記事が参考になります。
インターネット10分講座:BGP
https://www.nic.ad.jp/ja/newsletter/No35/0800.html

インターネットそのものについてご興味がある方は、著名なブロガーのあきみちさんが書かれた本が参考になります。
インターネットのカタチ―もろさが織り成す粘り強い世界
http://www.amazon.co.jp/dp/4274068242

BMP

今回共同検証したBMPは、BGP Monitoring Protocolの略で、その名の通りBGPでやり取りされる情報を可視化するためのプロトコルです。

BGPは1990年代から使われているプロトコルですが、BMPはまだ標準化もされていない比較的新しいプロトコルです。
(厳密には、RFCとして標準化される前のInternet Draftという段階で、IETFという団体で標準仕様について現在も議論されています。)

BMPを使うことで、他社ネットワークの経路情報の異常を調べることができたり、本来なら複数のルータにログインして確認しないと把握できないような複雑なトラブルを早期発見することが可能になります。


こういった運用監視やトラブルシューティングの用途で、BMPはネットワークを運用している企業から注目を集めています。

画像


BMP共同検証

検証は、BIGLOBEとCiscoの検証ラボを繋いで、BGP構成を再現して実験しました。

画像


今回の検証では、「若手メンバーで実施してほしい!」というBIGLOBE/GREEのチームリーダーの強い要望(笑)があったため、事前調査や検証の準備などは私も含めた若手メンバー中心でやらせていただきました。
私個人としても、標準化関連の資料を読みながら仕様を確認して新しいプロトコルを実際に検証する、なんてのはこれまでの仕事のなかでも初めてのことだったので大変勉強になりました。

Ciscoさんのオフィスを2週間お借りして、ときには真面目に、ときには差し入れにいただいたアイスを食べて談笑しながら、楽しく検証しました。

他社のネットワークエンジニアの方々と一緒に検証して感じたのは、会社の事業内容が違うことで、検証方法をはじめ、注目するポイントや利用シーンで異なる部分が多いことであり、
自分たちとは異なった物の捉え方があることを身をもって体感しました。
今回の検証を通して、会社内で仕事しているだけではなかなか感じることができない貴重な経験をさせていただきました。
画像

画像

画像


BMP検証結果

実際にプロトコルの挙動を確認してみたところ、BMPは「なかなか使えそうなログ収集ツール!」という印象でした。
BGPが切断されたときの原因などもきっちりログとして出力してくれたり、今までは見れていなかった経路情報なども時系列データとして収集できたりします。
またデバックコマンドのようなルータに与える負荷が大きいコマンドを実施せずとも、上記のようなBGPの詳細情報を1台のサーバで収集することが可能になります。

いままで出来てなかったことや、苦労して取得していたデータが、ひとつのプロトコルで、さらにマルチベンダ環境でも差分なく取得できるという点で運用者にとって使い勝手の良いプロトコルであると感じています。


ただ、BMPにはひとつ大きな問題がありまして。。。


それは、BMP受信を実装しているサーバサイドのソフトウェアが、現状ではまともに動作するものが無い!ということです。
いくつか検証で、web公開されているBMPサーバを試したのですが、いずれも最新版BMP version3では期待した動作はできませんでした。
今回の共同検証もこれらのツールをアテにしていたため、このような現状を知り、いきなり落胆からスタートしましたが、特別にCiscoさんが社内での検証で利用されている内製ソフトウェアを提供してくださり、無事に検証することができました。

この記事を読んでいただいた方の中から、ソフトウェア開発が得意な方で、BMPサーバを実装していただける方が出てくると、とてもうれしいです。
おそらく、ネットワーク業界から歓喜の声が沸き上がるのではないでしょうか。

JANOG34で発表してきました

日本中のネットワーク技術者が一同に集うJANOG Meetingというのイベントがあるのですが、
そこで時間をいただいて、このBMP検証について紹介させていただきました。
具体的な検証内容についてはこちらで紹介していますので、ご興味あればご参照ください。

JANOG34 Meeting ルーティングテーブルを覗きたい┃_・)ジー
http://www.janog.gr.jp/meeting/janog34/program/rtabl.html

ネットワーク業界の猛者のみなさんの前で発表するのは、とてもとても緊張しました。。。
それでも、いざ発表してみると、好印象なコメントをいただけたり、研究者の方やキャリア事業者さんなど、いろんな立場の方からアドバイスをいただけたので、非常に参考になりました。

またJANOG Meetingでは、慰労会と呼ばれる発表者を集めて飲み明かす怪しい(?)イベントがあるのですが、そこでもJANOGスタッフの方や他のプログラムの発表者の方といろんな意見交換をさせていただきました。中には「BMPサーバ作りますよ」なんていう心強いメッセージをいただけたりして、発表してよかったと心から感じました。

画像


最後に

今回はBMPというモニタリングプロトコルそのものの動作検証でしたが、BMPにおける私の考えとしては、「BMP受信サーバをいかに作り込んで実装させるか」、そして「自動化ツールと連携することで、ネットワーク運用をいかに楽にできるか」という点がキモになるのではないかと感じています。
ネットワークエンジニアはプログラミングが苦手な方が多かったりするのですが(もちろん私もその一人です)、BMPのような使い勝手の良いプロトコルをうまく取り入れて自分自身の仕事を楽にし、さらに仕事が楽しくなるようなツールの開発もやっていきたいと思っています。

また他社のエンジニアの方と一緒に仕事をすることは、慣れた作業の中でも新しい知見を得られることがたくさんあり、自身の知識や技術力を見直す良い機会になります。
それと同時に、新技術の利用シーンを複数の視点から議論することで、自分たちだけでは発想できなかったような便利な使い方を発見できるかもしれません。

これからもこういった社外の方と一緒に仕事するような機会を積極的に作ることによって、今までになかったような良いモノや仕組みを作り、日本のインターネットに少しずつ貢献していければと考えています。
記事へトラックバック / コメント

トップへ