郭 亮
(三亞學(xué)院信息與智能工程學(xué)院,三亞 572022)
隨著計算機(jī)網(wǎng)絡(luò)的發(fā)展,網(wǎng)絡(luò)研究與實驗變得越來越復(fù)雜,但高校開展新型網(wǎng)絡(luò)實驗卻因硬件投入大、升級更新慢、維護(hù)管理復(fù)雜等因素阻礙了計算機(jī)網(wǎng)絡(luò)相關(guān)教學(xué)研究的開展。特別是針對某些需要大量物理設(shè)備才能順利進(jìn)行的實驗,許多普通高校無法提供足夠的硬件資源。因此,虛擬實驗教學(xué)環(huán)境的研究已經(jīng)成為當(dāng)前教育研究的新熱點,究其緣由主要是信息技術(shù)的蓬勃發(fā)展已經(jīng)使部分虛擬實驗環(huán)境的設(shè)計與開發(fā)成為現(xiàn)實,使各類虛擬實驗室建設(shè)成為可能。當(dāng)前,網(wǎng)絡(luò)仿真實驗以及網(wǎng)絡(luò)仿真軟件已有一定的發(fā)展基礎(chǔ),例如有Cisco packet tracer、Boson NetSim、Huawei eNSP、GNS3、EVE-NG、Ns3、Opnet,以及基于Docker 技術(shù)的多種仿真方案。但上述平臺存在不開源、仿真局限性、資源利用率低、上手困難等多種問題[1]。本設(shè)計組合開源世界的多個系統(tǒng)軟件所構(gòu)建的計算機(jī)網(wǎng)絡(luò)仿真實驗教學(xué)平臺是解決上述問題的一種有效辦法。
Linux 命名空間是一種操作系統(tǒng)級別的虛擬化技術(shù),它可以將操作系統(tǒng)的資源隔離開來,使得不同的進(jìn)程可以擁有獨立的資源視圖。通過使用Linux 命名空間,可以實現(xiàn)多種不同方面的隔離任務(wù),具體包括文件系統(tǒng)隔離、主機(jī)域名隔離、進(jìn)程間通信隔離、PID 編號空間隔離、網(wǎng)絡(luò)接口隔離和用戶號隔離。
Mininet[2]是由斯坦福大學(xué)基于Linux 命名空間開發(fā)的一種進(jìn)程級虛擬化網(wǎng)絡(luò)仿真工具,可以創(chuàng)建包含主機(jī)、交換機(jī)、控制器和鏈路的虛擬網(wǎng)絡(luò),提供了可視化網(wǎng)絡(luò)拓?fù)渚庉嫻ぞ呒案叨褥`活的軟件定義網(wǎng)絡(luò)的編程框架和仿真能力。
FRRouting[3]是一個功能齊全、高性能的Linux 平臺的標(biāo)準(zhǔn)路由套裝模塊,實現(xiàn)了所有的標(biāo)準(zhǔn)路由協(xié)議,如BGP、RIP、OSPF、IS-IS 等,以及它們的許多擴(kuò)展功能,其操作配置過程與Cisco等主流路由器的配置基本相同且容易上手。
安裝FRRouting 軟件包并配置開啟相關(guān)路由服務(wù)及隔離功能,安裝Mininet 并修改其源碼以添加仿真路由器設(shè)備的Router 類。其中,關(guān)鍵代碼如下所示,主要思路為對每個路由器在各自的網(wǎng)絡(luò)命名空間中啟動路由協(xié)議,且不同路由器可加載不同的路由協(xié)議,相互之間互不影響。
class Router(Node):
def config(self,**params):
super(Router,self).config(**params)
self.cmd(‘sysctl net.ipv4.ip_forward=1’)
self.cmd(‘mkdir/var/run/mininet_frr’)
self.cmd(“mount-t tmpfs tmpfs/var/run/
mininet_frr”)
self.cmd(“cp-a/etc/frr/*/var/run/
mininet_frr”)
self.cmd(“mount-bind/var/run/
mininet_frr/etc/frr”)
self.cmd(“mount-t tmpfs tmpfs/var/
run/frr”)
self.cmd(“mount-t tmpfs tmpfs/var/
tmp/frr”)
def terminate(self):
self.cmd(‘sysctl net.ipv4.ip_forward=0’)
self.cmd(“umount/etc/frr”)
self.cmd(“umount/var/run/mininet_frr”)
self.cmd(‘rm-rf/var/run/mininet_frr’)
super(Router,self).terminate()
OSPF 組網(wǎng)要求所有非區(qū)域0 的其他區(qū)域應(yīng)該直接相鄰到區(qū)域0上。但現(xiàn)實中可能由于地理分布使得有些OSPF 區(qū)域無法直接與區(qū)域0 連接。此時,OSPF 的虛鏈路功能可用于將此區(qū)域連上主干區(qū)域,從而滿足組網(wǎng)條件。OSPF 的虛擬鏈路有兩個重要作用:其一是將非直接相鄰于骨干區(qū)的區(qū)域連接到骨干區(qū);其二是連接分離的骨干區(qū),功能如圖1、圖2所示。
圖1 連接分離的普通區(qū)域與骨干區(qū)
圖2 連接分離的骨干區(qū)
下面選虛鏈路的第一種用途進(jìn)行仿真方法驗證,具體網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和IP 地址規(guī)劃見圖3,區(qū)域2 需要通過路由器r3 與r1 建立的虛鏈路連接上區(qū)域0。
圖3 網(wǎng)絡(luò)拓?fù)浼癐P分配
運(yùn)行miniedit.py,對照拓?fù)湓O(shè)計完成如圖4所示的網(wǎng)絡(luò)拓?fù)湓O(shè)計。
圖4 OSPF網(wǎng)絡(luò)拓?fù)湓O(shè)計
將上圖導(dǎo)出拓?fù)錇镻ython 腳本并調(diào)整其關(guān)鍵代碼如下所示:
class NetworkTopo(Topo):
def build(self,**_opts):
h1=self.addHost(‘h1’,ip=‘192.168.1.10/24’,
defaultRoute=‘via 192.168.1.1’)
h2=self.addHost(‘h2’,ip=‘192.168.2.10/24’,
defaultRoute=‘via 192.168.2.1’)
s1,s2=[self.addSwitch(s)for s in(‘s1’,
‘s2’,‘s3’)]
r1=self.addNode(‘r1’,cls=Router,ip=None)
r2=self.addNode(‘r2’,cls=Router,ip=None)
r3=self.addNode(‘r3’,cls=Router,ip=None)
r4=self.addNode(‘r4’,cls=Router,ip=None)
self.addLink(h1,s1,intfName2=‘s1-eth2’)
self.addLink(h2,s2,intfName2=‘s2-eth2’)
self.addLink(s1,r3,intfName1=‘s1-eth1’,
intfName2=‘r3-eth1’,params2={‘ip’:‘192.168.1.1/24’})
self.addLink(s2,r4,intfName1=‘s2-eth1’,
intfName2=‘r4-eth1’,params2={‘ip’:‘192.168.2.1/24’})
self.addLink(r1,r2,intfName1=‘r1-eth1’,
params1={‘ip’:‘192.168.12.1/30’},intfName2=
‘r2-eth0’,params2={‘ip’:‘192.168.12.2/30’})
self.addLink(r1,r4,intfName1=‘r1-eth0’,
params1={‘ip’:‘192.168.14.1/30’},intfName2=
‘r4-eth0’,params2={‘ip’:‘192.168.14.2/30’})
self.addLink(r2,r3,intfName1=‘r2-eth1’,
params1={‘ip’:‘192.168.23.1/30’},intfName2=
‘r3-eth0’,params2={‘ip’:‘192.168.23.2/30’})
運(yùn)行上述腳本,首先驗證拓?fù)溥B接情況及主機(jī)h1 和路由器r3 的初始配置及路由表,如圖5~圖7所示。
圖5 驗證拓?fù)浣Y(jié)構(gòu)
圖6 主機(jī)和路由器r3的ip地址驗證
圖7 路由器r3的初始路由信息
對四個路由器r1、r2、r3、r4 進(jìn)行網(wǎng)絡(luò)配置,如圖8 所示,其中在r1 與r3 之間建立虛鏈路,經(jīng)過一小段時間路由收斂后,通過查看r3的OSPF 鄰居和路由表驗證虛鏈路建立成功,如圖8所示。
圖8 路由器配置和路由驗證
在網(wǎng)絡(luò)收斂后,進(jìn)行主機(jī)h1、h2 連通性測試及通信路徑測試,驗證了配置的正確性,如圖9所示。
圖9 主機(jī)連通性測試和路徑測試
最后,在r1 的r1-eth1 端口開啟wireshark 抓包分析,驗證了OSPF的hello多播包和虛鏈路建立的單播hello包通告,如圖10所示。
圖10 抓包分析
本文針對目前已有網(wǎng)絡(luò)仿真軟件存在的問題,基于Linux 命名空間隔離技術(shù)和相關(guān)開源技術(shù)設(shè)計出一種全虛擬化的計算機(jī)網(wǎng)絡(luò)仿真方法。由于采用了輕量級虛擬化技術(shù),經(jīng)測試該方法支持在硬件配置為1 核1GB 內(nèi)存的虛擬機(jī)上運(yùn)行近百個路由器并且實驗操作簡便快捷,這為構(gòu)建大規(guī)模網(wǎng)絡(luò)以進(jìn)行研究和測試提供了一種途徑,有效地支撐了計算機(jī)網(wǎng)絡(luò)的研究與教學(xué),降低了實驗投入和維護(hù)。后續(xù)工作將結(jié)合云計算技術(shù)開發(fā)網(wǎng)頁版網(wǎng)絡(luò)仿真平臺,使多個用戶能通過在線方式將虛擬網(wǎng)絡(luò)部署在云服務(wù)器上。