フローはスイッチの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=1 | 1番のポートから入った枠 |
| マッチ(宛先) | dl_dst=00:00:00:00:00:02 | 宛先の MAC アドレスがこれ |
| アクション | actions=output:2 | 2番のポートへ出す |
学生が入力するセルは、このプレビューでは空白です。
自分用のブリッジを作って試す
ラボの 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"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
表の上にあるフローが先に使われる、と思いがちです。実際に決めるのは優先度で、行の順番ではありません。同じ優先度で両方に合う枠は、どちらが選ばれるか決まりません。優先度は重ならないようにします。