18
スイッチを作ろう OpenFlow1.3コントローラ

スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

スイッチを作ろうOpenFlow1.3編

コントローラ

Page 2: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

HelloWorld

スイッチ

トポロジディスカバリ

ルーティングスイッチ

仮想NW

Page 3: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

おさらいOpenFlow1.0でのパケット処理

Page 4: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

処理1フィルタリング

処理2転送

ラーニングスイッチ

• 802.1D/802.1Qreserved MAC

• マルチキャスト

ポートn番へ or

宛先 MAC =

FDB

をドロップ

FLOODING

Page 5: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

処理1フィルタリング

処理2書き換え

処理3転送

例: ルータ

送信元/宛先 MACアドレス

ルーティングテーブル

Page 6: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

OpenFlow1.3でのパケット処理

Page 7: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

フローテーブルA

フローテーブルB

フローテーブルC

マルチプルテーブル

コントローラ

Goto Goto

処理ごとにテーブルを分けるとデバッグしやすくなる

Page 8: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

ラーニングスイッチ

フィルタリングテーブル (ID=0)

dropルールdropルール

GoTo 1

Pri.

2

2

1

Flow Entry

転送テーブル(ID=1)

Page 9: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

• 宛先が 192.168.0.30 でHTTP だったら

send_flow_mod_add(

datapath_id,

table_id: 0,

idle_timeout: 0,

priority: 2,

match: Match.new(ether_destination_address: '01:00:5e:00:00:00',

ether_destination_address_mask: 'ff:ff:ff:00:00:00')

)

• マルチキャストを落とす• 最初のテーブル (ID=0) で処理

Page 10: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

• 宛先が 192.168.0.30 でHTTP だったら

send_flow_mod_add(

datapath_id,

table_id: 0,

idle_timeout: 0,

priority: 1,

match: Match.new,

instructions: GotoTable.new(1)

)

• フィルタにかからなかったら、 処理をテーブル1へ移行

• フィルタリング (pri=2) の後に このルール (pri=1) にヒット

Page 11: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

ラーニングスイッチ(再掲)

フィルタリングテーブル (ID=0)

dropルールdropルール

GoTo 1

Pri.

2

2

1

Flow Entry

転送テーブル(ID=1)

Page 12: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

フィルタリングテーブル (ID=0)

転送テーブル(ID=1)

CONTROLLER

Pri.

1

コントローラ

PacketIn

Page 13: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

• 宛先が 192.168.0.30 でHTTP だったら

send_flow_mod_add(

datapath_id,

table_id: 1,

idle_timeout: 0,

priority: 1,

match: Match.new,

instructions: Apply.new(SendOutPort.new(:controller))

)

• 明示的にPacketInを起こす• OpenFlow1.3ではデフォルトドロップ

Page 14: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

デフォルトドロップ(OpenFLow 1.3)

• OpenFlow1.0はデフォルトPacketIn

• フィルタ用フローエントリを打ち込むより前にパケットが大量に到着すると、最悪コントローラがパンク

• そこでOpenFlow1.3ではPacketInを明示的に起こすように修正された

Page 15: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

転送テーブル(ID=1)

CONTROLLER

Pri.

1

コントローラ

転送ルール2

FlowMod

フィルタリングテーブル (ID=0)

FDB

Page 16: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

• 宛先が 192.168.0.30 でHTTP だったら

send_flow_mod_add(

datapath_id,

table_id: FORWARDING_TABLE_ID,

idle_timeout: AGING_TIME,

priority: 2,

match: Match.new(in_port: packet_in.in_port,

ether_destination_address: packet_in.destination_mac,

ether_source_address: packet_in.source_mac),

instructions: Apply.new(SendOutPort.new(port_no))

)

• packet_inの送信元+ポートをフローエントリとして追加

• 優先度はPacketInより高い

Page 17: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

フィルタリングテーブル (ID=0)

dropルールdropルール

GoTo 2

Pri.

2

2

1

Flow Entry

転送テーブル(ID=1)

CONTROLLER

Pri.

1

コントローラ

転送ルール2

転送ルール2…

Page 18: スイッチを作ろう コントローラhandai-trema.github.io/deck/week3/learning_switch13.pdf処理1! フィルタリング 処理2! 転送 ラーニングスイッチ • 802.1D/802.1Q

まとめラーニングスイッチをOpenFlow1.3化

• マルチプルテーブルでデバッグしやすく• GotoTableインストラクションでテーブル (処理ステージ) を推移

• デフォルトでパケットをドロップ万が一の大量のPacketInが防げる