原文發表在我的博客主頁,轉載請注明出處.
前言
之前模擬仿真網絡一直用的是Mininet,包括寫了一些關於Mininet安裝,和真實網絡相連接,Mininet簡歷拓撲的博客,但是大多數都是局限於具體步驟的使用,直到今天,被問了一句:你知道Mininet的內部實現原理嗎?瞬間懵比,所以找找資料搞明白這個問題。
實現原理
要了解Mininet的內部實現,需要了解Linux容器———網絡命名空間。網絡命名空間允許創建虛擬的網絡域,這個網絡域擁有自己的接口,IP地址,路由表等。網絡命名空間通過虛擬的以太網鏈路連接到外面的網絡,虛擬以太網鏈路有兩個端,一端位於本地命名空間,另一個位於全局命名空間,網絡命名空間在Docker和OpenStack中也同樣不可或缺,在OpenStack的Neutron網絡管理模塊中,網絡命名空間將租戶獨立,並且可以讓他們擁有重疊的IP地址。
Mininet是如何實現呢?
- 網絡命名空間用於實現主機或者端,每個主機擁有自己的接口,IP地址和路由表
- OVS或者Linux交換機用於實現交換機,默認使用的是OVS,OpenFlow用於對數據平面編程,ovsdb用來設置配置文件
- 控制鏈路的特性比如帶寬,延時等用的是Linux的tc工具
- Mininet使用python將上面的工具以及其他的比如perf進行了包裝。
現在欲創建一個最基本的網絡:兩個主機,一個交換機,兩個主機分別連在交換機上面,這個拓撲是Mininet默認的,所以直接使用Mininet的啟動命令"mn"就可以了,但是這個拓撲的創建在Linux系統中有哪些等價命令呢?
# 1. 創建兩個命名空間,分別命名為h1,h2
ip netns add h1
ip netns add h2
# 2. 創建拓撲所需的交換機s1
ovs-vsctl add-br s1
# 3. 創建以太網鏈路來連接兩個主機和交換機
ip link add h1-eth1 type veth peer name s1-eth1
ip link add h2-eth1 type veth peer name s1-eth2
# 4. 把主機的端口移到對應命名空間
ip link set h1-eth1 netns h1
ip link set h2-eth1 netns h2
# 5. 把交換機端口連接到OVS上
ovs-vsctl add-port s1 s1-eth1
ovs-vsctl add-port s1 s1-eth2
# 6. 連接控制器
ovs-vsctl set-controller s1 tcp:127.0.0.1
# 7. 設置IP
ip netns exec h1 ifconfig h1-eth1 10.0.0.1
ip netns exec h1 ifconfig lo up
ip netns exec h2 ifconfig h2-eth1 10.0.0.2
ip netns exec h2 ifconfig lo up
ifconfig s1-eth1 up
ifconfig s1-eth2 up
總結
雖然不想重復造輪子,但是Mininet的設計思路和理念還是比較常用的,所以了解其大概的思路還是必須的。