Trema を Hack !!

 

 今回は, ちょっと Trema を Hack して遊んでみようという話です.

 Trema ネットワークエミュレータを, 他の OpenFlow コントローラ (POX) で動かしてみました.

 

 OpenFlow コントローラのコードを書いてみて. 動かすには, 次のいづれかを行う必要があります. 

 (1) OpenFlow スイッチを用意して, 物理 OpenFlow ネットワークを用意する

 (2) 仮想マシン + OpenVSwitch で, 仮想 OpenFlow ネットワークを用意する

 (3) OpenFlow に対応したネットワークシュミレータを使う

 

 (1) のように既に自前の OpenFlow ネットワークがあるような恵まれた環境に居るならば, それを使えばいいのですが. 「ちょっと試してみたい」といった場合には, (2) や (3) を行う必要があります.

 (実は他にも FlowVisor といったように, コントローラを仮想化させる選択肢もあるにはありますが. これについてはまた別の機会に... )

 仮想マシンと OpenVSwitch で動かす場合(2). 設定が面倒くさい上に, 複雑なネットワーク環境を構築するのは難しいです.

 OpenFlow に対応したネットワークシュミレータ(3)には, Mininet というのがあったりします. 

 

 Trema では, Trema 自体にネットワークエミュレータ機能が存在するので, わざわざ他の (ドキュメント英語だしよくわからない) シュミレータ等を動かしたり, VM たくさん起動させてネットワークのブリッジ設定を頑張らなくても, 作成したコントローラを簡単に仮想ネットワーク環境で実験できちゃいます.

 Trema ネットワークエミュレータでは, 仮想ホストと仮想スイッチを仮想リンクで接続し, 任意の接続形態で OpenFlow ネットワークを構築することができます. 更に, 仮想スイッチの実装は OpenVSwitch ですが. Ruby 実装の仮想スイッチも使うことができ, さらに仮想ネットワークを物理ネットワークに接続するなんてこともできちゃうみたいです (これに関しては試していません) .

 おまけに, 日本のコミュニティが頑張っているので, こういった 日本語ドキュメントが豊富だったりと, たくさんイイことがあります.

 

 「POX 使ってるんだけど. ネットワークエミュレータだけ使いたい」

 「政治的な理由 (Java 資産を活用するためとか) で Floodlight 使ってるけど. Trema のネットワークエミュレータ使いたい」

 そんなユーザは, 今回の Hack をぜひ試してみてください.

 

 それでは, Trema ネットワークシュミレータを他の OpenFlow コントローラから利用する Hack の方法について見て行きます.

 

 Trema による仮想ネットワークの構築とコントローラの起動は, 次のように trema の起動スクリプトから行います. run コマンドの後ろの引数に, ユーザ定義のコントローラを指定(ここではサンプルのコントローラを指定)し, -c オプションのパラメータに仮想ネットワークの設定ファイルを指定します.

 

f:id:user_localhost:20120906212601p:plain

 

 通常, このように起動した場合には, 仮想ネットワークの設定ファイルを読み込み, 仮想ホスト及び仮想スイッチの起動します. そして設定ファイルに従って, 両者を接続する仮想ネットワークインターフェイスを設定し, 仮想 OpenFlow ネットワークを構築します. 最後に, ユーザ定義コントローラを起動させ, 構築した仮想 OpenFlow ネットワークをいじれるようになります.

 

 "OpenFlow によってネットワークを制御する" というのは, "コントローラによって OpenFlow スイッチと OpenFlow プロトコルでおしゃべりする" という事に他なりません. 

 なので上述の仮想スイッチの初期化処理において, 仮想スイッチの接続先のコントローラを, ローカルマシンで動作するコントローラ (Trema) ではなく, 別のマシンで動作するコントローラにしてやれば. Trema で設定した仮想ネットワークをそこから制御することができます.

 Trema の場合, 仮想ネットワークとコントローラは, 同一ホストで動作する実装になっていますが. OpenFlow では, スイッチとコントローラを継ぐセキュアチャンネルは, TCP/IP で通信する仕様になっているので, こういうことをしても (システム的には) 全く問題ありません.

 

 仮想スイッチの設定内容は, 実行時に引数で渡した設定ファイルを読み込んで決定しますが. 接続先のコントローラを指定する情報については, Trema のトップディレクトリ以下の "ruby/trema/dsl/vswitch.rb" において固定値で与えられています. 以下のようにして, ここを任意の IP に書き換えてやると, 仮想スイッチは書き換えた先の IP で動作するコントローラに接続しにいきます.

 

f:id:user_localhost:20120906212706p:plain

 

 以下は, Trema ネットワークエミュレータで構築したネットワークを POX で制御してみます.

 構成としては, PC に 1 個の仮想マシンを起動させ, そこで上述の Hack を施した Trema を起動させます. そして, PC (ホストマシン:左上) で POX を起動させています.

 

f:id:user_localhost:20120906212726p:plain

      [クリックで拡大]

 (各シェルの説明) 

 左上 : (ホストマシン) POX コントローラを起動している

 左下 : (仮想マシン)   仮想ネットワークの設定ファイル

 右下 : (仮想マシン)   Trema を起動している

 右上 : (仮想マシン)   仮想ネットワークに対する各種オペレーション (パケット送信, 仮想ホストのパケットの送受信の表示, 仮想スイッチのフローテーブルの中身の表示) を行っている

 

 いやぁ〜, Trema 便利ですね.