-寫在前面的廢話-
自從今年接觸到了SDN(軟件定義網(wǎng)絡(luò)),就覺得進(jìn)入了一個全新的領(lǐng)域。畢設(shè)做的Floodlight(一種Openflow控制器)更是一度讓我覺得無從下手,概念理解的不透徹,安裝中遇到奇奇怪怪的問題,第一次用ubuntu,幾乎等于沒有的中文資料,完全在官網(wǎng)上看英語自學(xué),著實(shí)讓我頭疼了好久。雖然出國有一些時日了,但是依然是習(xí)慣看中文的資料學(xué)習(xí),這個習(xí)慣看來是有必要改改了,大多數(shù)時候官網(wǎng)上給出的例子都十分有代表性,是學(xué)習(xí)的好地方。由于英語理解能力一般以及部分術(shù)語難以理解等原因,在學(xué)習(xí)floodlight和sdn前期花了不少功夫。最近剛剛看到一篇博文說總結(jié)項(xiàng)目也是取得進(jìn)步的重要一環(huán),于是回頭看看自己的代碼,真是不忍直視。雖說是第一次寫python代碼,代碼量也不大,但現(xiàn)在看起來真的是亂糟糟一片,想修改都無從下手,正好借此寫博客總結(jié)的機(jī)會,把代碼總結(jié)修改一下,順便學(xué)習(xí)一下github,把代碼push上去。第一次寫博客,第一次用markdown,第一次用github,最難的大概就是從0到1的過程吧,這應(yīng)該也算是向著成為一個技術(shù)大牛的夢想上邁出了一步吧~如果文中有什么問題或疏漏,都?xì)g迎指出討論。
先給出邏輯框架圖,然后每個模塊逐步介紹。

整個系統(tǒng)可以簡單的分為2個部分。左下角是虛擬網(wǎng)絡(luò)和floodlight控制器,在虛線以內(nèi)的是域名管理服務(wù)器模塊。
普通的家庭路由器屏蔽網(wǎng)站一般是通過IP地址(說實(shí)話我也不知道現(xiàn)在的家用路由有什么高級功能),這樣一來管理員如果想屏蔽某一類網(wǎng)址就不得不輸入大量的IP地址,即浪費(fèi)時間也不方便修改。所以這個項(xiàng)目中提出了通過域名和域名的標(biāo)簽(tags)來管理家庭網(wǎng)絡(luò)。比如google和baidu的標(biāo)簽都是“search engine”,那么我們把相應(yīng)的主機(jī)屏蔽掉“search engine”,就能屏蔽掉大部分的搜索引擎,方便且容易修改。
我們用Mininet創(chuàng)建一個虛擬網(wǎng)絡(luò)來進(jìn)行模擬實(shí)驗(yàn)。當(dāng)虛擬網(wǎng)絡(luò)中的某個主機(jī)想訪問某個域名時,它會首先發(fā)送一條DNS請求來獲取該域名的IP地址,當(dāng)Openflow交換機(jī)收到了DNS請求時,便會發(fā)送一條Packet_in消息給floodlight控制器,在控制器里這個DNS請求將會被解析,取出請求中的域名地址,然后發(fā)送給域名管理服務(wù)器。域名管理服務(wù)器會通過該域名的標(biāo)簽來判斷該主機(jī)是否有權(quán)限訪問相應(yīng)的域名,然后返回一個Permit/Deny響應(yīng)給floodlight控制器,如果是Permit,則該DNS請求則正常轉(zhuǎn)發(fā);如果是Deny,floodlight控制器會丟棄掉這條請求,該主機(jī)便無法訪問此域名。
首先介紹虛擬網(wǎng)絡(luò)和floodlight控制器部分。
環(huán)境:Ubuntu14.04.1;Mininet 2.2;Floodlight v1.2
Mininet 是輕量級的軟件定義網(wǎng)絡(luò)系統(tǒng)平臺,同時提供了對 OpenFlow 協(xié)議的支持。通俗一點(diǎn)說就是,Mininet可以創(chuàng)建虛擬主機(jī)虛擬交換機(jī)實(shí)現(xiàn)虛擬網(wǎng)絡(luò)。
安裝教程鏈接在此
Mininet網(wǎng)上的中文教程其實(shí)很多了,就不再贅述,聊一聊折騰了好久的問題。其實(shí)安裝Mininet時非常簡單的,git clone之后install.sh -a就行。但是不知道為什么在我的ubuntu上一直安裝失敗。然后當(dāng)我輸入Mininet創(chuàng)建網(wǎng)絡(luò)的指令的時候,他會提示

這時如果你按照提示通過apt-get安裝Mininet,會默認(rèn)安裝Mininet2.1版本(當(dāng)時最新的版本是2.2,apt-get默認(rèn)2.1),而我需要使用2.2的一些新功能(后面會提到),只用將安裝的指令改為install.sh -nfv就行,當(dāng)初固執(zhí)的想-all,結(jié)果浪費(fèi)了好多時間。
Mininet安裝好之后用sudo mn測試,會自動創(chuàng)建一個包含兩個主機(jī)和一個交換機(jī)的虛擬網(wǎng)絡(luò)。接下來是安裝Floodlight控制器,官網(wǎng)鏈接在此
Floodlight是一種Java的Openflow控制器。SDN的核心理念之一便是控制模塊和數(shù)據(jù)模塊分開,Openflow控制器連在Openflow交換機(jī)上,交換機(jī)收到數(shù)據(jù)包后會發(fā)送Packet_in消息將數(shù)據(jù)包發(fā)送給Openflow控制器,經(jīng)過處理后發(fā)送Packet_out消息返回給交換機(jī),然后交換機(jī)進(jìn)行轉(zhuǎn)發(fā)。
Floodlight控制器安裝好后下一步便是將控制器連接到Openflow交換機(jī)上,即由Mniniet創(chuàng)建的虛擬交換機(jī)。首先,我們需要用一段簡單的python代碼實(shí)現(xiàn)想要的拓?fù)浣Y(jié)構(gòu)。
#!/usr/bin/python
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController, Controller
from mininet.cli import CLI
from mininet.link import TCLink
from mininet.log import setLogLevel
class MyTopo(Topo):
def __init__(self):
Topo.__init__(self)
Host1 = self.addHost('Child_1', ip='10.0.0.1')
Host2 = self.addHost('Child_2', ip='10.0.0.2')
Host3 = self.addHost('Father', ip='10.0.0.3')
Host4 = self.addHost('Mother', ip='10.0.0.4')
switch1 = self.addSwitch('s1')
self.addLink(switch1, Host1)
self.addLink(switch1, Host2)
self.addLink(switch1, Host3)
self.addLink(switch1, Host4)
topos = {'mytopo': (lambda: MyTopo())}
在我們的拓?fù)鋱D中,創(chuàng)建了四個主機(jī)和一個交換機(jī),并且四個主機(jī)都直接連在交換機(jī)上。接下來在eclipse中運(yùn)行floodlight,這時的floodlight還是沒有任何功能的,可以看做一個正常的交換機(jī)。運(yùn)行后用下面的命令創(chuàng)建網(wǎng)絡(luò)拓?fù)洳⑶疫B接floodlight到我們創(chuàng)建的虛擬交換機(jī)上。
sudo mn --custom MyTopo.py --topo mytopo --mac --nat --controller=remote,ip=127.0.0.1,port=6653
mn即創(chuàng)建拓?fù)洌?/p>
--custom 使用自己定義的拓?fù)洌?/p>
--mac 使mac地址簡化;
--nat 使我們創(chuàng)建的網(wǎng)絡(luò)可以連接到Internet,如果沒有這條指令,我們創(chuàng)建的網(wǎng)絡(luò)是沒有連接的外網(wǎng)的,也就是無法ping通Internet的,--nat只有在2.2及以上版本才有;
--controller 選擇虛擬網(wǎng)絡(luò)的控制,因?yàn)槲业腗ininet和floodlight都在一臺虛擬機(jī)上,所以IP地址是本機(jī)地址,端口6653,可能有些老版的教程還是6633,這里要注意下,已經(jīng)統(tǒng)一改為6653端口了。

如圖所示,我們的虛擬網(wǎng)絡(luò)搭建好了,在eclipse的控制臺中也能看到,已經(jīng)連接上交換機(jī)。
但是依然高興的太早,這時候使用Ping指令你會發(fā)現(xiàn),依然是Ping不通外網(wǎng)的。

首先,我們用xterm進(jìn)入任意一個host,然后進(jìn)入/etc/resolv.conf這個配置文件,如圖所示。


按下i修改這個配置文件,如果發(fā)現(xiàn)在修改過程中鍵盤失靈,請先安裝vim。
將nameserver的ip地址改為8.8.8.8,這是Google提供的免費(fèi)DNS服務(wù)器的IP地址,然后刪掉后面的localdomain。接著按下esc,輸入:wq保存退出,然后exit退出xterm,回到Mininet的命令行,重新執(zhí)行Ping指令,我們會發(fā)現(xiàn),現(xiàn)在已經(jīng)可以Ping通了。

關(guān)于剛才修改文件的內(nèi)容,第一行是默認(rèn)的DNS服務(wù)器地址;第二行這個local domain我一直沒有找到相關(guān)的資料,但是根據(jù)最后運(yùn)行的結(jié)論我覺得,這個應(yīng)該是本地緩存域名之類的,因?yàn)樵诤竺娴膶?shí)驗(yàn)中,當(dāng)我用floodlight控制器丟棄主機(jī)發(fā)送的DNS請求后,比如請求域名為www.baidu.com,主機(jī)收不到DNS響應(yīng)后,會發(fā)送一條新的DNS請求,這時的請求域名變成了www.baidu.com.localdomain,如果刪除了localdomain那一行,便不會有這條新的DNS請求。所以我猜測,這個localdomain應(yīng)該是存在交換機(jī)上的域名-IP緩存,主機(jī)在第一次請求失敗后,試圖從交換機(jī)的緩存中取得請求域名的IP地址。
OK了~Mininet和floodlight的配置結(jié)束,下一步便是在floodlight中實(shí)現(xiàn)功能了。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 1、第八章 Samba服務(wù)器2、第八章 NFS服務(wù)器3、第十章 Linux下DNS服務(wù)器配站點(diǎn),域名解析概念命令:...
- Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
- DNS(Domain Name System,域名系統(tǒng)),因特網(wǎng)上作為域名和IP地址相互映射的一個分布式數(shù)據(jù)庫,能...
- 中國式眾籌的基本邏輯有哪些? 中國式眾籌的基本邏輯大致有以下幾個: 眾籌相對論、長板理論、動車?yán)碚?、三位一體、變外...