iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
0
自我挑戰組

SDN/NFV 網路虛擬化調度平台系列 第 18

Day18 - Mininet介紹與實做 II

  • 分享至 

  • xImage
  •  

前言

昨天介紹了Mininet基本的使用方法與相關實用工具結合的應用,今天會繼續介紹Mininet與加入OpenFlow的學習

使用自定義的Python腳本

使用Mininet的Python API來定義網路拓樸,好處是能快速的移植到新的環境,部署相同的網路拓樸。
下面的範例是要模擬不同網段的實現,使用Node元件啟用轉發功能模擬路由器效果

#!/usr/bin/python
from mininet.topo import Topo
from mininet.node import Node

#繼承Mininet node類別
class LinuxRouter( Node ):
    #實做設定方法,啟用轉發功能
    def config( self, **params ):
        super( LinuxRouter, self).config( **params )
        self.cmd( 'sysctl net.ipv4.ip_forward=1' )
    #實做關閉方法,取消轉發功能
    def terminate( self ):
        self.cmd( 'sysctl net.ipv4.ip_forward=0' )
        super( LinuxRouter, self ).terminate()

#繼承Mininet topo類別
class MyTopo( Topo ):

    def __init__( self ):
        #運行父類別init方法
        Topo.__init__( self )
        #定義預設ip
        defaultIP = '192.168.1.1/24'
        #加入上方定義的LinuxRouter元件
        router = self.addNode( 'r0', cls=LinuxRouter, ip=defaultIP )
        #定義交換器元件 s1,s2
        s1, s2 = [ self.addSwitch( s ) for s in ( 's1', 's2' ) ]
        #將交換器與LinuxRouter串連
        self.addLink( s1, router, intfName2='r0-eth1',
                      params2={ 'ip' : defaultIP } )
        self.addLink( s2, router, intfName2='r0-eth2',
                      params2={ 'ip' : '172.16.0.1/24' } )
        #添加虛擬主機 h1,h2 並設定在不同網段
        h1 = self.addHost( 'h1', ip='192.168.1.100/24',
                           defaultRoute='via 192.168.1.1' )
        h2 = self.addHost( 'h2', ip='172.16.0.100/24',
                           defaultRoute='via 172.16.0.1' )
        #虛擬主機與交換器串連
        for h, s in [ (h1, s1), (h2, s2) ]:
            self.addLink( h, s )

#定義拓樸變數dict key=mytopo,value=上方自定義拓樸物件
topos = { 'mytopo': ( lambda: MyTopo() ) }

使用以上程式時,需要把註解刪除,有中文時編碼會出錯

使用--custom載入自定義腳本與--topo指定拓樸名稱

mn --custom ./router.py --topo mytopo

查看h1 ip為程式定義的192.168.1.100
https://ithelp.ithome.com.tw/upload/images/20191003/20121070ORU9Ez7Nyh.png
查看h2 ip為程式定義的172.16.0.100
https://ithelp.ithome.com.tw/upload/images/20191003/20121070b2vJmqkpBK.png
使用ping工具測試網路連線狀況
https://ithelp.ithome.com.tw/upload/images/20191003/20121070Zh0Ul4MDkm.png

練習OpenFlow

學習如何添加vlan tag隔離在相同網段上的實體主機,圖表示h1與h3的封包添加vid20,藉此隔離在相同網段(10.0.0.0/24)間的溝通(h1與h2)
https://ithelp.ithome.com.tw/upload/images/20191003/20121070racIlseeT5.png
建立以上圖的拓樸,並測試全部的主機連線
查看ovs上面的port與ovs上的flow規則

預設switch規則有Normal行為的Flow,也就是實做一般L2 switch的轉發功能(學習mac位址)

mn --topo=single,4
pingall
sh ovs-ofctl show s1
sh ovs-ofctl dump-flows s1

對進入port 1的封包加上vlan tag 並轉送到table表1

sh ovs-ofctl add-flow s1 "table=0, priority=20, in_port=1, actions=mod_vlan_vid:20, resubmit(,1)"

對進入port 3的封包加上vlan tag 並轉送到table表1

sh ovs-ofctl add-flow s1 "table=0, priority=20, in_port=3, actions=mod_vlan_vid:20, resubmit(,1)"

測試規則:模擬來源port 1的封包進入

sh ovs-appctl ofproto/trace s1 in_port=1

可以看到下圖,有匹配到in_port=1的規則,但目前沒有table表1,所以結果會顯示drop封包
https://ithelp.ithome.com.tw/upload/images/20191003/20121070bZBy0fC2ms.png
最後加入表1,並且拔除vlan tag並轉送到相應的端口

sh ovs-ofctl add-flow s1 "table=1, priority=30, in_port=1, dl_vlan=20, actions=strip_vlan,3"
sh ovs-ofctl add-flow s1 "table=1, priority=30, in_port=3, dl_vlan=20, actions=strip_vlan,1"

使用ping工具測試h1與h2和h3的連線狀況,可以看到h1、h3連線成功,但h1、h2無法連線
https://ithelp.ithome.com.tw/upload/images/20191003/20121070Oq7YeCJGor.png
n_packets欄位表示通過的封包數量
https://ithelp.ithome.com.tw/upload/images/20191003/20121070tdfiJPxlQ9.png

Reference

https://github.com/mininet/mininet/tree/master/examples
https://github.com/mininet/openflow-tutorial/wiki/Create-a-Learning-Switch


上一篇
Day17 - Mininet介紹與實做 I
下一篇
Day19 - Mininet 與 ONOS I
系列文
SDN/NFV 網路虛擬化調度平台30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言