一种基于轻量级虚拟化的网络仿真方法
2024-05-20郭亮
郭 亮
(三亚学院信息与智能工程学院,三亚 572022)
0 引言
随着计算机网络的发展,网络研究与实验变得越来越复杂,但高校开展新型网络实验却因硬件投入大、升级更新慢、维护管理复杂等因素阻碍了计算机网络相关教学研究的开展。特别是针对某些需要大量物理设备才能顺利进行的实验,许多普通高校无法提供足够的硬件资源。因此,虚拟实验教学环境的研究已经成为当前教育研究的新热点,究其缘由主要是信息技术的蓬勃发展已经使部分虚拟实验环境的设计与开发成为现实,使各类虚拟实验室建设成为可能。当前,网络仿真实验以及网络仿真软件已有一定的发展基础,例如有Cisco packet tracer、Boson NetSim、Huawei eNSP、GNS3、EVE-NG、Ns3、Opnet,以及基于Docker 技术的多种仿真方案。但上述平台存在不开源、仿真局限性、资源利用率低、上手困难等多种问题[1]。本设计组合开源世界的多个系统软件所构建的计算机网络仿真实验教学平台是解决上述问题的一种有效办法。
1 相关技术
Linux 命名空间是一种操作系统级别的虚拟化技术,它可以将操作系统的资源隔离开来,使得不同的进程可以拥有独立的资源视图。通过使用Linux 命名空间,可以实现多种不同方面的隔离任务,具体包括文件系统隔离、主机域名隔离、进程间通信隔离、PID 编号空间隔离、网络接口隔离和用户号隔离。
Mininet[2]是由斯坦福大学基于Linux 命名空间开发的一种进程级虚拟化网络仿真工具,可以创建包含主机、交换机、控制器和链路的虚拟网络,提供了可视化网络拓扑编辑工具及高度灵活的软件定义网络的编程框架和仿真能力。
FRRouting[3]是一个功能齐全、高性能的Linux 平台的标准路由套装模块,实现了所有的标准路由协议,如BGP、RIP、OSPF、IS-IS 等,以及它们的许多扩展功能,其操作配置过程与Cisco等主流路由器的配置基本相同且容易上手。
2 软件配置
安装FRRouting 软件包并配置开启相关路由服务及隔离功能,安装Mininet 并修改其源码以添加仿真路由器设备的Router 类。其中,关键代码如下所示,主要思路为对每个路由器在各自的网络命名空间中启动路由协议,且不同路由器可加载不同的路由协议,相互之间互不影响。
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()
3 OSPF虚链路实验
3.1 网络拓扑设计
OSPF 组网要求所有非区域0 的其他区域应该直接相邻到区域0上。但现实中可能由于地理分布使得有些OSPF 区域无法直接与区域0 连接。此时,OSPF 的虚链路功能可用于将此区域连上主干区域,从而满足组网条件。OSPF 的虚拟链路有两个重要作用:其一是将非直接相邻于骨干区的区域连接到骨干区;其二是连接分离的骨干区,功能如图1、图2所示。
图1 连接分离的普通区域与骨干区
图2 连接分离的骨干区
下面选虚链路的第一种用途进行仿真方法验证,具体网络拓扑结构和IP 地址规划见图3,区域2 需要通过路由器r3 与r1 建立的虚链路连接上区域0。
图3 网络拓扑及IP分配
运行miniedit.py,对照拓扑设计完成如图4所示的网络拓扑设计。
图4 OSPF网络拓扑设计
将上图导出拓扑为Python 脚本并调整其关键代码如下所示:
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’})
3.2 验证基本配置
运行上述脚本,首先验证拓扑连接情况及主机h1 和路由器r3 的初始配置及路由表,如图5~图7所示。
图5 验证拓扑结构
图6 主机和路由器r3的ip地址验证
图7 路由器r3的初始路由信息
3.3 OSPF配置及测试
对四个路由器r1、r2、r3、r4 进行网络配置,如图8 所示,其中在r1 与r3 之间建立虚链路,经过一小段时间路由收敛后,通过查看r3的OSPF 邻居和路由表验证虚链路建立成功,如图8所示。
图8 路由器配置和路由验证
在网络收敛后,进行主机h1、h2 连通性测试及通信路径测试,验证了配置的正确性,如图9所示。
图9 主机连通性测试和路径测试
最后,在r1 的r1-eth1 端口开启wireshark 抓包分析,验证了OSPF的hello多播包和虚链路建立的单播hello包通告,如图10所示。
图10 抓包分析
4 结语
本文针对目前已有网络仿真软件存在的问题,基于Linux 命名空间隔离技术和相关开源技术设计出一种全虚拟化的计算机网络仿真方法。由于采用了轻量级虚拟化技术,经测试该方法支持在硬件配置为1 核1GB 内存的虚拟机上运行近百个路由器并且实验操作简便快捷,这为构建大规模网络以进行研究和测试提供了一种途径,有效地支撑了计算机网络的研究与教学,降低了实验投入和维护。后续工作将结合云计算技术开发网页版网络仿真平台,使多个用户能通过在线方式将虚拟网络部署在云服务器上。