技術コラム

製品技術
NVIDIA

OpenFlow検証レポート

OpenFlow検証レポート

1. 初めに
Ethernetがこの世に発表されて、来年9月には40周年を迎えます。
商用システムの転送速度は10Mbpsから100Gbpsへ高速化され、小型ノートブックPCへも1GbpsのEthernet Portが標準で搭載されています。
EthernetはISO OSI(Open System Interconnection)の第2層(L2)のData Link Layerを規定したもので、当初“イエローケーブル”と呼ばれた同軸ケーブルが使用されており、しかも最大2.5kmの範囲で展開することが出来ました。ノード数を増やすためには、同軸ケーブルにトランシーバを取り付けるのですが、1ノード当たりの設置コストは当時数十万円程で、ノード数も限られておりました。低コスト化を図るために、オフィスに張り巡らされた電話用のケーブルが使用できないかと考えた人がいました。当時、米国では、オフィスビルの建設にあたり、今後増えるであろう必要な電話回線を予測し、1回線ごとに敷設よりは、余分にケーブルを敷設する方がコストが低かったようです。ここで、ケーブル上で分散するというよりは、交換機を中心とした電話システムと同じように、ハブ(HUB)を設置することにより、接続するノード数を増やすという事が簡単に可能となりました。ただし、この段階では、一つのノードから送られたパケットは、他のすべてのノードへ転送されの衝突が発生するもので、しかも半二重動作(同時に送信か受信かどちらかしかできない)接続ノード数が増えたりネットワーク負荷をかける割合が大きくなると、伝送性能も不安定にしたり、伝送スピードも上げられないという事態になりました。

2. Bufferedハブの出現、そしてスイッチへ
Ethernetは、当初パケットの衝突が発生することを前提として設計されており、ネットワークの規模が大きくなると、衝突検出後の再送信処理により性能低下が問題となりました。ここで、送信されたパケットは、パケット衝突することなく受け入れられるように、ハブにバッファを持つようになりました。ただし、通常のハブ同様、全ノードへ送信パケットが送出されるというものでした。この段階で、各ノードは全二重通信が可能となりました。これにより、衝突による再送信は無くなりましたが、ネットワークの負荷によっては、性能低下を免れることはありませんでした。
Ethernetは、各ノード固有の48ビットのMACアドレスを持っています。従来全ポートに送信パケットが出力されていましたが、どのポートにどのMACアドレスを持ったノードが接続されているかという情報を知ることで、特定のポートに送信パケットを出力するスイッチが出現しました。これにより、Ethernetと言いながら、衝突しないL2スイッチが出現したのでした。
余談ですが、よくよく調べてみたら、本来スイッチとは交換機という意味でした。
その後、L3, L4に関する標準が提起され、様々なネットワークサービスが展開されてきました。また、多数のネットワーク製品メーカーは、競って新たな標準を採用し、機能を追加してきました。依って、ネットワーク機器ベンダーの選択や複数のベンダーを跨るネットワークシステム/サービスの管理機構も複雑化してしまいました。

3. OpenFlowの出現
ユーザが複雑化した個々のスイッチを管理するというよりは、種々のネットワーク機器を1つの制御装置で集中管理して複雑な転送制御を行ったり、柔軟にネットワーク構成を変更できるようなテクノロジーが必要になってきました。そこでONF(Open Networking Foundation)が標準化を進めているOpenFlowが出現したわけです。
殆どのネットワーク機器は、機能として大きくは2つの機能、経路制御機能(Control Plane)とデータ転送機能(Data Plane)に分けられます。従来のネットワーク機器は、この2つの機能は一体化されユーザから見えるのは、経路制御機能であり、あるポートから入った特定のパケットをどのポートに出すかというユーザが指定することはできませんでした。
OpenFlowでは、「経路制御の機能」と「データ転送の機能」を分離させ、「OpenFlowコントローラ」と「OpenFlowスイッチ」により構成されます。

OpenFlow 検証レポート#1

OpenFlow コントローラは、複数のOpenFlow スイッチの動作を一括して管理することができます。
ネットワーク管理者は、各OpenFlow スイッチの動作を記述したフローテーブルを作成し、OpenFlow コントローラによりOpenFlow スイッチへ配送されます。OpenFlow スイッチはフローテーブルに基づき、データの転送、破棄を実行します。これらは、フローレベルで記述され、パケットに応じて、OpenFlow スイッチの物理ポート番号、送信元・宛先MACアドレス、VLAN ID、MPLSラベル、送信元・宛先IPアドレス、TCP/UDP ポート番号により経路設定することができます。

OpenFlowコントローラは、複数のOpenFlowスイッチの動作を一括管理可能
 
4. Mellanox EthernetスイッチによるOpenFlowの実現
Mellanox SN2xxxシリーズスイッチは、Mellanox 独自の経路制御機能であるMellanox Onyx™ は、OpenFlow v1.3に準拠したOpenFlowスイッチの機能を提供しています。OpenFlowコントローラとしては、ODL、ONOS、FloodLight、RYU等で使用可能です。

Mellanox のOpenFlow スイッチは、ハイブリッドモデルを採用しており、OpenFlow パイプラインと通常パイプラインからなります。このモデルでは、OpenFlow 構成、パケットのパラメータに一致したパケットが転送されることになります。 もし一致しなければパケットは通常モード(通常転送/ルーティング)パイプラインで処理されます。
 
OpenFlow 標準は次のように規定しています。

“OpenFlow – ハイブリッドスイッチは、OpenFlow 動作と通常のEthernetスイッチング動作、 VLANによる隔離、L3ルーティング(IPv4ルーティングや、IPv6ルーティングなど)、ACLそしてQoSプロセッシングなどの従来のL2 Ethernetスイッチング、の両方をサポートします。これらのスイッチはOpenFlow の外で OpenFlow パイプラインか通常パイプラインのどちらになるか分類する機能を提供しなければなりません。例えば、スイッチは、一方のパイプラインを使うか、またはすべてのパケットをOpenFlow パイプラインで使用するかを決めるのにVLANタグや、パケットの入力ポートを使います。”

ハイブリッドスイッチ/ルータに予め組み込まれた機能を活用することは、ハイブリッドモードの利点を享受することでもあります。これらは、ネットワーク性能及び効率、より早い新しいフロー処理を低い負荷で処理することができます。ハイブリッドスイッチはOpenFlowではないデータも管理制御プレーンを通して管理することができ、また純粋なOpenFlowスイッチと比較してより効率的かつリソースの有効活用が可能となります。
フローテーブルはパケットの参照、変更及び転送を実行するフローにより構成されます。各々のフローは12のタプルキーであり、キーは実際のフロー中でのパケットの分類に使用されます。キーは、次のようなフィールドからなります: ingress port, source MAC, destination MAC, EtherType, VLAN ID, PCP, source IP, destination IP, IP protocol, IP ToS bits, TCP/UDP source port and TCP/UDP destination port.
これらのフローキーは、各フィールドが特定の値か、キーの一部分を無視するワイルドカード設定することも可能です。
各々のパケットはフローテーブルを通じて、一度でも条件が一致した場合、スイッチは、OpenFlow コントローラにより特定のフローに設定されているアクションを実行します。
フローテーブルを常に最新状態にすることで、スイッチはフローテーブル内のエントリを検索し入力されたトラフィックを目的の場所に転送することを可能にします、 OpenFlow スイッチは、入力トラフィックの特定フィールドに一致するエントリがあるかどうかをチェックしたり、またはワイルドカードにより一部の条件を無視したりします。もしそのエントリーが存在する場合、スイッチはフローエントリに付属するアクションを実行します。  フローエントリト一致しないパケットは、通常のパイプラインへ転送されます。(ハイブリッドスイッチ)

各々のフローエントリーは、下記のパラメータのいずれかになります。
1. 各々のエントリーごとに一致するかどうか確認のために使用されるヘッダ部分が特定の値か、または、ワイルドカードによるすべてのエントリの一致してからの操作を規定します。
2. 統計計目的に有用なパケットカウンタと一致してからの操作を規定します
3. 一つのフローに関わるパケットの特定の操作を規定します。
(ア) パケットの転送
(イ) パケットのドロップ
(ウ) OpenFlow コントローラへのパケット転送
(エ) VLAN値の変更、VLANの優先度(PCP)、及び/またはVLANヘッダの剥ぎ取り等

Mellanox OnyxとOpenFlowのパイプライン

OpenFlow 1.3パイプラインでは、次表のようなマッチングルール、アクションを行うことができます。各ルールは、1つのフローで併記することにより、複数の条件の設定することができます。

OpenFlow 1.3 Pipeline Capabilitiesサマリー表
OpenFlow 1.3 Pipeline Capabilitiesサマリー表

Mellanox スイッチはハイブリッドモードで使用できますので、Onyx 内のOpenFlow機能により、OpenFlowコントローラを使用することなく、OpenFlowスイッチとして使用することも可能です。

以下に、そのセットアップ方法を示します。

IP Routing を Enableにする
ip routing vrf default

OpenFlowをEnableにする。
protocol openflow

セット内容の確認
show openflow

OpenFlow Version: OpenFlow 1.3
Datapath ID: 0000248a07c87b40

Controllers Information:
————————————————————————————
Controller State Role Changed (sec) Last Error
————————————————————————————

Mapping of OpenFlow ports to their OpenFlow numbers:
————————
Interface OF-Port
————————

(There are no OpenFlow ports.)
switch-a807ac [standalone: master] (config) # show protocols
Ethernet: enabled
spanning-tree: rst
lacp: disabled
lldp: disabled
igmp-snooping: disabled
mld: disabled
ets: enabled
priority-flow-control: disabled
sflow: disabled
openflow: enabled
mlag: disabled
isolation-group: disabled
ptp: disabled
nve: disabled
dot1x: disabled
telemetry: disabled

IP L3: enabled
bgp: disabled
pim: disabled
vrrp: disabled
ospf: disabled
bfd: disabled
magp: disabled
dhcp-relay: disabled
dhcp-relay(v6): disabled

使用するポートの設定
interface ethernet 1/1-1/4 openflow mode hybrid

OpenFlowが有効になったポートは何も設定されていないと通信できなくなります。

OpenFlow Controllerの起動
openflow controller-ip 10.209.0.205 tcp-port 6633

OpenFlow設定

Case 1. IPアドレスでの制御 特定のSource IP、Destinationアドレスを持つパケットのみを通す

1) Port 1/1に入ってきたIP:192.168.20.103からのパケットをPort 1/4ポートへ出力します。
openflow add-flows 2 priority=5000,dl_type=0x800,
in_port=Eth1/1,nw_src=192.168.20.103/32,nw_dst=239.0.1.2/32,actions=output=Eth1/4

2) Port 1/4に入ってきたIP:192.168.20.200からのパケットをPort 1/1へ出力します。
openflow add-flows 1 priority=5000,dl_type=0x800,
in_port=Eth1/4,nw_src=192.168.20.200/32,nw_dst=192.168.20.103/32,actions=output=Eth1/1

3) Port 1/1か1/4に入ってきたIP:192.168.20.0同士のパケットは、1/1か1/4ポートへ互いに出力する
openflow add-flows 1 priority=5000,dl_type=0x800,
in_port=Eth1/4,nw_src=192.168.20.0/24,nw_dst=192.168.20.0/24,actions=output=Eth1/1

openflow add-flows 2 priority=5000,dl_type=0x800,
in_port=Eth1/1,nw_src=192.168.20.0/24,nw_dst=192.168.20.0/24,actions=output=Eth1/4

Case 2. MACアドレスでの制御 特定のMACアドレスを持ったパケットのみを流す。
例としてNode A MACアドレス 24:8A:07:11:45:7C
Node B MACアドレス 24:8A:07:17:9C:20

Port1に入ってきた24:8A:07:11:45:7CからIP:192.168.20.200/24へのパケットははPort4へ出力する
openflow add-flows 1 priority=5000,dl_type=0x800,
in_port=Eth1/1,dl_src=24:8A:07:11:45:7C,nw_dst=192.168.20.200/24,actions=output=Eth1/4

Port4に入ってきたMAC:24:8A:07:17:9C:20からIP:192.168.20.200/24へのパケットはPort4へ出力する。
openflow add-flows 2 priority=5000,dl_type=0x800,
in_port=Eth1/4,dl_src=24:8A:07:17:9C:20,nw_dst=192.168.20.0/24,actions=output=Eth1/1

各種設定の削除は次の様なコマンドを実行します。
openflow del-flows X(ID番号)

以上、OpenFlow 1.3 Pipeline Capabilityサマリ表のMatchおよびActionsの組み合わせでいろいろな制御ができます。
是非いろいろとお試しください。