将Mininet与真实网络相连接

原文发表在我的博客主页,转载请注明出处

前言

Mininet是SDN网络仿真的一大利器,在小规模网络模拟使用上独领风骚,其开源性允许使用者按照自己的需求修改源码,得到想要的数据,其提供了多个函数用来满足用户的需求,十分方便。
OpenvSwitch(OVS)是一个基于Linux内核的虚拟交换机,可以取代Linux网络协议栈,并且效果十分好,OVS的应用十分广泛,在云计算和SDN网络虚拟化中都有重要的应用平台。
有的时候,我们需要Mininet模拟的网络和真实网络通信,利用OVS搭建一个网桥,便可以实现这样的功能。

原理

以例子来讲解,有如下场景,在一个host上面用Mininet搭建了一个网络,这个网络有两个主机h1和h2,一个交换机s1,一个控制器c0,将交换机s1和主机host的网口绑定,原理图如下:

Mininet创建拓扑的方法

Mininet创建拓扑主要有两种方法:

  • 创建一个拓扑类,在命令行通过--topo选项指定使用此拓扑
  • Mininet支持参数化拓扑,通过python代码创建一个灵活的拓扑结构,而且可以灵活实现额外的功能需求,本文就是使用这种方式创建拓扑的

代码解析

源代码见github
源码需要注意的注释如下:

#!/usr/bin/env python
import os
from mininet.net import Mininet
from mininet.node import Controller, RemoteController
from mininet.cli import CLI
from mininet.link import Intf
from mininet.log import setLogLevel, info

def ToRealnet():

    net = Mininet( topo=None, build=False)

    info( '*** Adding controller\n' )
    net.addController(name='cotyb')

    info( '*** Add switches\n')
    s1 = net.addSwitch('s1')
    
    info( '*** Add hosts\n')
    h1 = net.addHost('h1', ip='0.0.0.0')
    h2 = net.addHost('h2', ip='0.0.0.0')

    info( '*** Add links\n')
    net.addLink(h1, s1)
    net.addLink(h2, s1)
    
    info( '*** Starting network\n')
    net.start()
    os.popen('ovs-vsctl add-port s1 eth0')       #绑定s1和host的eth0接口
    h1.cmdPrint('dhclient '+h1.defaultIntf().name)      #给h1的网口用DHCP动态分配IP
    h2.cmdPrint('dhclient '+h2.defaultIntf().name)      ##给h2的网口用DHCP动态分配IP
    CLI(net)
    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    ToRealnet()

实验

通过python运行源代码生成拓扑,然后用xterm h1打开h1的终端,使用*ifconfig命令,结果如下图,可以看出红框中的IP地址:192.168.29.179,和host处于同一网段,而且多次运行,发现分配的IP是不一样的,说明是动态分配的

接下来再在h1的终端下ping和host统一网段的主机,结果如下:

总结

通过上面的原理和实验,可以看出成功的将Mininet中的网络和实际网络结合在了一起,这在某些场合是十分有用的

posted @ 2016-01-26 22:35  cotyb  阅读(6262)  评论(15编辑  收藏  举报
AmazingCounters.com