1つのルール、100台のスイッチ
学校が、ゲスト用の Wi-Fi から事務室のパソコンには絶対に届かないようにすると決めました。ふつうのネットワークでは、スイッチ1台ごとにログインして手で設定を変えます。ソフトウェア定義ネットワークでは、スイッチは1つの表に従うだけで、1つのプログラムがその表をすべてのスイッチに書きます。
このレッスンが終わると
メモ
フローが何をするか、コントローラーが何を加えるかを説明できる。
キーワード
- フロー:スイッチの中の1つのルールで、マッチとアクションからなる。
- フローテーブル:スイッチがパケットごとに順に見ていくフローの一覧。
- マッチ:フローがどのパケット向けかを決める部分。
- アクション:一致したパケットにスイッチがすること。
- コントローラー:スイッチのフローを書くプログラム。
- OpenFlow:スイッチとコントローラーが話す言語。
ウォームアップ:すでに知っていること
メモ
頭の中で答えましょう。1. ping で何が分かりますか。2. MAC アドレスとは何ですか。3. ふつうのスイッチは、初めて見るフレームをどうしますか。3つ目の答えはすぐに使います。
はじめる前に
メモ
このレッスンの上のバーにある ラボを開始 を押します。このラボは、中に小さなネットワークが作られた、あなた専用の Ubuntu マシン まるごとなので、コンテナより起動に少し時間がかかります。各 実行 ボタンは、そのコマンドをマシンのターミナルに、同じセッションで順番に入力します。マシンがまだ起動中と表示されたら、数秒待ってからもう一度押します。様子を見たり自分で入力したりするには、バーの ターミナルを開く を押します。
スイッチは読める表である
ここでのスイッチは br0 で、Open vSwitch が作っています。3台のパソコン h1、h2、h3 がつながっていて、それぞれが別々のネットワーク名前空間にあり、自分のアドレスを持っています。sdnlab status は、スイッチ、番号付きの3つのポート、パソコン、フローを一覧にします。最後の部分は空です。スイッチが fail-mode secure になっていることに注目しましょう。フローが許さないことは何もしない、という意味です。
sudo sdnlab statusここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
空の表はすべてを破棄する
ふつうのスイッチは自分で学習します。OpenFlow のスイッチは、フローテーブルに書いてあることしかしません。ovs-ofctl dump-flows はその表を表示しますが、フローは1つもなく、見出しの行しか返ってきません。だから h1 が h2 に ping すると、最初のパケットに一致するフローがなく、破棄されます。ping は 100% packet loss と表示します。
sudo ovs-ofctl -O OpenFlow13 dump-flows br0ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
sudo ip netns exec h1 ping -c 1 -W 1 10.0.0.2ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
チェック
ヒント
何も壊れていないのに、なぜ ping は失敗したのでしょう。答え: フローテーブルが空で、パケットに一致するフローがなく、スイッチが破棄したからです。
よくある間違い
注意
どのスイッチも、パソコンの場所を自分で学習すると思っている人が多くいます。ふつうのイーサネットスイッチはそうします。OpenFlow のスイッチはフローに書かれたことしかせず、フローがなければ何も転送しません。学習するのが自分でもコントローラーでも、フローは誰かが書く必要があります。
Mininet はネットワークまるごとを作る
Mininet は、1台のマシンの中にテスト用のネットワーク、つまりホスト、スイッチ、コントローラーを作り、起動と停止もしてくれます。--test pingall は、すべてのホストの組で ping して、いくつ失われたかを表示します。ここでの答えは 0% dropped (2/2 received) です。スイッチに必要なフローは、Mininet のコントローラーが書きました。Mininet は終わるとき、br0 を含むすべての Open vSwitch のスイッチを片付けます。そのため、次のステップでラボをもう一度作ります。
sudo mn --mac --test pingallここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
チェック
ヒント
Mininet で ping を通したのは誰でしょう。答え: そのコントローラーです。知らないパケットをどうするかを、スイッチに教えました。
コントローラーがフローを書く
sdnlab controller はラボを作り直し、br0 をこのマシン上のコントローラープログラムにつなぎます。これはあなたのラボの未完成のもので、渡されたままだと、すべてのパケットを他のすべてのポートに送ります。ハブと同じです。これで h1 から h3 への ping が通ります。表には priority=0 actions=CONTROLLER という1つのフローがあります。もっと良いフローがないパケットをすべてコントローラーに送り、n_packets はパケットのたびに増えます。このコントローラーを完成させるのが、ラボのパート3です。
sudo sdnlab controllerここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
sudo ip netns exec h1 ping -c 2 -W 1 10.0.0.3ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
sudo ovs-ofctl -O OpenFlow13 dump-flows br0ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
さあ、ラボに取り組もう
ヒント
空の表、コントローラー、パケットのたびにコントローラーに尋ねるスイッチを見ました。ラボでは、表を手で書き、そのあとコントローラーに学習のしかたを教えて、ほとんどのパケットがスイッチから出ないようにします。ターミナルで cat README.md を実行して、ホームフォルダーの README.md を開きましょう。
最後のチェック
ヒント
前を見ないで答えましょう。1. フローの2つの部分は何ですか。2. 表が空のとき、OpenFlow のスイッチはパケットをどうしますか。3. コントローラーは何を書きますか。4. フローテーブルを表示するコマンドはどれですか。答え: マッチとアクション。破棄する。フロー。ovs-ofctl dump-flows。
先生へ
ヒント
このレッスンは、ラボで進めるレッスンの小さな例です。ステップと実行ボタンがレッスンで、ラボは生徒それぞれのコピーです。VM ラボで行い、生徒はそれぞれ自分の Ubuntu マシンを持ち、その中にスイッチと3台のパソコンがあります。実行ボタンはそのターミナルに入力して、表示された結果を見せます。学習のポイント:1. フローはマッチとアクションである。2. フローのない OpenFlow スイッチはすべてを破棄する。3. コントローラーがフローを書く。よくある間違い:どのスイッチも自分で学習すると思うこと。準備するもの:ラボとブラウザー。ヒント:ping の前に、何が起こるかとその理由をクラスに尋ねましょう。ラボ自体には、フローテーブルと学習スイッチを採点するチェックがあります。レッスンは自分のモジュールにコピーして変更するか、レッスンビルダーの ラボ メニューでゼロから作れます。