エンタープライズ ソリューション カンファレンス～IT Technical Seminar V15～ (2014)

SDNフレームワークの解説と、OpenFlowコントローラのプログラミングおよび実演

2014年6月20日
株式会社オープントーン
金融ソリューション事業部
菱野孝史

アジェンダ●

第一部

SDN/OpenFlowとは– OpenFlowの仕組み– OpenFlowによるパケット転送の流れ
–

●

第二部

OpenFlowのアプリを作るには– OpenDaylight– FrameWorkとしてのOpenDaylight
–

●

第三部
–実演

SDNとは･･･ググってみるとネットワークの構成、機能、性能などをソフトウェアの操作だけで動的に設定、変更できるネットワーク、あるいはそのためのコンセプトを指す

ネットワークを構成する通信機器などをソフトウェアで一括して制御することで、利用者の目的に応じてネットワークの構造、構成、設定などを柔軟に変更できる技術の総称

個々のネットワーク機器にそれぞれコンフィグレーションするのではな
く、各装置を集めたネットワーク全体を一つの単位として、一括で制御するという考え方

SDNとは･･･つまりソフトウェアを用いてネットワーク機器を動的に制御する技術。
●
ネットワーク機器の機能を「コントロールプレーン」と「データプレーン」に分離。
●
コントロールプレーンの機能を「コントロールレイヤ」として一元化することにより、複数のネットワークデバイスを集中的に制御する。
●

SDNとは･･･つまりコントロールプレーン（コントローラ）

一台のコントローラーから複数のネットワーク機器をアプリケーションで集中制御
データプレーン（ＮＷ機器）

SDNは何がイイのか？
ネットワーク全体を俯瞰しながらVLANの設定ができる。ようになりそう。
●
ネットワーク機器の制御を比較的自由にカスタマイズできるため、ネットワークの効率的な利用ができるようになるかも知れない。
●
Oracleなど、各社からSDN対応機器が出てきそう。⇒主にネットワークの仮想化にSDN技術を用いる方向のよう。
●

それでは、OpenFlowとは？
SDNにおけるネットワーク機器の制御プロトコ
ル●
ネットワーク機器の外部にあるコントローラから、プログラムによってパケットの制御をすることができる。
●
複数のネットワーク機器を1つのコントローラから集中的に制御することができる。
●
プロトコルの範囲内で、比較的自由なパケット制御（フロー制御）ができる。
●

OpenFlowの仕組み●

通信トラフィックは「フローエントリ」という形で扱う。
–

フローエントリは次の3つのフィールドを持っている。
●

ヘッダフィールド– OpenFlowスイッチが受信したトラフィックの要素を格納– トラフィックの制御に使用する

●

カウンタ

– 発生/処理したトラフィックをヘッダフィールドの要素ごとに集計した値

●

アクション

– トラフィックに対する処理を定義する

OpenFlowの仕組み●

トラフィックの制御はヘッダフィールドとアクションで実施する

OpenFlowの仕組み●

ヘッダフィールドの要素フィールド意味

Ingress Port

トラフィックの入力ポート番号

Ethernet source address

トラフィックの送信元MACアドレス

Ethernet destination address

トラフィックの宛先MACアドレス

Ethernet type

Ethernetの種類

VLAN id

VLAN ID

VLAN priority

VLAN PCP(Priority Code Point)

IP source address

送信元IPアドレス

IP destination address

宛先IPアドレス

IP protocol

トランスポート層のプロトコル種別

IP ToS bits

ToS(Type of Service)（優先度）

Transport source port / ICMP Type

送信元ポート番号

Transport destination port / ICMP Code

宛先ポート番号OpenFlowの仕組み
●

アクション

フィールド

意味

Enqueue
Drop

ポートに設定されたqueueを通してパケットを転送する
queueの設定によってQoSを実現できるパケットを転送せずに破棄する

Modify-Field

パケットの特定のフィールドを書き換える

Forwardパケットを物理ポートおよび仮想ポートへ転送する

OpenFlowのプロトコル●

コントローラとスイッチ間でやり取りする
メッセージ

コントローラ⇒スイッチ

スイッチ⇒コントローラ

メッセージ

内容

メッセージ

Modify-State

スイッチのフローテーブルにフローの追加削除修正を行う※フローにはヘッダフィールドのマッチングルールとアクションが格納される

Packet-in

Send-Packet

指定されたポートからパケットを送出するようにスイッチに指示を出す
フローテーブルやポートなどの統計情報を取得する

Read-State

内容

スイッチがパケットを受信した際にコントローラへ通知するメッセージ
コントローラは、受け取ったメッセージを解析して処理を決定する
Port-status Read-Stateに対して、統計情報を返却する

OpenFlowでのパケット転送の流れ①ヘッダフィールドの要素ごとにマッチングルー
ルを規定
マッチングルール１

フィールド

設定値

Ingress Port

1

Ethernet source address

00:11:11:11:11:11

Ethernet destination address

00:22:22:22:22:22

VLAN id1

マッチングルール2

フィールド

設定値

Ingress Port

2

Ethernet source address

00:33:11:11:11:11

Ethernet destination address

00:33:22:22:22:22

VLAN id2

OpenFlowでのパケット転送の流れ②マッチングルールにアクションを規定
マッチングルール
マッチングルール1
マッチングルール2

アクション
パケットはポート3から転送
パケットはポート4から転送

OpenFlowでのパケット転送の流れ
スイッチの動作●

マッチングルール

アクション

マッチングルール1

パケットはポート3から転送

マッチングルール2

パケットはポート4から転送②処理方法を問い合わせ(Packet-in)①パケット受信③転送ルール書込(Modify-State)④処理方法受取(Send-Packet)⑤パケット転送SDN/OpenFlowのアプリを作るには●いくつかOpenFlowに対応したFrameWorkが出てきています。
NOX(C++)– POX(Python)– Ryu SDN FrameWork(Python)– Floodlight(Java)– Trema(Ruby)– OpenDaylight(Java)–

OpenDaylightLinux Foundationの下でのオープンソースソ
フトウェアプロジェクト。
●
SDNフレームワークであると同時に、SDN管理機能を持っている。
●
OSGiを用いて開発されたSDNコントローラの管理も可能。
●

OpenDaylightとはOpenDaylightで何ができるのか
OpenDaylight対応機器で構成されたネットワークの全体を管理することが可能。
●
OpenDaylight自身にフローコントロールの機能が実装されており、パケットの制御をカスタマイズできる。
●
OpenFlowに対応しており、OpenFlowのFrameWorkとして利用可能。
●

FrameWorkとしてのOpenDaylight●

Base Network Service Function–

Java Class

バンドル
arphandler

API
IHostFinder

hosttracker

IfptoHostswitchmanager

ISwitchManager

topologymanager

ITopologyManager

usermanager
statisticsmanager

IUserManager
IStatisticsManager

説明
ARPを処理してホストの場所を学習する
SDN上でホストの相対的な場所を追跡する
コントローラ内のすべてのスイッチのインベントリを保持する
ネットワーク全体のトポロジを保持する
ユーザ管理を担う
IReadServiceを利用して統計情報を収集する

FrameWorkとしてのOpenDaylight●

Service Abstraction Layer–

Java Class

バンドル
sal

API
IReadService

sal

ITopologyService

sal

IFlowProgrammerS スイッチに対してフローエントリのervice
追加更新削除を行う
IDataPacketService パケットデコード等、パケット操作を行う
IListenDataPacket パケット処理のためのクラス
このクラスを継承してコントローラクラスを作成する
IStatisticsManager システムにインストールされているバンドルをUIから管理する

salsalweb

説明
スイッチのフロー/ポート/キューのビューを取得する
トポロジメソッドFrameWorkとしてのOpenDaylight●

Service Abstraction Layer–

JavaのClass

バンドル
sal

ClassAction

説明
OpenFlowのアクション

sal

Match

OpenFlowのマッチ

salIFlowProgrammerS スイッチに対してフローエントリのervice
追加更新削除を行う
IDataPacketService パケット操作のためのサービス
OpenFlowのForwardアクションを発行する
IStatisticsManager システムにインストールされているバンドルをUIから管理する

sal
web

開発・テストツール
OpenDaylight●
OpenWrt●
サンプルコントローラ●

https://github.com/sdnhub/SDNHub_Opendaylight_Tutorial

OpenWrt組み込みデバイス向けのLinuxディストリビューション
●一部の安価な無線LANルータを動かすことができる。
●
OpenWrt向けのOpenFlowがある。
以下のサイトで入手可能。
http://openfow.inthebox.info
●

実演
●

環境
–

OpenFlowコントローラ

CentOS 6.5（Virtual Box 4.3上で動作）●
OpenDaylight Hydrogen●–テストルータ

BUFFALO WHR-G301N●
OpenWrt●
OpenFlow 1.0
●

実演
●

トポロジ
コントローラ
192.168.11.10/24
コントローラ側ポート
192.168.11.1/24

ポート1

ホスト1
192.168.2.1/24

ポート4

ホスト2
192.168.2.2/24

実演●

フロー概要1

IListenDataPacketを継承してL2スイッチの機能を作成する
public class TutorialL2Forwarding implements IListenDataPacket {②③④パケット送出①
ホスト1
MAC 00:11:11:11:11:11⑤
ホスト2
MAC 00:22:22:22:22:22

実演●

フロー概要2

Packt-inでコントローラの処理開始
IListenDataPacketのreceiveDataPacketメソッドが呼び出される。
public PacketResult
receiveDataPacket(RawPacket inPkt) {①
ホスト1
MAC 00:11:11:11:11:11

②

③
④

⑤
ホスト2
MAC 00:22:22:22:22:22

実演●

フロー概要3
MatchとActionを使用して入力パケットに対する処理フローを組み立て、programmerでスイッチに書き込む
byte[] dstMAC= ((Ethernet)formattedPak).getDestinationMACAddress();②③④

Match match = new Match();match.setField( new MatchField(MatchType.IN_PORT,incoming_connector) );match.setField( new MatchField(MatchType.DL_DST,dstMAC.clone()) );List<Action> actions = new ArrayList<Action>();actions.add(new Output(outgoing_connector));Flow f = new Flow(match, actions);
f.setIdleTimeout((short)5);
Node incoming_node = incoming_connector.getNode();Status status = programmer.addFlow(incoming_node, f);①
ホスト1
MAC 00:11:11:11:11:11⑤
ホスト2
MAC 00:22:22:22:22:22

実演●フロー概要4②①
ホスト1
MAC 00:11:11:11:11:11③④

IDataPacketServiceを使用してパケット送出を指示
inPkt.setOutgoingNodeConnector(outgoing_connector);
this.dataPacketService.transmitDataPacket(inPkt);⑤ホスト2
MAC 00:22:22:22:22:22

実演●

フロー概要5②③④

パケット送出①
ホスト1
MAC 00:11:11:11:11:11⑤
ホスト2
MAC 00:22:22:22:22:22

終わりに本セミナーで実演した内容など、SDN/OpenFlow/OpenDaylightに関する記事は、随時弊社ブログに掲載していきます。
ご興味のある方は是非ご覧願います。
http://labs.opentone.co.jp

エンタープライズ ソリューション カンファレンス～IT Technical Seminar V15～ (2014)

ご静聴、ありがとうございました。