Raspberry Piで OpenFlow動作を確認してみました
2014.2.22 @ttsubo
ARMボードもくもく勉強会
自己紹介
2
・通信事業者向けネットワークエンジニアをやってます。 ・最近は、データセンタ系ネットワーク技術動向に興味があり、 OpenStack等のIaaS管理基盤技術を勉強中。 ・さらに、「これからの時代、ネットワーク屋も、プログラミ ング必要だよね。」という風潮に感化されて、OpenFlow プログラミングも勉強中。
@ttsubo
動機付け
3
・OpenFlowスイッチを安価に手に入れたいRaspberry Pi
+FlowForwarding.org
LINC-Switch
=OpenFlow1.3
Raspberry Piとは?
4
「Raspberry Pi」は、イギリス生まれで低価格のPCボード。名刺サイズと小型ながら、組み込みシステムのコントローラーとしてはもちろん、サーバーとしても十分な性能を備える。GUIベースのOS(Linux)も動き、デスクトップPCとしても、テレビのセットトップボックスとしても使用できる。2013年7月時点で世界で120万台が出荷された、人気ボードとなっている。
IT Proより引用 http://itpro.nikkeibp.co.jp/article/COLUMN/20130919/505592/
LINC-Switchとは?
5
・オープンソースベースのOpenFlowスイッチ
・OpenFlow v1.2/1.3.1とOF-Config1.1をサポート ・OFプロトコルをサポートするどのOpen Flowコントローラ とも動作可能
6
http://ttsubo.hatenablog.com/entry/2014/02/16/221417
以下のブログ記事を参考にしてください
Ryu SDN Frameworkを活用した簡易ルータ機能の作成(7) ~IPルーティング基本編~
OpenFlow動作確認方法
7
FlowMod
OpenflowRouter
Rest-clientInterface設定 Gateway設定
Flowテーブル
PortTableArpTable
REST-IF
LINC-Switch(OFS)
PC-B
192.168.101.1
PC-A
192.168.100.1
OpenFlow簡易ルータの概要
OpenFlow動作の確認結果
8
PC-A PC-BFlow テーブル
FlowMod を用いたFlowエントリ 書き込み処理は正しく動作した
Packet-out を用いたパケット送出処理は正しく動作した
Flowエントリにマッチしない 未知パケットのPacket-in 処理は正しく動作した
Flowエントリに従った Forwarding 処理は正しく動作した
SecureChannel は正しく開設できた
OFC
!
OpenFlow化したRaspberry Piで簡易ルータを実現して みて、期待どおり、動作できました!!
LINC-Switch(OFS)
注意事項
9
Rest-clientREST-IF
LINC-Switch(OFS)
OpenflowRouter
FlowMod
OFSには、スイッチIDとしてdpid(通常は自動付与)を 変更する場合、of_configを活用する必要があります。
dpid
OFSを区別するdpidは 自由に変更したい
参考)LINC-Switch上での設定方法
10
(linc@LincSwitch)1> {ok, C} = enetconf_client:connect("localhost", [{port, 1830}, {user, “linc"}, {password, "linc"}]). (linc@LincSwitch)1> linc_ofconfig:get_switch_state(0). !(linc@LincSwitch)1> Controller = {controller, [{id, ["Switch0-DefaultController"]}, {'ip-address', ["192.168.0.100"]}, {port, ["6633"]}, {protocol, ["tcp"]}]}, (linc@LincSwitch)1> Config = {'capable-switch', [{xmlns, "urn:onf:of111:config:yang"}], [{id, ["CapableSwitch0"]}, {'logical-switches', [{'switch', [{id, ["LogicalSwitch0"]}, {'datapath-id', ["00:00:00:00:00:01:00:00"]}, {enabled, ["true"]}, {controllers, [Controller]}]}]}]}. !(linc@LincSwitch)1> {ok, Y} = enetconf_client:edit_config(C, running, {xml, Config}). !(linc@LincSwitch)1> linc_ofconfig:get_switch_state(0).
OFS起動プロンプト上でのコマンド投入例