mininet——搭载硬件系统以及host访问互联网和内部网络

       首先介绍一下本次搭建中用到的机器:一台安装了mininet的linux主机,包括了一个扩展四口的网卡;一个路由器;一台Windows笔记本;一台Windows台式机;以及在每台PC上都安装了linux的虚拟机。

1.路由器设置

路由器的设置相对来说是很简单,因为只需要连上网线,插上电源,打开路由器的设置界面,按照步骤一步一步的设置即可,笔者使用的路由器为WRT 1900ACS。需要注意的是,记录一下路由器的内外IP地址以及默认网关,IP地址为192.168.110.55;LAN的IP地址为192.168.1.1;在LAN中使用的是DHCP服务器,开始的IP是192.168.1.100,最大的连接数为100个,所以连接进来的设备IP范围都是在192.168.100到192.168.199之间。

2.扩展网卡的设置

因为之前没有用过扩展网卡,甚至可以说是主机都木有拆过,所以在装之前还大量的看了各种blog,但最终发现,我买的这个网卡无缝的支持Linux,完美的即插即用,于是插在PCIE口上重启就用上了,还不用自己装驱动。ifconfig一下,可以看到多了4个网口。

3.mininet程序运行

# !/usr/bin/python
# define the first struture of system
import re
import sys

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import Node
from mininet.log import setLogLevel, info,error
from mininet.cli import CLI
from mininet.util import quietRun
from mininet.link import Intf

def checkIntf( intf ):
    "Make sure intf exists and is not configured."
    config = quietRun( 'ifconfig %s 2>/dev/null' % intf, shell=True )
    if not config:
        error( 'Error:', intf, 'does not exist!\n' )
        exit( 1 )
    ips = re.findall( r'\d+\.\d+\.\d+\.\d+', config )
    if ips:
        error( 'Error:', intf, 'has an IP address,'
               'and is probably in use!\n' )
        exit( 1 )


class NetworkTopo(Topo):
    def build(self, **opts):
        h1 = self.addNode('h1',ip='192.168.1.110')
        s1 = self.addSwitch('s1')
        self.addLink(h1,s1)

def run():
    # try to get hw intf from the command line; by default, use eth1
    intfName1 = sys.argv[ 1 ] if len( sys.argv ) > 1 else 'eth1'
    info( '*** Connecting to hw intf: %s' % intfName1 )

    info( '*** Checking', intfName1, '\n' )
    checkIntf( intfName1 )

    #detect the second hardware interface 
    if len(sys.argv[2]) > 0 :
        intfName2 = sys.argv[2]
        info( '*** Connecting to other hw intf: %s' % intfName2 )
 
        info( '*** Checking', intfName2, '\n' )
        checkIntf( intfName2 )       
    

    topo = NetworkTopo()
    net = Mininet(topo=topo)

    switch = net.switches[ 0 ]
    info( '*** Adding hardware interface', intfName1, 'to switch',
          switch.name, '\n' )
    _intf1 = Intf( intfName1, node=switch )   


    switch = net.switches[ 0 ]
    info( '*** Adding hardware interface', intfName2, 'to switch',
          switch.name, '\n' )
    _intf2 = Intf( intfName2, node=switch )


        
    #net.addNAT().configDefault()
    net.start()
    net['h1'].cmd('route add default gw 192.168.1.1')
    CLI( net )
    net.stop()

if __name__ == "__main__":
    setLogLevel('info')
    run()

        mininet的虚拟网络中,只有一个虚拟host和一个虚拟switch,并且在虚拟switch加了两个物理接口,其中的一个接口接到了路由器上,让mininet中的host能进行联网;一个接口连接到另外一台台式机,当做是mininet中的一个工作站。当然这两个网口必须都是闲置的,没有被使用的。

        在装mininet的主机中,用到了三个网口:一个enp5s0f1用于连接物理路由器让该主机能够连接互联网;一个eno1用于连接mininet中的交换机和物理路由器,让mininet中的host能够连接互联网以及和mininet周边设备互联;一个enp5s0f0用于连接另外一台台式机,让台式机也加入到系统中。于是还有两个网卡是闲置的,可以再扩展两个工作站。

        因为物理路由器的LAN网段是192.168.1.0,所以在代码中,把host的IP设置为了192.168.1.110,以及模型网关设置为了路由的IP:192.168.1.1。

         在运行代码之前,需要再次的检查一下网口的状态,ifconfig,显示只有enp5s0f0网卡上有IP:192.168.1.165,其他的都没有IP的显示,于是代码按如下运行即可:

sudo python Documents/mininet/one_host.py eno1 enp5s0f1

       还需要把台式机的网络参数设置一下,IP:192.168.1.136,subnetmask:255.255.255.0,gateway:192.168.1.1以及DNS:199.29.29.29和144.144.144.144。DNS是查看Ubuntu中文件/etc/systemd/resolved.conf的DNS设置。

      这时候也可以打开所有PC机中的虚拟机,虚拟机也可以认为是一台设备机。于是所有设备到这个时候算是互联起来了。

4.测试互通性

     先列出所有设备的IP地址:

笔记本电脑:192.168.1.160,其中的虚拟机client1:192.168.1.104,因为采用的桥接模式,所以VM和宿主在同一网段

搭载mininet的主机:192.168.1.165,其中虚拟机host1:192.168.1.135

连接mininet的物理主机1:192.168.1.136

mininet网络中的h1:192.168.1.110

路由器LAN的IP:192.168.1.1,连接外围网络的IP:192.168.110.55(为实验室提供的网络IP,也是私有IP)

可以看出,这些设备都是分布在物理路由器的网络之下,之间通信应该是没有问题。

         尝试使用client1 ping 连接mininet的物理主机,在client1中运行:

ping 192.168.1.136

ping通了,延迟也较高,基本属于在5-15ms之间。

          尝试mininet中的h1 ping client ,在mininet中运行:

h1 ping 192.168.1.104

ping通了,延迟很高,基本属于100-200ms之间。

         尝试mininet中的h1 ping 百度,在mininet中运行:

h1 ping 14.215.177.39

ping通了,延迟只有5ms不到,比之前几个的时延还低,这个问题需要考虑考虑。但证明mininet中的host可以连接互联网了。

当要ping笔记本时,记得把防火墙给关了,不然会无法获得返回的数据。

         一个有趣的事情是,ping 我实验室中的另外一台主机,该主机没有在我路由器的LAN下,它的地址为:192.168.110.87,我的所有的设备,包括了虚拟机都能够ping该主机,当然是主机把防火墙给关了的前提,只有在mininet中的host不能够ping 该主机,有点没有搞懂是因为什么。

        还有一个有趣的事情,因为那台物理台式机是桥接在mininet的虚拟交换机上的,要是把mininet关闭了的话,该主机是无法连接互联网的,所以该主机需要联网时,就需要打开mininet进行连接。

 

        这个只是完成了一个最基本的同网段的连接,接下里需要尝试的是在mininet中定义虚拟路由器和更多的虚拟交换机,从而能够控制链路之间的资源,也可以让mininet连接不同网段的物理设备,以及在物理路由器的LAN中进行不同网段的通信。

     

      不过折腾了这么多天,能够通过mininet把设备连起来已经很开心了,起码不是当初那个对mininet一无所知的小白了,但目前涉及到的mininet方面的知识其实也是很浅的,到之后需要用到的时候再进行学习吧。

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值