SDN のラボ:Open vSwitch、Mininet、OpenFlow コントローラーを1台の VM で

このラボは、生徒ごとに自分でプログラムできるスイッチを渡します。生徒の1台の Ubuntu VM の中に、本物のソフトウェアスイッチである Open vSwitch と3台の小さなホストが作られ、Mininet と OpenFlow コントローラーを書くためのライブラリも入っています。始めはスイッチのフローテーブルが空なので、何も転送しません。生徒はフローを手で書き、次にスイッチに学習させるコントローラーを完成させます。

生徒のコンピューターには何もインストールせず、ネットワーク機器も要りません。ホストはネットワーク名前空間で、スイッチはカーネルのデータパスを使う Open vSwitch であり、コマンドは ovs-ofctl、ovs-vsctl、mn という本物です。

生徒が学ぶこと

ソフトウェア定義ネットワークで何が変わるか。転送のルールは、人またはプログラムが書くフローテーブルのデータになります。学びは3つの部分です。まず、テスト用のネットワークを丸ごと作る Mininet と、その pingall テスト。次に、ovs-ofctl で OpenFlow 1.3 のフローテーブルを手で書きます。フローごとに条件とアクション、IP だけでなく ARP、そして1台のホストをわざと破棄するフローです。最後にコントローラー、つまり os-ken ライブラリ上のアプリケーションを完成させ、各 MAC アドレスがどのポートにあるかを学習してフローを入れるようにします。生徒は ovs-ofctl dump-flows でそれを読み返します。

トポロジー

スイッチ br0 にはポートが3つあります。ホスト h1、h2、h3 のアドレスは 10.0.0.1、10.0.0.2、10.0.0.3 で、MAC アドレスは末尾が 01、02、03 なので、README だけでフローが書けます。スイッチは fail-mode secure で、フローがなければすべてのパケットを破棄します。普通のスイッチはこうはなりません。生徒の作業は2つのファイル、フローテーブル用とコントローラー用に入り、ラボが起動するたびに読み込まれます。

ブラウザーで動かす

VM ラボはモジュールのラボタスクとして設定し、サンプルはラボのページにあります。マシンは小さく、CPU 1つ、メモリ 1 GB、ディスク 10 GB です。スイッチ、そのデータベース、コントローラーを合わせても、メモリの約10分の1しか使いません。

  1. ラボを追加する. 担当するモジュールでタスクを追加し、Ubuntu VM ラボのカードを選びます。ページには compose ファイルの代わりに、マシンの短い説明が表示されます。
  2. サンプルから始める. ページには、すぐ使えるラボが用意されています。Software-defined networking を選びます。サンプルを使うとテキストが置き換わり、元に戻すで自分のテキストを取り戻せます。
  3. 公開して自分用のコピーを起動する. 公開してから開始を押します。VM の初回起動時に、ラボの setup スクリプトが Ubuntu のアーカイブから Open vSwitch、Mininet、コントローラー用ライブラリ os-ken をインストールし、sdnlab コマンド、編集する2つのファイル、README を作ります。数分かかります。
  4. ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。3つの部分に分けて何をするかが書かれていて、答えは書かれていません。

このラボの基本レッスン

SDN Basics は、Ubuntu VM であるこのラボで進める小さなレッスンです。導入、「できる」で書いた目標、キーワード、スタート問題、考えごとの後の確認、よくある間違い、最後の確認があり、各ステップの 実行ボタンがコマンドをマシンのターミナルに入力します。生徒は空のフローテーブルを読み、何も一致しないために ping が失敗するのを見て、Mininet の pingall を実行し、渡されたままのラボのコントローラーを起動して、それが残す1つのフローを確かめます。

このレッスンは見て回るだけで、ラボ本来のタスクであるフローと学習スイッチは生徒に残すので、答えは渡しません。

採点の仕組み

ラボにはチェックがあります。保存されたマシンのコピーを新しく起動して実行し、生徒の2つのファイルを自分で読み込むので、手で入力して保存しなかったフローは数えません。フローファイルだけでコントローラーなしの状態で、h1 と h2 は互いに届き、h3 は誰にも届かず誰からも届かず、h3 に一致するフローがそれを破棄していて、h3 のパケットが実際にそのフローに当たっている必要があります。アクション NORMAL は通りません。次にチェックは生徒のコントローラーを起動し、h2 に誰も見たことのない MAC アドレスを付けるので、前もって書いた表は役に立ちません。そして全ての組で ping します。コントローラーは各アドレスを学習し、正しい出力ポートのフローを入れていて、フラッディングするフローがない必要があります。チェックの出力の1行目に理由が出ます。

  1. 配る. 他のタスクと同じようにラボを割り当てます。希望すれば期限も付けられます。生徒ごとに専用の VM が用意され、セッションをまたいで保たれます。
  2. チェックを実行する. クラス一覧で生徒の行にあるチェックを実行を押します。保存されたマシンのコピー(保存し直されません)を起動し、ラボのチェックスクリプトを root で実行して、合格したか、何を出力したか、いつ実行したかを表示します。結果は生徒には伝わりません。
  3. 採点する. チェックの出力の1行目を読みます。ファイルのフローではあるホストが別のホストに届かない、学習したフローが足りない、など何が正しくないかが書かれています。足りなければ理由を添えて差し戻します。

GitHub の定義ファイル

このファイルはラボの定義のすべてで、プラットフォームが実行するのと同じテキストです。サイズ、setup スクリプト、sdnlab ツール、コントローラーの起動用スクリプト、README、チェックが入っています。コピーして、フロー、ホスト、コントローラーの課題を変えれば、もっと長いラボが作れます。

このラボを試す、そして費用

無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。

よくある質問

このラボに OpenFlow スイッチやライセンスは必要ですか。
いいえ。スイッチはオープンソースで Ubuntu のアーカイブにある Open vSwitch で、Mininet とコントローラー用ライブラリも同じアーカイブから来ます。生徒の VM の起動時にインストールされ、私たちがそれらを配布することはありません。
なぜラボに専用のコントローラー起動スクリプトがあるのですか。
Ubuntu の os-ken パッケージはライブラリだけで、アプリケーションを実行するコマンドがありません。ラボは短い起動スクリプト ctl.py を足していて、定義の中で読めます。os-ken は eventlet に依存し、eventlet は非推奨で、コントローラーのログに注意が出ます。そのため、ラボはまず ovs-ofctl と Mininet を教えます。その部分はこれに依存しません。
生徒は何かを壊せますか。
壊せるのは自分のコピーだけです。ホスト間のネットワークは仮想で VM の中にあり、VM が届くのは Ubuntu のアーカイブ、PyPI、npm、GitHub だけです。ラボを壊したら、sdnlab reset で2つのファイルが元に戻ります。
このラボは実際の生徒の VM でテストしましたか。
setup、レッスンのコマンド、チェックは、VM の代わりのコンテナ内の本物の Ubuntu 26.04 で、カーネルの Open vSwitch データパスを使って実行しました。systemd ユニットからラボを起動し、Ubuntu のカーネルモジュールを読み込む、起動済みの生徒の VM では、授業の前に一度試すことをお勧めします。