クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

OpenFlowのフローテーブルの読み方

このレッスンのあとで: フローのマッチ、優先度、アクションを読める。

55分のレッスンコマンド12件SDN のラボ:Open vSwitch、Mininet、OpenFlow コントローラーを1台の VM で

フローはスイッチの1つの規則

フロー(flow)は、OpenFlow のスイッチが持つ1つの規則です。どんなパケットに、何をするかを決めます。

フローが読めれば、スイッチがなぜその枠を通し、なぜ捨てたかを、規則表から説明できます。

このレッスンのゴール

メモ

フローのマッチ、優先度、アクションを読める。

重要な言葉

ことばいみれい
フローマッチ、優先度、アクションの組でできた1つの規則
フローテーブルスイッチが持つフローの一覧
マッチどのパケットに当てはまるかを決める条件in_port=1
優先度合うフローが複数あるとき、大きいほうが勝つ数priority=200
アクション合ったパケットにスイッチがすることoutput:2
テーブルミスどのフローにも合わなかったときの扱い

学生が入力するセルは、このプレビューでは空白です。

フローはマッチ、優先度、アクションでできている

1行のフローを読みます。priority=200,in_port=1,dl_dst=00:00:00:00:00:02 actions=output:2 です。

左の priority=200 が優先度、続く in_port=1 と dl_dst=... がマッチ、actions= の右がアクションです。意味は、1番のポートに入った、宛先がこの MAC アドレスの枠を、2番のポートへ出す、です。

1行のフローを分ける

部分書き方意味
優先度priority=200大きいほど先に当てはめる
マッチ(入口)in_port=11番のポートから入った枠
マッチ(宛先)dl_dst=00:00:00:00:00:02宛先の MAC アドレスがこれ
アクションactions=output:22番のポートへ出す

学生が入力するセルは、このプレビューでは空白です。

自分用のブリッジを作って試す

ラボの br0 は課題で使うので、ここでは自分用のブリッジ sw1 を作ります。ポートは p1 から p4 で、番号は1から4です。ホストもケーブルもいりません。

フローを足したあと、ofproto/trace で「この枠はどのフローに当たるか」を調べます。実際の枠は流れません。

sw1 を作る

コマンド
sudo ovs-vsctl --may-exist add-br sw1 -- set bridge sw1 datapath_type=system protocols=OpenFlow13 fail-mode=secure -- --may-exist add-port sw1 p1 -- set interface p1 type=internal ofport_request=1 -- --may-exist add-port sw1 p2 -- set interface p2 type=internal ofport_request=2 -- --may-exist add-port sw1 p3 -- set interface p3 type=internal ofport_request=3 -- --may-exist add-port sw1 p4 -- set interface p4 type=internal ofport_request=4

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

規則表を空にする

コマンド
sudo ovs-ofctl -O OpenFlow13 del-flows sw1

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

空の表で、枠はどうなるか

コマンド
sudo ovs-appctl ofproto/trace sw1 in_port=1,dl_dst=00:00:00:00:00:02 | grep -E "No match|priority"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

どのフローにも合わない枠は捨てられる

空の表では No match. と出ます。どのフローにも合わなかったという意味です。

フェイルモードが secure なので、合うフローがなければ枠は捨てられます。これがテーブルミスの扱いで、コントローラがあれば、相談に行くこともあります。

1番目のフローを足す

コマンド
sudo ovs-ofctl -O OpenFlow13 add-flow sw1 priority=300,ip,nw_src=10.0.1.9,actions=drop

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

2番目のフローを足す

コマンド
sudo ovs-ofctl -O OpenFlow13 add-flow sw1 priority=200,in_port=1,dl_dst=00:00:00:00:00:02,actions=output:2

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

3番目のフローを足す

コマンド
sudo ovs-ofctl -O OpenFlow13 add-flow sw1 priority=100,in_port=1,actions=output:4

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

何でも合う、最後のフロー

コマンド
sudo ovs-ofctl -O OpenFlow13 add-flow sw1 priority=0,actions=drop

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

表を見る

コマンド
sudo ovs-ofctl -O OpenFlow13 --no-stats dump-flows sw1

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

優先度の一番大きい、合うフローが選ばれる

表には4行が出ます。行が出る順番は、選ばれる順番とは限りません。決めるのは優先度だけです。

スイッチは、枠に合うフローをすべて探し、優先度が一番大きいものを選びます。priority=0 で条件のないフローは、どの枠にも合う、最後の砦になります。

宛先が02の枠

コマンド
sudo ovs-appctl ofproto/trace sw1 in_port=1,dl_dst=00:00:00:00:00:02 | grep -E "No match|priority"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

宛先が05の枠

コマンド
sudo ovs-appctl ofproto/trace sw1 in_port=1,dl_dst=00:00:00:00:00:05 | grep -E "No match|priority"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

送り主が10.0.1.9の枠

コマンド
sudo ovs-appctl ofproto/trace sw1 ip,in_port=1,dl_dst=00:00:00:00:00:02,nw_src=10.0.1.9 | grep -E "No match|priority"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

3番のポートから来た枠

コマンド
sudo ovs-appctl ofproto/trace sw1 in_port=3,dl_dst=00:00:00:00:00:02 | grep -E "No match|priority"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

表の上にあるフローが先に使われる、と思いがちです。実際に決めるのは優先度で、行の順番ではありません。同じ優先度で両方に合う枠は、どちらが選ばれるか決まりません。優先度は重ならないようにします。

このラボとソースについて: SDN のラボ:Open vSwitch、Mininet、OpenFlow コントローラーを1台の VM で

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。