こんな夜中にOpenFlowでネットワークをプログラミング!

第6回 NOXを使って独自のOpenFlowコントローラを実装してみよう!~パケットアウト編

この記事を読むのに必要な時間:およそ 6 分

はじめに

今回も,前回に引き続き,オープンソースで提供されているNOX(OpenFlowコントローラ)上で動作するNOXモジュールの実装方法を説明します。

オープンクラウドキャンパス

先に,8月2日に開催された「オープンクラウドキャンパス」という勉強会で,OpenFlowについて説明してきましたので,そのときの様子を紹介します。OpenFlowに取り組むNTTデータ,NEC,Citrix,Fusionの4社がそれぞれの視点で話をしています。他にMidonetやVyattaの紹介もありました。質疑応答の時間が十分にあったとは言えない状況でしたが,OpenFlowの本質は「プログラマブルである」など,深い指摘があったのが印象的でした。

最近は雑誌などでOpenFlowが取り上げられる機会が増えています。OpenFlowへの注目も高まっており,SDN(Software-Defi ned Network)技術を推進するONF(Open Networking Foundation)に参加する企業は,新たにIntel,Extream Networks,富士通,OpenFlowベンチャーなどが加わり,43社まで増えています(2011年8月12日現在)⁠また,OpenFlowを用いて複数のデータセンターを仮想的に1つのデータセンターとして見るデータセンター間でライブマイグレーションを行うといった取り組みも行われています。

今回の開発で使用する構成

今回開発するNOXモジュールは,図1に示す構成で動作させます。これは第4回で構築した環境と同じですが,サーバ2のIPアドレスが異なっているので注意してください。

図1 OpenFlowの動作環境

図1 OpenFlowの動作環境

開発するNOXモジュールの仕様

今回開発するNOXモジュールの仕様を以下に示します。OpenFlowらしく,一般的なネットワーク装置では実現できない仕様にします。

  • OpenFlowコントローラがOpenFlowスイッチを検出したとき,スイッチに接続されているサーバ1とサーバ2のMACアドレスを取得するため,スイッチからサーバに対してARP要求パケットを送信する
  • OpenFlowスイッチがサーバからARP応答パケットを受信した場合,ARP応答パケットからサーバのMACアドレスを取得し,スイッチの物理ポートの先に接続されているサーバのMACアドレスを取得する
  • NOXが制御するOpenFlowスイッチは1台とする。2台以上検知した場合は,エラーをコンソールに表示する。新しく検知されたスイッチは一切管理せず,存在しないものとして扱う
  • OpenFlowスイッチは,サーバからOpenFlowルータ宛のARP要求パケットを受信した場合,OpenFlowコントローラ内でARP応答パケットを生成し,サーバに返送する。OpenFlowルータ宛でない場合は,受信したARP要求パケットを破棄する
  • IPv4パケットを受信したとき,サーバ1とサーバ2のMACアドレスを取得できていない場合は受信したパケットを破棄する
  • IPv4パケットを受信し,かつサーバ1とサーバ2のMACアドレスが既知の場合,OpenFlowコントローラ内でパケットがOpenFlowルータを通過したのと同じようにMACアドレスを書き換え,コントローラからスイッチ経由でパケットを送出する
  • ARPでもIPv4パケットでもない場合は,パケットを破棄する

OpenFlowプロトコルとパケットアウトの関係

前回は,OpenFlowスイッチに制御ルールを書き込むことでパケットの転送を実現しました。今回は,OpenFlowコントローラ内で書き換えたパケットをスイッチ経由でサーバに対して送出する方法でパケットを転送します(パケットアウトとも呼びます)⁠パケットアウトを行うときに利用するOpenFlowプロトコルのメッセージやイベントの関係を図2に示します。

図2 パケットアウト処理時のシーケンス図

図2 パケットアウト処理時のシーケンス図

パケットアウトを行う場合はOpenFlowスイッチに制御ルールを書き込まないため,同じパケットを受信した場合は再びOpenFlowコントローラにPacketInメッセージが送信されることに注意してください。

  • ① サーバ1はサーバ2に対してPingパケットを送信する
  • ② 未知のパケットを受信したOpenFlowSwitchは,受信したパケットを自身のバッファに格納する。そして,PacketInメッセージをNOXに対して送信し,パケットの制御方法を問い合わせる
  • ③ NOXはPacketInイベントを発行し,OpenFlowSwitchが新しいパケットを受信したことをNOXモジュールに通知する
  • ④ NOXモジュールは,OpenFlowスイッチが受信したパケットを必要に応じて書き換える(OpenFlowスイッチが受信したパケットは,PacketInメッセージやPacketInイベントを通してNOXモジュールまで届けられる)
  • ⑤ NOXモジュールは,書き換えたパケットを送信するようにNOXに対して指示する
  • ⑥ NOXは,コントローラから送信されたパケットをサーバ2に送信するようにOpenFlowSwitchに対して指示する
  • ⑦ OpenFlowSwitchは,コントローラから受信した書き換え済みのPingパケットをサーバ2に送信する

著者プロフィール

樋口晋也(ひぐちしんや)

(株)NTTデータ 技術開発本部

コメント

コメントの記入