-寫在前面的廢話-
自從今年接觸到了SDN(軟件定義網(wǎng)絡)栋豫,就覺得進入了一個全新的領域缀程。畢設做的Floodlight(一種Openflow控制器)更是一度讓我覺得無從下手容诬,概念理解的不透徹相速,安裝中遇到奇奇怪怪的問題,第一次用ubuntu肛冶,幾乎等于沒有的中文資料街氢,完全在官網(wǎng)上看英語自學,著實讓我頭疼了好久睦袖。雖然出國有一些時日了珊肃,但是依然是習慣看中文的資料學習,這個習慣看來是有必要改改了,大多數(shù)時候官網(wǎng)上給出的例子都十分有代表性伦乔,是學習的好地方厉亏。由于英語理解能力一般以及部分術語難以理解等原因,在學習floodlight和sdn前期花了不少功夫评矩。最近剛剛看到一篇博文說總結項目也是取得進步的重要一環(huán)叶堆,于是回頭看看自己的代碼阱飘,真是不忍直視斥杜。雖說是第一次寫python代碼,代碼量也不大沥匈,但現(xiàn)在看起來真的是亂糟糟一片蔗喂,想修改都無從下手,正好借此寫博客總結的機會高帖,把代碼總結修改一下缰儿,順便學習一下github,把代碼push上去散址。第一次寫博客乖阵,第一次用markdown,第一次用github预麸,最難的大概就是從0到1的過程吧瞪浸,這應該也算是向著成為一個技術大牛的夢想上邁出了一步吧~如果文中有什么問題或疏漏,都歡迎指出討論吏祸。
先給出邏輯框架圖对蒲,然后每個模塊逐步介紹。
整個系統(tǒng)可以簡單的分為2個部分贡翘。左下角是虛擬網(wǎng)絡和floodlight控制器蹈矮,在虛線以內(nèi)的是域名管理服務器模塊。
普通的家庭路由器屏蔽網(wǎng)站一般是通過IP地址(說實話我也不知道現(xiàn)在的家用路由有什么高級功能)鸣驱,這樣一來管理員如果想屏蔽某一類網(wǎng)址就不得不輸入大量的IP地址泛鸟,即浪費時間也不方便修改。所以這個項目中提出了通過域名和域名的標簽(tags)來管理家庭網(wǎng)絡踊东。比如google和baidu的標簽都是“search engine”北滥,那么我們把相應的主機屏蔽掉“search engine”,就能屏蔽掉大部分的搜索引擎递胧,方便且容易修改碑韵。
我們用Mininet創(chuàng)建一個虛擬網(wǎng)絡來進行模擬實驗。當虛擬網(wǎng)絡中的某個主機想訪問某個域名時缎脾,它會首先發(fā)送一條DNS請求來獲取該域名的IP地址祝闻,當Openflow交換機收到了DNS請求時,便會發(fā)送一條Packet_in消息給floodlight控制器,在控制器里這個DNS請求將會被解析联喘,取出請求中的域名地址华蜒,然后發(fā)送給域名管理服務器。域名管理服務器會通過該域名的標簽來判斷該主機是否有權限訪問相應的域名豁遭,然后返回一個Permit/Deny響應給floodlight控制器叭喜,如果是Permit,則該DNS請求則正常轉發(fā)蓖谢;如果是Deny捂蕴,floodlight控制器會丟棄掉這條請求,該主機便無法訪問此域名闪幽。
首先介紹虛擬網(wǎng)絡和floodlight控制器部分啥辨。
環(huán)境:Ubuntu14.04.1;Mininet 2.2盯腌;Floodlight v1.2
Mininet 是輕量級的軟件定義網(wǎng)絡系統(tǒng)平臺溉知,同時提供了對 OpenFlow 協(xié)議的支持。通俗一點說就是腕够,Mininet可以創(chuàng)建虛擬主機虛擬交換機實現(xiàn)虛擬網(wǎng)絡级乍。
安裝教程鏈接在此
Mininet網(wǎng)上的中文教程其實很多了,就不再贅述帚湘,聊一聊折騰了好久的問題玫荣。其實安裝Mininet時非常簡單的,git clone之后install.sh -a就行客们。但是不知道為什么在我的ubuntu上一直安裝失敗崇决。然后當我輸入Mininet創(chuàng)建網(wǎng)絡的指令的時候,他會提示
這時如果你按照提示通過apt-get安裝Mininet底挫,會默認安裝Mininet2.1版本(當時最新的版本是2.2恒傻,apt-get默認2.1),而我需要使用2.2的一些新功能(后面會提到)建邓,只用將安裝的指令改為install.sh -nfv就行盈厘,當初固執(zhí)的想-all,結果浪費了好多時間官边。
Mininet安裝好之后用sudo mn測試沸手,會自動創(chuàng)建一個包含兩個主機和一個交換機的虛擬網(wǎng)絡。接下來是安裝Floodlight控制器注簿,官網(wǎng)鏈接在此
Floodlight是一種Java的Openflow控制器契吉。SDN的核心理念之一便是控制模塊和數(shù)據(jù)模塊分開,Openflow控制器連在Openflow交換機上诡渴,交換機收到數(shù)據(jù)包后會發(fā)送Packet_in消息將數(shù)據(jù)包發(fā)送給Openflow控制器捐晶,經(jīng)過處理后發(fā)送Packet_out消息返回給交換機,然后交換機進行轉發(fā)。
Floodlight控制器安裝好后下一步便是將控制器連接到Openflow交換機上惑灵,即由Mniniet創(chuàng)建的虛擬交換機山上。首先,我們需要用一段簡單的python代碼實現(xiàn)想要的拓撲結構英支。
#!/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())}
在我們的拓撲圖中佩憾,創(chuàng)建了四個主機和一個交換機,并且四個主機都直接連在交換機上干花。接下來在eclipse中運行floodlight妄帘,這時的floodlight還是沒有任何功能的,可以看做一個正常的交換機把敢。運行后用下面的命令創(chuàng)建網(wǎng)絡拓撲并且連接floodlight到我們創(chuàng)建的虛擬交換機上寄摆。
sudo mn --custom MyTopo.py --topo mytopo --mac --nat --controller=remote,ip=127.0.0.1,port=6653
mn即創(chuàng)建拓撲谅辣;
--custom 使用自己定義的拓撲修赞;
--mac 使mac地址簡化;
--nat 使我們創(chuàng)建的網(wǎng)絡可以連接到Internet桑阶,如果沒有這條指令柏副,我們創(chuàng)建的網(wǎng)絡是沒有連接的外網(wǎng)的,也就是無法ping通Internet的蚣录,--nat只有在2.2及以上版本才有割择;
--controller 選擇虛擬網(wǎng)絡的控制,因為我的Mininet和floodlight都在一臺虛擬機上萎河,所以IP地址是本機地址荔泳,端口6653,可能有些老版的教程還是6633虐杯,這里要注意下玛歌,已經(jīng)統(tǒng)一改為6653端口了。
如圖所示擎椰,我們的虛擬網(wǎng)絡搭建好了支子,在eclipse的控制臺中也能看到,已經(jīng)連接上交換機达舒。
但是依然高興的太早值朋,這時候使用Ping指令你會發(fā)現(xiàn),依然是Ping不通外網(wǎng)的巩搏。
首先昨登,我們用xterm進入任意一個host,然后進入/etc/resolv.conf這個配置文件贯底,如圖所示丰辣。
按下i修改這個配置文件,如果發(fā)現(xiàn)在修改過程中鍵盤失靈,請先安裝vim糯俗。
將nameserver的ip地址改為8.8.8.8尿褪,這是Google提供的免費DNS服務器的IP地址,然后刪掉后面的localdomain得湘。接著按下esc杖玲,輸入:wq保存退出,然后exit退出xterm淘正,回到Mininet的命令行摆马,重新執(zhí)行Ping指令,我們會發(fā)現(xiàn)鸿吆,現(xiàn)在已經(jīng)可以Ping通了囤采。
關于剛才修改文件的內(nèi)容,第一行是默認的DNS服務器地址惩淳;第二行這個local domain我一直沒有找到相關的資料蕉毯,但是根據(jù)最后運行的結論我覺得,這個應該是本地緩存域名之類的思犁,因為在后面的實驗中代虾,當我用floodlight控制器丟棄主機發(fā)送的DNS請求后,比如請求域名為www.baidu.com激蹲,主機收不到DNS響應后棉磨,會發(fā)送一條新的DNS請求,這時的請求域名變成了www.baidu.com.localdomain学辱,如果刪除了localdomain那一行乘瓤,便不會有這條新的DNS請求。所以我猜測策泣,這個localdomain應該是存在交換機上的域名-IP緩存衙傀,主機在第一次請求失敗后,試圖從交換機的緩存中取得請求域名的IP地址着降。
OK了~Mininet和floodlight的配置結束差油,下一步便是在floodlight中實現(xiàn)功能了。