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 |
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. |
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 |
h1 ping webServer1 | h1 den webServer1’e ping atar. |
pingall | Karşılıklı |
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 |
delay = None, | Gecikme, |
jitter = None, | İletim |
loss = None, | Paket |
gro = False, |
|
txo = True, | Gönderim |
rxo = True, | Alım |
speedup = 0, | Switch |
use_hfsc = False, | Hfsc (hierarchical fair-service curve) |
use_tbf = False, | Tbf (token bucket filter) |
latency_ms = None, |
|
enable_ecn = False, | Ecn |
enable_red = False, | |
max_queue_size = None, | Maximum |
params |
|
) |
Uygulama 2 : iperf İle Bant Genişliği Uygulamaları
mininet> iperf h1
| Bant genişliği sınırlaması yok. Çıktı; *** Iperf: testing TCP *** Results: [‘29.2 |
mininet> iperf h1
| self.addLink( webServer2, *** Iperf: testing TCP *** Results: [‘9.57 Mbits/sec’, ‘12.4 Mbits/sec’] |
mininet> iperf h1
| self.addLink( webServer3, *** Iperf: testing TCP *** Results: [‘1.20 Mbits/sec’, ‘1.49 Mbits/sec’] |
h1 ping webServer3 | self.addLink( webServer3, 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.
- h1 – speedSrv arası self.addLink( h1, s1 )
- hostECNt – speedSrv arası self.addLink( hostECNt, s1, cls=TCLink, enable_enc = True
- 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.
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.