mininet多网段主机路由实验配置

最近试了一下mininet的使用方法,觉得很有意思,现在总结一下路由配置的方法。

实验的主要内容为一台路由器连接多台不同网段的主机,实现多网段主机之间的通信,实验拓扑图如下:

 

然后来实现拓扑。拓扑配置直接用python脚本会比较复杂,所以我使用了miniedit,miniedit是mininet的一个可视化工具,用以下指令打开。

cd mininet/mininet/examples
./miniedit.py

执行后会跳出以下界面:

然后建立拓扑如图所示(注意:在连接链路时最好按主机名顺序向路由器连接,因为路由器网卡接口对主机到的分配是按顺序的,如果乱序到后面配置会很麻烦。):

然后右键点击拓扑中的主机设置IP地址,将h1-h5地址配置为下表所示(一定记得在地址后面加/24配置好子网掩码,如果不加则子网掩码为255.0.0.0,网络是通不了的。如果忘记加/24也可以在后面过程中启动CLI终端后用h* ifconfig netmask 255.255.255.0更改掩码,*代表主机号):

主机 h1 h2 h3 h4 h5
IP地址 192.168.8.1/24 192.168.9.1/24 192.168.10.1/24 192.168.11.1/24 192.168.12.1/24

配置好后点击左上角Edit->Preferences,然后选择Start CLI->OK,如下图所示:

然后继续点击左上角File->Export Level...将该拓扑保存为python脚本,方便后续的更改。

到此miniedit使用就结束了~,让我们开始编写脚本吧!脚本的编写难度不大,初学者很容易上手。

首先大家可以试一下运行python脚本,我把脚本命名为topo.py,在终端首先进入脚本文件所在位置,然后输入

sudo su         #进入root模式
python topo.py  #启动脚本

然后就会进入CLI命令台,输入pingall测试节点连通性,结果肯定是不通的,这是因为没有为主机配置网关,主机的包不会被发送到路由器去进行转发。

所以我们可以对每个主机进行路由配置,路由配置可以在CLI直接输入指令配置,但是这样的配置方式是一次性的,第二次启动脚本时主机的配置又会回到原来的状态,所以这里强烈建议直接写入python脚本。

我们设计的方案如下图所示,

所以我们的主要目的是为路由器r1的每个接口配置好与主机同网段的IP地址,然后把主机的网关设置为路由器相应接口的地址就好。所以在脚本中加入r1和各主机在启动时需要执行的指令,节点执行指令的代码写作
 

h*.cmd('   可执行指令        ')
r*.cmd('   可执行指令        ')
s*.cmd('   可执行指令        ')

h代表主机,r代表路由器,s代表交换机。然后把配置路由指令都写到脚本即可。注意所有节点指令执行代码都必须放在脚本的CLI(net)这行代码前,如果是用miniedit生成的脚本,会有info( '*** Post configure switches and hosts\n')的提醒,可以把命令都放在这个提示后面,不能放在网络启动代码前,否则命令不会被执行。

#!/usr/bin/python

from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call

def myNetwork():

    net = Mininet( topo=None,
                   build=False,
                   ipBase='10.0.0.0/8')

    info( '*** Adding controller\n' )
    info( '*** Add switches\n')
    r1 = net.addHost('r1', cls=Node, ip='0.0.0.0')

    info( '*** Add hosts\n')
    h1 = net.addHost('h1', cls=Host, ip='192.168.8.1/24', defaultRoute=None)
    h2 = net.addHost('h2', cls=Host, ip='192.168.9.1/24', defaultRoute=None)
    h3 = net.addHost('h3', cls=Host, ip='192.168.10.1/24', defaultRoute=None)
    h4 = net.addHost('h4', cls=Host, ip='192.168.11.1/24', defaultRoute=None)
    h5 = net.addHost('h5', cls=Host, ip='192.168.12.1/24', defaultRoute=None)
   

    info( '*** Add links\n')
    net.addLink(h1, r1, cls=TCLink , **h1r1)
    net.addLink(h2, r1, cls=TCLink , **h2r1)
    net.addLink(h3, r1, cls=TCLink , **h3r1)
    net.addLink(r1, h4, cls=TCLink , **r1h4)
    net.addLink(r1, h5, cls=TCLink , **r1h5)

    info( '*** Starting network\n')
    net.build()
    info( '*** Starting controllers\n')
    for controller in net.controllers:
        controller.start()

    info( '*** Starting switches\n')

    info( '*** Post configure switches and hosts\n')
    r1.cmd('ifconfig r1-eth0 192.168.8.2 netmask 255.255.255.0')
    r1.cmd('ifconfig r1-eth1 192.168.9.2 netmask 255.255.255.0')
    r1.cmd('ifconfig r1-eth2 192.168.10.2 netmask 255.255.255.0')
    r1.cmd('ifconfig r1-eth3 192.168.11.2 netmask 255.255.255.0')
    r1.cmd('ifconfig r1-eth4 192.168.12.2 netmask 255.255.255.0')

    h1.cmd('route add default gw 192.168.8.2')
    h2.cmd('route add default gw 192.168.9.2')
    h3.cmd('route add default gw 192.168.10.2')
    h4.cmd('route add default gw 192.168.11.2')
    h5.cmd('route add default gw 192.168.12.2')
 
    r1.cmd('sysctl net.ipv4.ip_forward=1')
  
    CLI(net)
    net.stop()

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

上文代码中以下部分为路由配置部分,如果我在前文中的解释不够清楚,大家可以结合图看一下,很轻松就明白原理了~

最后再次执行python脚本,在CLI输入pingall就可以实现所有节点的连通啦~

这篇为一台路由连接多台不同网段主机的实验实现过程,后面会介绍两台主机通过两台路由中继实现连通以及多台主机通过两台路由实现连通的实验~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章