Tech Sketch Bucket of Technical Chips by TIS Inc.

ネットワーク管理を大きく変えるOpenFlowとは (2)

Pocket

前回の記事 では、OpenFlowの概要と簡単な仕組みについて説明し、OpenFlowを用いることで変わる点、OpenFlowの現状について軽く触れました。

今回の記事では、前回あまり深くは触れなかったOpenFlowによるネットワーク機器の制御の仕組みについて、少し具体的に見ていきます。

OpenFlowの簡単な仕組みのおさらい

openflow_fig2.png

図1. OpenFlowの簡単な仕組み(再掲)

前回の記事でも紹介したように、OpenFlowを採用したネットワークは、「OpenFlowコントローラ」と「OpenFlowスイッチ」という2種類の機器から構成されます。

OpenFlowスイッチは未知のパケットを受け取ると、そのパケットをどのように扱うか、OpenFlowコントローラへ問い合わせます。OpenFlowコントローラはOpenFlowスイッチからの問い合わせを受け取ると、パケットの処理方法を判断してOpenFlowスイッチへ返答します。

この時、このパケットにはこのような処理をしなさいというルールを、OpenFlowでは「フロー」と呼ばれる単位に対して指定します。

OpenFlowにおける「フロー」とは

openflow2_fig2.png

図2. フローとフローエントリ

OpenFlowにおいてフローとは、例えば「宛先TCPポート80番(HTTP)の通信」、「IPアドレスAを持つホストからIPアドレスBを持つホストへの通信」といったような、同じ属性を持つ通信の集合を指します。

OpenFlowコントローラはユーザが定義したフローに対してどのような処理を行わせるかをOpenFlowスイッチに指示し、OpenFlowスイッチはそれをフローエントリという形式で保存しておきます。
具体的には、「指定されたIPからのICMPの通信」は「破棄する」であったり、複雑なものになると「宛先IPがプライベートIPアドレスの範囲で無く、かつ宛先TCPポートが80番(HTTP)の通信」は「宛先IPをプロキシのIPに書き換え、宛先MACアドレスをプロキシへのゲートウェイに書き換えた上で、ゲートウェイにつながる物理ポートから転送する」といった、複数の処理を組み合わせた指定もできます。

このフローエントリは、OpenFlowコントローラが指示した有効期限までの間OpenFlowスイッチのフローテーブルに保存され、OpenFlowスイッチは次回以降、このフローテーブル内のフローエントリに従って同種のパケットを処理することになります。

フローエントリを構成する3つの要素

では、具体的にフローエントリにはどのような情報が含まれており、どのような設定を指定できるのでしょうか。

OpenFlowスイッチのフローテーブルに登録される個々のフローエントリは、Match Fields, Instructions, Countersの3つの要素で構成されています。

openflow2_fig3.png

図3. フローエントリの構成

以下ではOpenFlow ver1.1における、それぞれの要素の内容について簡単に紹介します。
OpenFlow ver1.1の仕様書は以下のサイトの画面右側にある、OpenFlow Specificationから確認できます。
http://www.openflow.org/

Match Fields (フローを識別する条件)

Match Fieldsは、このフローエントリがどのようなフローに対する規定であるかを識別するための条件が書かれた部分です。OpenFlowでは、パケットヘッダに含まれる物理層からトランスポート層までの様々な情報を条件に用いることが出来ます。OpenFlow ver1.1で利用できる項目は以下の通りです。

表1. Match Fieldsで使用できる要素

要素名 概要
Ingress Port パケットの入力物理ポート
Metadata OpenFlowが付与したメタデータ
Ether src 送信元MACアドレス
Ether dst 送信先MACアドレス
Ether type 上位層プロトコルの識別番号 (IP, ARP等)
VLAN id VLAN id
VLAN priority VLAN Priority
MPLS label MPLSのラベル
MPLS traffic class MPLSのトラフィッククラス
IPv4 src 送信元IPアドレス
IPv4 dst 送信先IPアドレス
IPv4 proto/ARP opcode IPv4ヘッダの次に続くフィールドのプロトコル (ICMP, TCP, UDP等)
IPv4 ToS bits サービス種別(優先順位)
TCP/UDP/SCTP src port, ICMP Type 送信元TCP/UDP/SCTPポート, もしくはICMP Type (Echo Request, Destination Unreachable等)
TCP/UDP/SCTP dst port, ICMP Code 送信先TCP/UDP/SCTPポート, もしくはICMP Code (Net Unreachable, Destination Host Unknown等)

さらにOpenFlow ver1.2ではIPv6対応が行われ、IPv6ヘッダに含まれる情報もこのMatch Filedsで利用することが出来るようになっています。

Instructions (フローに対する処理内容)

Instructionsは、Match Fieldsで規定した条件に合致したパケットに対して、どのような処理を行うかが書かれた部分です。1つ1つの処理はアクションと呼ばれ、複数のアクションを組み合わせたものがInstructionsとなります。OpenFlowでは多岐に渡るアクションを自由に組み合わせて実行することができます。代表的なアクションは以下の通りです。

表2. Instructionsで使用できるアクション例

アクション 概要
Output 指定した物理ポートからパケットを転送する
(ALL, CONTROLLER, IN_PORTなどが指定可能)
Drop パケットを破棄する
Group 指定したグループ(ポートを束ねたもの)を通してパケットを転送する
Push-Tag/Pop-Tag VLANのタグやMPLSのタグを付加・除去する
Set-Field パケットヘッダの値を指定したものに書き換える

上記はOpenFlowスイッチ単独で完結できるアクションですが、上記のアクションでは対応できない処理を実行したい場合には、一度パケットをOpenFlowコントローラに送り、OpenFlowコントローラ側で処理を行わせることも可能です。フローの条件に合致するパケットを都度OpenFlowコントローラに送って処理することになるため、遅延やOpenFlowコントローラの負荷を考えると多用はできませんが、OpenFlowコントローラの実装次第で様々なことができる可能性があります。

Counters (フローに関する統計情報)

Countersは、これまでにこのフローエントリが適用された総パケット数や総パケットサイズなど、ネットワークに関する統計情報が記録される部分です。直接ネットワーク機器の制御には関連しませんが、ここに保存された統計情報をOpenFlowコントローラが集約することで、ネットワーク全体の状況を把握する助けになります。保存されている情報には以下のような項目があります。

表3. Countersに保存される統計情報例

Counter Bits
Per Table
Reference count
(active entries)
32
Packet Lookup 64
Packet Matches 64
Per Flow
Received Packets 64
Received Bytes 64
Duration (seconds) 32
Duration (nanoseconds) 32
Per Port
Received Packets 64
Transmitted Packets 64
Received Bytes 64
Transmitted Bytes 64
Receive Drops 64
Transmit Drops 64
Receive Errors 64
Transmit Errors 64
Receive Frame Alignment Errors 64
Receive Overrun Errors 64
Receive CRC Errors 64
Collisions 64

まとめ

今回の記事では、OpenFlowにおけるネットワーク制御の中核となる、フローの内容について簡単に紹介しました。

OpenFlowでは、フローを特定する条件や、フローに合致するパケットへの処理内容を柔軟に設定することができます。
最近ではGoogleがデータセンター間のネットワーク制御にOpenFlowを使用しているといった発表もありました。
また日本でも、 NECのプレスリリース で病院のネットワークにOpenFlowを導入した事例が公表されていたり、 NTTデータのニュースリリース でOpenFlowを使ったクラウドシステムの事例が公表されるなど、OpenFlowの活用事例が出始めています。

OpenFlowはあくまでプロトコルであり、OpenFlowの機能を活かして何を行うかは各ベンダの発想次第ですが、今後OpenFlowを用いた様々なサービスが出てくることが期待されます。

エンジニア採用中!私たちと一緒に働いてみませんか?