mininet ve ONOS ile örnek uygulama

      Yorum yok mininet ve ONOS ile örnek uygulama

VMware üzerine debian kurulumu için burayı tıklayın.
debian üzerine mininet ve ONOS kurulumu için burayı tıklayın.

Uygulama için kullanılacak ağın gösterimi / topolojisi

Uygulama kodları

#!/usr/bin/python

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import Node,Controller, OVSKernelSwitch, RemoteController
from mininet.log import setLogLevel, info
from mininet.cli import CLI

from mininet.link import TCIntf
from mininet.link import TCLink

class LinuxRouter( Node ):
"A Node with IP forwarding enabled. / Bir Node icin IP for aktif ediliyor."

def config( self, **params ):
super( LinuxRouter, self).config( **params )
# Enable forwarding on the router
self.cmd( 'sysctl net.ipv4.ip_forward=1' )

def terminate( self ):
self.cmd( 'sysctl net.ipv4.ip_forward=0' )
super( LinuxRouter, self ).terminate()

class NetworkTopo( Topo ):
"A LinuxRouter connecting three IP subnets / LinuxRouter uc alt aga baglaniyor."

def build( self, **_opts ):

defaultIP = '192.168.1.1/24' # r0-eth1 icin IP yapilandirmasi
router = self.addNode( 'r0', cls=LinuxRouter, ip=defaultIP )

# switch'ler ekleniyor.
s1, s2, s3 = [ self.addSwitch( s ) for s in ( 's1', 's2', 's3' ) ]

# switch'ler baglaniyor.
self.addLink( s1, router, cls=TCLink, enable_enc = True, enable_red = True, intfName2='r0-eth1', params2={ 'ip' : defaultIP } ) # for clarity
self.addLink( s2, router, cls=TCLink, bw=100, enable_enc = True, enable_red = True, intfName2='r0-eth2', params2={ 'ip' : '172.16.0.1/16' } )
self.addLink( s3, router, intfName2='r0-eth3', params2={ 'ip' : '10.0.0.1/8' } )

# host'lar ekleniyor. defaultRoute'a dikkat !
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/12', defaultRoute='via 172.16.0.1' )
h3 = self.addHost( 'h3', ip='10.0.0.100/8', defaultRoute='via 10.0.0.1' )

# h1,h2 ve h3 hostlari baglaniyor.
for h, s in [ (h1, s1), (h2, s2), (h3, s3) ]:
self.addLink( h, s )

# host'lar ekleniyor. defaultRoute'a dikkat !
client = self.addHost( 'client', ip='192.168.1.101/24', defaultRoute='via 192.168.1.1' )
hostECNt = self.addHost( 'hostECNt', ip='192.168.1.102/24', defaultRoute='via 192.168.1.1' )
hostREDt = self.addHost( 'hostREDt', ip='192.168.1.103/24', defaultRoute='via 192.168.1.1' )

speedSrv = self.addHost( 'speedSrv', ip='172.16.0.101/16', defaultRoute='via 172.16.0.1' )

webServer1 = self.addHost( 'webServer1', ip='10.0.0.101/8', defaultRoute='via 10.0.0.1' )
webServer2 = self.addHost( 'webServer2', ip='10.0.0.102/8', defaultRoute='via 10.0.0.1' )
webServer3 = self.addHost( 'webServer3', ip='10.0.0.103/8', defaultRoute='via 10.0.0.1' )

# hostlar baglaniyor. TCLink parametrelerine dikkat !
self.addLink( client, s1 )
self.addLink( hostECNt, s1, cls=TCLink, enable_enc = True )
self.addLink( hostREDt, s1, cls=TCLink, enable_red = True)

self.addLink( speedSrv, s2, cls=TCLink, enable_enc = True, enable_red = True, )

self.addLink( webServer1, s3)
self.addLink( webServer2, s3, cls=TCLink, bw=10)
self.addLink( webServer3, s3, cls=TCLink, bw=10, delay='100ms', jitter = '1ms', loss=1 )

def run():
"Test linux router"
topo = NetworkTopo()

# Mininet sinifindan obje initialize edliyor ve net adli referansa ataniyor.. build = False dikkat !!
net = Mininet(topo=topo,controller=RemoteController, build = False)

# c0 adli remote controller ekleniyor.
c0 = net.addController('c0', controller=RemoteController, ip="192.168.2.2")

# build metodu ile yukaridaki yapailandirmaya uygun sekilde net adli object referansi configure ediliyor.
net.build()

# Network yukaridaki configurasyona gore baslatiliyor.
net.start()

info( '*** Routerdaki yonlendirme tablosu :\n' )
info( net[ 'r0' ].cmd( 'route' ) )
CLI( net )
net.stop()

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

Projenin çalıştırılması

root@sun:/opt/mininet/mininet/custom# python proje-v0.6.py

mininet komutları

Komut

Açıklama

# /opt/onos/bin/onos-service start

ONOS servisini start eder.

# python proje-v0.2.py

Projeyi çalıştırır.

mininet> pingall

Tüm hostlara karşılıklı ping atılır.

mininet> help

Yardım komutu, kullanılabilecek komutları listeler.

mininet> nodes

Node/cihazları listeler.

mininet> net

Bağlantı bazında ağı listeler

mininet> dump

Bağlantı ve IP yapılandırması bazında ağı listeler.

mininet> h1 ifconfig

H1’in ip yapılandırmasını gösterir.

mininet> h1 ping h2

H1 den h2’ye ping atar.

mininet> xterm h1

h1 isimli node’a xterm ile terminal erişimi açar.

mininet> exit

Mininet’den çıkar.

mn -c

Mininet emülatorünün bellek temizliğini yapar.

ONOS ortamı ve komutları

KOMUT

AÇIKLAMA

http://192.168.2.2:8181/onos/ui/login.html

ONOS GUI erişimi (onos /rocks)

Ö

Grafik arabirimi yardım menüsünü açar

H

Hostları gösterir.

# ssh karaf@192.168.2.2 -p 8101

ONOS CLI erişimi

karaf@root > help

Yardım komutu, kullanılabilecek komutları listeler.

karaf@root > devices

Switchleri listeler

karaf@root > hosts

Hostları listeler

karaf@root > flows

Flow tablosunu/tablolarını gösterir.
Switchler flow tablolarındaki kurallara göre çalışır. Kurallar app komutu ile yüklenir. Flow tabloları önemlidir.

karaf@root > apps -a -s

ONOS’da yüklü modülleri listeler.

> app activate org.onosproject.fwd

Ping için Forwaring modulunu yükler

karaf@root > wipe-out pelase 

Temizler. (Önce mininet tarafı destroy edildikten sonra çalıştırılmalı !

Uygulamalar

Uygulama 1 : ping kullanımı

h1 ping h2

h1 den
h2’ye ping atar.

h1 ping webServer1

h1 den webServer1’e ping atar.

pingall

Karşılıklı
tüm hostlara ping atar

addLink ile bağlantıları özelleştirmek

Teorik Bilgi ;
addLink metodu içerisinde TCLink özellikleri ile link(bağlantı) özelleştirmek.

def mininet.link.TCIntf.config (

self,

 

bw = None,

Bant
genişliği,  mbit/sn

delay = None,

Gecikme,
zaman

jitter = None,

İletim
ortamı kaynaklı bozulma

loss = None,

Paket
kaybı

gro = False,

 

txo = True,

Gönderim
hata kontrolü

rxo = True,

Alım
hata kontrolü

speedup = 0,

Switch
bazlı bandwith ( deneysel )

use_hfsc = False,

Hfsc (hierarchical fair-service curve)
algoritması

use_tbf = False,

Tbf (token bucket filter)
algoritması

latency_ms = None,

 

enable_ecn = False,

Ecn
(explicit congestion notification)

enable_red = False,

Https://en.wikipedia.org/wiki/random_early_detection

max_queue_size = None,

Maximum
kuyruk boyutu

params 

 

)

Uygulama 2 : iperf İle Bant Genişliği Uygulamaları

mininet> iperf h1
webServer1

 

Bant genişliği sınırlaması yok. Çıktı;

*** Iperf: testing TCP
bandwidth between h1 and webServer1

*** Results: [‘29.2
Gbits/sec’, ‘29.2 Gbits/sec’]

mininet> iperf h1
webServer2

 

self.addLink( webServer2,
s3, cls=TCLink, bw=10)
ile bant
genişliği sınırlaması yapıldı. Test çıktısı;

*** Iperf: testing TCP
bandwidth between h1 and webServer2

*** Results: [‘9.57 Mbits/sec’, ‘12.4 Mbits/sec’]

mininet> iperf h1
webServer3

 

self.addLink( webServer3,
s3, cls=TCLink, bw=10, delay=’100ms’, jitter = ‘1ms’, loss=1 )
ile bant
genişliği, delay, jitter ve loss parameterleri verilmiş hatta bant genişliği
test çıktısı;

*** Iperf: testing TCP
bandwidth between h1 and webServer3

*** Results: [‘1.20 Mbits/sec’, ‘1.49 Mbits/sec’]

h1 ping webServer3

self.addLink( webServer3,
s3, cls=TCLink, bw=10, delay=’100ms’, jitter = ‘1ms’, loss=1 )
ile bant
genişliği, delay, jitter ve loss parameterleri verilmiş hatta ping test
çıktısı; (response’larin 200 ms ve daha büyük olduğuna dikkat ! 100ms delay
verildi ama ama 200 çıktı neden ? jitter ve loss ?)

PING 10.0.0.103 (10.0.0.103) 56(84) bytes of data.

64 bytes from 10.0.0.103: icmp_seq=1 ttl=63 time=207 ms

64 bytes from 10.0.0.103: icmp_seq=2 ttl=63 time=200 ms

64 bytes from 10.0.0.103: icmp_seq=3 ttl=63 time=200 ms

^X64 bytes from 10.0.0.103: icmp_seq=4 ttl=63 time=200 ms

^C

Bu aşamada enable_enc = True, enable_red = True edilmiş hatlarda  üç adet bant genişliği testi yapılacaktır.

  1. h1  – speedSrv arası  self.addLink( h1, s1 )
  2. hostECNt – speedSrv arası   self.addLink( hostECNt, s1, cls=TCLink, enable_enc = True
  3. hostREDt – speedSrv arası. self.addLink( hostREDt, s1, cls=TCLink, enable_red = True)

speedSrv’da yapılacak işlemler

mininet> xterm speedSrv

speedSrv için xterm aç.

iperf -s -p 4535 -i 1

speedSrv içinde iperf servisini sunucu olarak başlat.

 

Sırasıyla, h1, hostECNt ve hostREDt hostlarında yapılacak işler.

iperf -c 172.16.0.101 -p 4535 -t 15

Verilen ip:port (socket) bilgisiyle  sunucuya istemci olarak bağlan ve bant genişliği testini yap.

Sonuçlar / İstemci Tarafı

Sonuçlar / SUNUCU Tarafı

Uygulama 3: Wireshark ile Layer7 Trafik analiz

mininet> webServer1 python -m SimpleHTTPServer 80 &

webServer1’de http servisi başlatılır.

root@sun:~# wireshark &

Wireshark başlatılıyor ve loopback listen ediliyor.

mininet> h1 wget -O – webServer1

h1 den webServer1’e doğru trafik üretiliyor.

mininet> webServer3 python -m SimpleHTTPServer 80 &

webServer1’de http servisi başlatılır

mininet> h1 wget -O – webServer3

Hattın kötü oluşu kaynaklı gecikme dikkatli bakılırsa fark ediliyor.

mininet> h1 wget -O – webServer1 komutu çıktısı;

mininet> h1 wget -O – webServer1 komutu sonucu wireshark ile gözlemlenen http trafiği.
Kırmızıyla işaretlenen (1024 nolu paket)  webServer1’in (10.0.0.101) h1’e response paketidir.

Tabiki burada protoklün OpenFlow olduğu bizi yanıltmasın. Gerçek dünya olsaydı eğer protokol alanında http görecektik.

Uygulama 4: link up/down

mininet> h1 ifconfig

192.168.1.100

mininet> client ifconfig

192.168.1.101

mininet> h1 ping client

Ok.

mininet> link s1 client down

S1 (switch 1 ) ile client arasındaki bağlantıyı kopartır.

mininet> h1 ping client

PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data.

^C

No response exit with Ctrl +C

mininet> link s1 client up

 

mininet> h1 ping client

Ok.

mininet> client ping webServer1

connect: Network is unreachable  —

Problem !! dışarıya çıkamıyoruz. Çözüm ?

 Çözümden önce Problem nedir ? onu anlayalım;

xterm h1 ve xterm client xterm başlat, ve her iki makinede route komutuna bak.

Problem :
s1-client  arasında link down edildiğinde client tarafında default gateway yapılandırılmasının silinmesi. Bu nedenle client adli makine hedef IP nin başka subnetlerde olduğu cihazlara gidecek şekilde router’a paket HAZIRLAYAMIYOR. Problemi tespit ettik sıra çözümde;
Çözüm ;

route add default gw 192.168.1.1

Client için default gateway yapılandırılması yeniden yapılır.

 Çözümün testi

# route

Xterm ile açılan client konsolunda yapılandırmayı gör.

ping 10.0.0.1

Önce router’ın diğer bacağını test edelim.

Ok.

mininet> client ping webServer1

Daha sonra çalışmayan yukarıdaki komutu yeniden test edelim, çıktı;

PING 10.0.0.101 (10.0.0.101) 56(84) bytes of data.

64 bytes from 10.0.0.101: icmp_seq=1 ttl=63 time=5.64 ms

64 bytes from 10.0.0.101: icmp_seq=2 ttl=63 time=0.490 ms

^C

 Uygulama 5 : miniedit kullanımı.

Exit

Çalışılan uygulamayı kapat.

mn -c

Hafıza temizliği yap.

karaf@root > wipe-out please

Karaf konsolda GUI temizliğini yap.

root@sun:/opt/mininet/mininet/custom# cd ../examples/

Dizin değiştir

root@sun:/opt/mininet/mininet/examples# python miniedit.py

Miniedit editörünü aç.

File>Open

Ornek uygulamayı aç

Run

Başlat. Konfigrasyonlar yapılmalı..

H1 ve h2’de terminalleri aç ve ping komutumu çalıştır.

 

Stop

Durdur.


Şekil : miniedit ekranı ve h2’ye ping atılması.

Uygulama videosunu aşağıdan izleyebilirsiniz.

Bir yanıt yazın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.