Tech Sketch Bucket of Technical Chips by TIS Inc.

OpenFlowを気軽に試せるMininet

Pocket

ネットワーク分野で注目されているOpenFlowですが、実際に動かす環境を用意するのはハードルが高いと思われている方もいるかもしれません。

確かに従来は、新しいネットワーク技術を試そうと思っても、実際にネットワーク機器を用意するのが高い障壁となっていました。しかし現在では仮想スイッチや仮想ルータなどの機能の充実が進み、様々なネットワーク技術を一般的なサーバの上で試すことができるようになっています。もちろんOpenFlowも例外ではありません。

今回の記事では、非常に簡単にOpenFlowが動く環境を用意できる、Mininetについて紹介します。


OpenFlow環境を構築するために必要な要素

仮想スイッチ等を活用することで特別なハードウェアは必須では無くなったといっても、
実際にOpenFlowを動かす環境を全て自分で構築しようとすると、様々な作業が必要になります。

まず初めに、実際にOpenFlowによる通信を試すためには最低限、1台のOpenFlowコントローラ、複数台のOpenFlowスイッチ、実際にパケットを送受信する複数台のホストを用意する必要があります。これらを実際に物理サーバで用意するのはもちろんのこと、それぞれを仮想マシンで動かすにしても結構な台数となるため大変です。

次に、上記のホスト群をネットワークで接続する必要があります。全てのホストをフラットに接続するのであれば話は簡単かもしれませんが、複数台のスイッチを用いた構成というのは大抵複雑なつながり方をしています。
推奨されている通りにOpenFlowコントローラ-OpenFlowスイッチ間のネットワークとホスト-OpenFlowスイッチ間のネットワークを分離しようとすると別途考慮が必要です。
また実際に構築した後も、違う構成にして試してみたいと思うことは度々発生します。その度に接続形態を変更して設定を変更するのはかなり面倒です。

最後に、OpenFlowコントローラを動かすためにNOX, Trema, FloodlightといったOpenFlowコントローラを開発・実行するためのフレームワークをインストールしたり、OpenFlowスイッチを動かすためにOpen vSwitchなどの仮想スイッチをインストールして設定するといった作業が必要になります。それぞれの内容を十分に理解していないと難しい作業となるでしょう。

これらを全部自分でやろうとすると、とても「気軽に試してみる」という範囲では収まらないでしょう。

OpenFlow環境を簡単に構築できるMininet

こうした必要なツール類を包含し、かつOpenFlowを動かすための仮想ホスト、仮想スイッチ、仮想ネットワークを自動で構成してくれる機能を持っているのがMininetです。

Mininetは下図に示した通り、OpenFlowコントローラとしてNOX, OpenFlowスイッチとしてStanford reference switchとOpen vSwitchを同梱しており、他にもOpenFlowに関連するいくつかのツールを含んでいます。Mininetではこれらの同梱物を使ってOpenFlowを用いた仮想ネットワークを自動的に構成することができます。

openflow3_fig1.png

Mininetでは、OpenFlowを用いたネットワークを動作させるために必要な各構成要素を1台のマシン上でエミュレートするため、マシンを複数台用意する必要はありません。
さらに、このMininetがインストール済みの状態の仮想マシンイメージまで提供されています。
ユーザはこの仮想マシンイメージを手元の仮想環境で動かすだけで、すぐにOpenFlowを試すことができます。

Mininetの利用手順

Mininetは、OpenFlowの発祥の地でもあるスタンフォード大学で開発されているツールです。
Mininetは以下のサイトで公開されています。
http://yuba.stanford.edu/foswiki/bin/view/OpenFlow/Mininet

上記のサイトのメニューからDownloadを選択すると、VM InstallationとNative Installation on Ubuntuの2通りのインストール方法が提示されています。

仮想マシンイメージを利用する場合、VM Installation内のリンクから、仮想マシンイメージ(VMware形式)をダウンロードできます。対応している仮想環境は、サイトによると、VirtualBox, Qemu, VMware Workstation, VMware Fusion, KVM で動作させることができるようです。筆者の環境ではVMware Player 4.04で動作することを確認しました。適切な仮想環境を持っていない場合は、Native Installation on Ubuntuの手順に従って、手元のUbuntu上にインストールすることもできます。

後はサイトにあるMininetVMSetupNotes内に記載されている手順に従い、各仮想環境で仮想マシンイメージをインポートして起動してください。起動してログインが完了すれば、すぐにOpenFlowを試すことができます。
ログインID/Passwordは初期状態ではどちらも openflow となっています。
初期状態ではコンソールは英語キーボードになっているため、問題のある人はキーボード設定を変更するか、使い慣れたTerminalでSSH接続するなどして下さい。

Mininet上でOpenFlowを試してみる

それでは、実際にMininet上でOpenFlowを使ったネットワークを動かしてみましょう。
単に動かすだけならば非常に単純です。以下のコマンドを実行すると、自動的にOpenFlowコントローラが1台、OpenFlowスイッチが1台、ホストが2台の仮想ネットワークが構築されます。

デフォルトではOpenFlowコントローラにはNOXのサンプルコントローラの一つであるpyswitchが、OpenFlowスイッチにはOpen vSwitchが利用されています。
NOXのpyswitchは、スイッチングハブと同等の機能をOpenFlowスイッチに持たせるコントローラです。
処理を詳しく知りたい方は、~/noxcore/build/src/nox/coreapps/examples/pyswitch.py にソースがありますのでコードを読んでみて下さい。

コマンドを実行する

Mininetでは、OpenFlowの動作を確認する上で有用な様々なコマンドが用意されています。
コマンドの一覧と説明はhelpコマンドで確認することが出来ます。

例えば pingall を実行すると、全ホスト間の接続性が確認できます。

またMininetで用意されているコマンド以外に、各仮想ホスト上でシェルのコマンドを実行させることができます。
例えば以下のように先頭に仮想ホスト名をつけて ifconfig を実行すると、ローカルで実行した時と同じ情報が表示されるのではなく、実行した仮想ホスト上の情報が表示されます。

また特定の仮想ホストから特定の仮想ホストへ ping 等を実行することもできます。
この時宛先ホストにはIPを直接使用するだけでなく、仮想ホスト名も使用することができます。

ローカルで実行できるコマンドなら大体実行できるので、例えば以下のように仮想ホスト上でWebサーバを動かして、他のホストからアクセスするといったことも可能です。
仮想ホスト上で動いているようにきちんとエミュレートされているようなので、仮想ホストは区別されており、複数の仮想ホストで同じポート番号を利用することもできます。

OpenFlowスイッチのフローテーブルを確認する

以前の記事 で説明したように、OpenFlowスイッチはフローテーブルというテーブルにパケットの処理方法を記述したフローエントリを格納しています。
dpctlコマンドを使えばフローテーブルの中身を確認したり、フローエントリを追加/削除したりすることができます。
詳細は dpctl help で確認してみてください。

フローエントリの内容を表示してみた様子が以下の結果です。
起動直後のスイッチにはフローエントリは何も保存されていません。

pingを実行すると、関連する通信に対するフローエントリが追加されています。
NOXのpyswitchコントローラは、受け取ったパケットに対応するフローエントリを、有効期限60秒でスイッチに記憶させます。

上記を見ると、10.0.0.2から10.0.0.3へのARP Request, ARP Reply, ICMP Echo Request (icmp_type=8), ICMP Echo Reply (icmp_type=0) に関するフローエントリが登録されていることが確認できます。
idle_timeout=60になっているので、これらのエントリは60秒後には有効期限切れになって削除されます。
60秒待って同じコマンドを再度実行したのが以下の結果です。

ネットワークトポロジを自由に変更する

mnコマンドにオプションを何も指定せずに実行すると、スイッチ1台、ホスト2台の構成で仮想ネットワークが構成されていました。
今度は別の構成で仮想ネットワークを構築してみましょう。

mininetでは、トポロジ構成はpythonで記述することが出来ます。
トポロジ構成の記述のサンプルとして、標準で以下のようなファイルが用意されています。

~/mininet/custom/topo-2sw-2host.py

このファイルに書かれたトポロジに従って仮想ネットワークを構築するには、以下のようにmnコマンドにオプションを追加します。

上記を実行すると、OpenFlowコントローラ1台、OpenFlowスイッチ2台、ホスト2台の構成で仮想ネットワークが構築されます。
このtopo-2sw-2host.pyをベースにnodeやedgeの情報を変更すれば、自由にネットワークトポロジを変更することが出来ます。

OpenFlowコントローラを変更する

デフォルトでは同梱されているNOXのpyswitchというコントローラが実行されていますが、Mininetではそれ以外のコントローラももちろん利用することができます。
自分で動かしている別のコントローラと接続させたい場合は、以下のようにオプションを指定します。

例えばNOXの別のサンプルコントローラであるpacketdumpを使ってみたいという場合には、以下のようにコマンドを実行して別途コントローラを起動した後、上記のオプションでそのコントローラを指定することで接続することができます。

NOXのpacketdumpコントローラは、受け取ったパケットの情報を標準出力に出力し、パケットを破棄する動作をスイッチにさせるコントローラなので、ping等を実行するとARPパケットを受信している様子(そして応答が返ってこない様子)が標準出力で確認できるはずです。

まとめ

Mininetを使うことで、非常に簡単にOpenFlowを試すことができます。
実際にOpenFlowでどのようなパケットが流れていて、スイッチのフローテーブルにはどのような情報が入っているのかが簡単に調べられるので、OpenFlowについて学習する上で有用なツールとなるでしょう。

しかし標準のコントローラではスイッチングハブ相当の動作をするだけなので、少し物足りないと思う人もいるかもしれません。そういった人は、是非NOXやTrema, Floodlight等を使ってサンプルコントローラを色々変更してみてください。

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