スイッチを作ろう...

Preview:

Citation preview

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

コントローラ

HelloWorld

スイッチ

トポロジディスカバリ

ルーティングスイッチ

仮想NW

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

処理1フィルタリング

処理2転送

ラーニングスイッチ

• 802.1D/802.1Qreserved MAC

• マルチキャスト

ポートn番へ or

宛先 MAC =

FDB

をドロップ

FLOODING

処理1フィルタリング

処理2書き換え

処理3転送

例: ルータ

送信元/宛先 MACアドレス

ルーティングテーブル

OpenFlow1.3でのパケット処理

フローテーブルA

フローテーブルB

フローテーブルC

マルチプルテーブル

コントローラ

Goto Goto

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

ラーニングスイッチ

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

dropルールdropルール

GoTo 1

Pri.

2

2

1

Flow Entry

転送テーブル(ID=1)

• 宛先が 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) で処理

• 宛先が 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) にヒット

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

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

dropルールdropルール

GoTo 1

Pri.

2

2

1

Flow Entry

転送テーブル(ID=1)

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

転送テーブル(ID=1)

CONTROLLER

Pri.

1

コントローラ

PacketIn

• 宛先が 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ではデフォルトドロップ

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

• OpenFlow1.0はデフォルトPacketIn

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

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

転送テーブル(ID=1)

CONTROLLER

Pri.

1

コントローラ

転送ルール2

FlowMod

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

FDB

• 宛先が 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より高い

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

dropルールdropルール

GoTo 2

Pri.

2

2

1

Flow Entry

転送テーブル(ID=1)

CONTROLLER

Pri.

1

コントローラ

転送ルール2

転送ルール2…

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

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

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

Recommended