方針をフローの行に直す
ovs-ofctl add-flow は、Open vSwitch のフローテーブルに規則を1行足すコマンドです。文章で決めた方針を、フローの行に直す作業に使います。
方針を行に直せれば、SDN の管理者の基本の仕事ができます。このレッスンでは、通すものと止めるものを書き分けます。
このレッスンのゴール
メモ
通信の方針を、ovs-ofctl のフローの行に書き直せる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| add-flow | スイッチにフローを1行足すコマンド | |
| ARP | IP アドレスから MAC アドレスを聞く仕組み | |
| ドロップ | 合った枠を捨てるアクション | actions=drop |
| 既定の拒否 | 許していない通信は、すべて止める考え方 | |
| TCP ポート | 1台の中で、使うサービスを分ける番号 | 80 |
学生が入力するセルは、このプレビューでは空白です。
方針の例: ウェブだけを通す
次の方針を、フローにします。ポート1のノートパソコンは、ポート2のサーバのウェブ(TCP の80番)だけを使えます。それ以外は、すべて止めます。
ノートパソコンの IP アドレスは 10.0.1.1、サーバは 10.0.1.2 とします。
方針とフローの対応
| 方針 | フローの行 |
|---|---|
| ARP を通す(1番から2番) | priority=100,arp,in_port=1,actions=output:2 |
| ARP を通す(2番から1番) | priority=100,arp,in_port=2,actions=output:1 |
| ウェブの依頼を通す | priority=90,tcp,in_port=1,nw_dst=10.0.1.2,tp_dst=80,actions=output:2 |
| ウェブの返事を通す | priority=90,tcp,in_port=2,nw_dst=10.0.1.1,tp_src=80,actions=output:1 |
| ほかはすべて捨てる | priority=10,actions=drop |
学生が入力するセルは、このプレビューでは空白です。
ARP を通さないと IP の通信は始まらない
ノートパソコンは、サーバの MAC アドレスを知らないと、枠を送れません。そこで最初に ARP で、「10.0.1.2 の MAC アドレスは?」と聞きます。
この ARP の枠を止めると、ウェブの依頼は1つも出ません。IP のフローだけを書いて「つながらない」と悩むのは、よくある失敗です。
sw1 に5行を入れて試す
前のレッスンの sw1 を使います。なければ、最初の Run で作ります。次に、表を空にしてから、5行をまとめて入れます。
printf が5行を作り、add-flows が標準入力の - から読みます。フローの書き方に誤りがあれば、足す前に、エラーで教えてくれます。
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ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
5行をまとめて入れる
printf 'priority=100,arp,in_port=1,actions=output:2\npriority=100,arp,in_port=2,actions=output:1\npriority=90,tcp,in_port=1,nw_dst=10.0.1.2,tp_dst=80,actions=output:2\npriority=90,tcp,in_port=2,nw_dst=10.0.1.1,tp_src=80,actions=output:1\npriority=10,actions=drop\n' | sudo ovs-ofctl -O OpenFlow13 add-flows sw1 -ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
入った行を見る
sudo ovs-ofctl -O OpenFlow13 --no-stats dump-flows sw1ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
わざと間違える
sudo ovs-ofctl -O OpenFlow13 add-flow sw1 priority=5,nonsense=3,actions=dropここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
trace で方針どおりか確かめる
入れた5行が方針どおりに働くかを、ofproto/trace で確かめます。ウェブの依頼、別のポートへの依頼、ARP、ウェブの返事の4つを試します。
1つ目は優先度90、2つ目は優先度10、3つ目は優先度100、4つ目は優先度90のフローに当たるはずです。
ウェブの依頼
sudo ovs-appctl ofproto/trace sw1 tcp,in_port=1,nw_src=10.0.1.1,nw_dst=10.0.1.2,tp_dst=80 | grep -E "No match|priority"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
22番への依頼
sudo ovs-appctl ofproto/trace sw1 tcp,in_port=1,nw_src=10.0.1.1,nw_dst=10.0.1.2,tp_dst=22 | grep -E "No match|priority"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ARP の問い合わせ
sudo ovs-appctl ofproto/trace sw1 arp,in_port=1 | grep -E "No match|priority"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ウェブの返事
sudo ovs-appctl ofproto/trace sw1 tcp,in_port=2,nw_src=10.0.1.2,nw_dst=10.0.1.1,tp_src=80 | grep -E "No match|priority"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
IP の通信を通すフローだけで足りる、と思いがちです。実際は、IP の前に ARP があります。ARP を通すフローがないと、IP の枠は1つも出ません。返事の向きの流れも、別のフローが要ります。