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就可以實現所有節點的連通啦~

這篇爲一臺路由連接多臺不同網段主機的實驗實現過程,後面會介紹兩臺主機通過兩臺路由中繼實現連通以及多臺主機通過兩臺路由實現連通的實驗~

 

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