黄志文,福州大学数计学院2014级计算机科学与技术(实验班)本科生,研究侧重于数据平面可编程化。
一、背景
Mininet是由一些虚拟的终端节点(end-hosts)、交换机、路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美,在SDN实验中不乏发现它的身影。在默认的情况下,Mininet是没有链接到网络,自己独立形成一个局域网络。这通常来说是一个好事,隔离了外界网络的干扰,但是有时我们是需要我们创建的网络链接到网络中,比如需要进行主机与远端控制器的通信。这时候就需要我们进行一些相对应的配置来完成我们的目标。
二、环境
- Ubuntu14.04LTS in VM
- Mininet
2.1 Mininet安装
获取源码到本机
1 |
git clone git://github.com/mininet/mininet |
安装Mininet
1 2 |
cd mininet ./util/install.sh [options] |
这里典型的[options]主要有下面几种:
- “-a”:完整安装包括Mininet VM,还包括如Open vSwitch的依赖关系,以及像的OpenFlow Wireshark分离器和POX。默认情况下,这些工具将被安装在你的home目录中。
- “-nfv”:安装Mininet、基于OpenFlow的交换机和Open vSwitch。
- “-s mydir” :在其他选项使用前使用此选项可将源代码建立在一个指定的目录中,而不是在你的home目录。
通常而言,选择完整安装Mininet
1 |
./util/install -a |
2.2 Mininet链接真实网络详解
在Mininet2.2以及往后的版本中,可以通过--nat标签来实现链接
1 |
sudo mn --nat ... |
通过ping指令确认是否与真实网络链接
值得注意的是,默认情况下,所有的这些方法将重路由(reroute)来自Mininet服务器或者VM的本地的流量,并将重定向到Mininet的IP子网当中(默认为10.0.0.0/8)。如果正在使用的LAN中相同的网段,则可能会造成断开链接。可以使用--ipbase来更改这个子网。
我们同样可以通过调用Python API包 Mininet.addNAT() 来达到NAT。
1 2 3 4 |
net = Mininet( topo=... ) net.addNAT().configDefault() net.start() ... |
同时你也可以建立NAT拓扑。
1 2 3 4 5 6 7 8 9 |
class NatTopo( Topo ): def build( self, natIP='10.0.0.254' ): self.hopts = { 'defaultRoute': 'via ' + natIP } hosts = [ self.addHost( h ) for h in 'h1', 'h2' ] s1 = self.addSwitch( 's1' ) for h in hosts: self.addLink( s1, h ) nat1 = self.addNode( 'nat1', cls=NAT, ip=natIP,inNamespace=False ) self.addLink( nat1, s1 ) |
但是这种的实现方法会造成在Mininet中增加了一个nat0主机以达到链接Internet的目的。
在对于网络拓扑有要求的情况下这种方法就显得不太适用。
在Mininet 2.1.0版本试验NAT可以参考 examples目录下的nat.py文件。
在Mininet2.0及其更早的版本的实现的方法是将交换机链接到eth0端口从而实现链接网络的目的。
注意:脚本假定eth0是链接到互联网或者LAN的主机接口,如果不是的的话,你可以进行更改。
将以下语句添加到 /etc/network/interfaces
1 |
iface root-eth0 inet manual |
1 |
sudo mn |
通过OVS命令将s1交换机增加本地端口eth0,开启DHCP功能,并将其ip地址设为跟PC同一个网段下,使其在Mininet的主机与控制器可以进行通信。
1 2 |
sudo ovs-vsctl add-port s1 eth0 sudo ifconfig s1 Host-ip |
此时主机已经可以实现DHCP功能,可以自动分配IP,并且每次运行分配的IP不同。
更多的功能可以参考 https://gist.github.com/lantz/5640610
三、实验应用场景
1 |
sudo mn –topo single,3 –controller=remote,ip=10.0.2.15,p |
Topology: sudo mn --topo=
- tree,n,m 第一个参数为深度,第二个位扇出系数。可以写成--tree,depth=2,fanout=8
- single, n:单个交换机,n个交换机
- liner, n: 线性拓扑,n个交换机
10.0.2.15为floodlight所在服务器的ip。采用6653端口作为openflow通信端口。(6633端口时常被mininet默认控制器占用)
在我们日常使用过程中,可能会遇到需要通过主机跟远端控制器进行通信,但是默认情况下Mininet下的主机却是无法实现的。
比如我们用主机h1去ping控制器所在ip地址10.0.2.15
方法一:这时我们使用mininet的nat标签尝试一下连通网络。
此时我们再用h1 ping一下10.0.2.15和百度
方法二:增加eth0端口
此时我们同样ping一下10.0.2.15
在每次退出mininet之后,建立使用sudo mn -c删除缓存。