SDN FrameworkRYUUsing OpenFlow 1.3RYU project team
Contents
前言
1 交換器(Switching Hub )
1.1 Switching Hub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 OpenFlow 實作的交換器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 在 Ryu 上實作交換器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4 執行 Ryu 應用程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5 本章總結 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 流量監控(Traffic Monitor )
2.1 定期檢查網路狀態 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 安裝 Traffic Monitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 執行 Traffic Monitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 本章總結 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 REST API
3.1 整合 REST API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 安裝包含 REST API 的 Switching Hub . . . . . . . . . . . . . . . . . . . . . . .
3.3 安裝 SimpleSwitchRest13 class . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4 安裝 SimpleSwitchController Class
. . . . . . . . . . . . . . . . . . . . . . . .
3.5 執行包含 REST API 的 Switching Hub . . . . . . . . . . . . . . . . . . . . . . .
3.6 本章總結 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 網路聚合(Link Aggregation )
4.1 網路聚合(Link Aggregation ) . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 執行 Ryu 應用程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 實作 Ryu 的網路聚合功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4 本章總結 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5 生成樹(Spanning Tree )
5.1 Spanning Tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 執行 Ryu 應用程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3 使用 OpenFlow 完成生成樹 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4 使用 Ryu 實作生成樹 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5 本章總結 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6 OpenFlow 通訊協定
6.1 Match . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
3
3
3
6
14
20
21
21
21
27
29
31
31
31
33
34
36
38
39
39
39
50
59
61
61
63
74
75
84
85
85
i
6.2 Instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.3 Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 ofproto 函式庫
7.1 簡單說明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 相關模組 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3 基本使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8 封包函式庫
8.1 基本使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2 應用程式範例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
87
89
89
89
90
93
93
95
9 OF-Config 函式庫
99
99
9.1 OF-Config 通訊協定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2 函式庫架構 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
9.3 使用範例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
10 防火牆(Firewall )
103
10.1 Single tenant 操作範例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
10.2 Multi tenant 操作範例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
10.3 REST API 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
11 路由器(Router )
119
11.1 Single Tenant 的操作範例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
11.2 Multi-tenant 的操作範例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
11.3 REST API 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
12 OpenFlow 交換器測試工具
143
12.1 測試工具概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
12.2 使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
12.3 測試工具使用範例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
13 組織架構
157
13.1 應用程式開發模型(Application programming model ) . . . . . . . . . . . . . 157
14 協助專案開發
159
14.1 參與專案 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
14.2 開發環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
14.3 送交更新的程式碼 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
15 應用案例
161
15.1 Stratosphere SDN Platform (Stratosphere)
. . . . . . . . . . . . . . . . . . . . 161
15.2 SmartSDN Controller(NTT COMWARE ) . . . . . . . . . . . . . . . . . . . . . 161
ii
前言
本書是給那些使用 Ryu 作為開發的框架,而目的是為了實現軟體定義網路(Software Defined
Networking,SDN )而寫的一本參考書。
那麼為什麼要選擇 Ryu 作為開發平台呢?
我們衷心的希望您可以在本書中找到解答。
建議您依照本書的章節,依序的閱讀第 1 章至第 5 章。首先第 1 章是 Simple Switch 的實作,
接著後面的章節是流量監控(Traffic Monitor )以及網路聚合(Link Aggregation )。透過實際的
例子,我們將介紹 Ryu 的程式是如何運作的。
第 6 章到第 9 章,我們將詳細的說明 OpenFlow 通訊協定(OpenFlow Protocol )以及封包函數
的使用方法。接著第 10 章到第 12 章,我們會討論如何使用 Ryu 內建的防火牆(Firewall )和
測試工具(test tool )來開發應用程式。第 13 到 15 章將介紹 Ryu 的架構(architecture )及
實際應用案例。
最後,我們非常感謝您對於 Ryu 專案的青睞及支持,特別對於 Ryu 的使用者而言。希望在不久
的將來能有機會在 Mailing List 上得到來自于您的寶貴意見,讓我們一起加入 Ryu 專案並進行
開發吧。
繁體中文版本是由台灣資訊工業策進會- SDN 團隊協助整理及翻譯,除了不吝批評與指教之
外也歡迎更多朋友加入,讓中文讀者可以更快更即時的了解 Ryu 這個優秀的開放原始碼的框
架。
1
Contents
2
CHAPTER 1
交換器(Switching Hub )
本章將會用簡單的 Switching hub 安裝做為題材,說明 Ryu 如何安裝一個應用程式。
1.1 Switching Hub
在交換器中有許許多多的功能。在這邊我們將看到擁有下列簡單功能的交換器。
X 學習連接到連接埠的 host 之 MAC 位址,並記錄在 MAC 位址表當中。
X 對於已經記錄下來的 MAC 位址,若是收到送往該 MAC 位址的封包,則轉送該封包到相
對應的連接埠。
X 對於未指定目標位址的封包,則執行 Flooding。
讓我們使用 Ryu 來實現這樣一個交換器吧。
1.2 OpenFlow 實作的交換器
OpenFlow 交換器會接受來自于 controller 的指令並達到以下功能。
X 對於接收到的封包進行修改或針對指定的連接埠進行轉送。
X 對於接收到的封包進行轉送到 Controller 的動作(Packet-In )。
X 對於接收到來自 Controller 的封包轉送到指定的連接埠(Packet-Out )。
上述的功能所組合起來的就是一台交換器的實現。
首先,利用 Packet-In 的功能來達到 MAC 位址的學習。Controller 使用 Packet-In 接收來自交換
器的封包之後進行分析,得到連接埠相關資料以及所連接的 host 之 MAC 位址。
在學習之後,對所收到的封包進行轉送。將封包的目的位址,在已經學習的 host 資料中進行檢
索,根據檢索的結果會進行下列處理。
X 如果是已經存在記錄中的 host:使用 Packet-Out 功能轉送至先前所對應的連接埠
X 如果是尚未存在記錄中的 host:使用 Packet-Out 功能來達到 Flooding
下面將一步一步的說明並附上圖片以幫助理解。
1. 初始狀態
3
Chapter 1. 交換器(Switching Hub )
Flow table 為空白的狀況。
將 host A 接到連接埠 1,host B 接到連接埠 4,host C 接到連接埠 3。
2. host A ! host B
當 host A 向 host B 發送封包。這時後會觸發 Packet-In 訊息。host A 的 MAC
位址會被連接埠 1 給記錄下來。由於 host B 的 MAC 位址尚未被學習,因此會
進行 Flooding 並將封包往 host B 和 host C 發送。
Packet-In:
in-port: 1
eth-dst: host B
eth-src: host A
Packet-Out:
action: OUTPUT: Flooding
3. host B ! host A
封包從 host B 向 host A 返回時,在 Flow table 中新增一筆 Flow Entry,並將封
包轉送到連接埠 1。因此該封包並不會被 host C 收到。
4
1234Host AHost CHost BMAC address tableFlow table1234Host AHost CHost BMAC address tableFlow tableHost A: Port 1