• Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim
KodEdu
  • Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim

Mininet ile Yazılım Tanımlı Ağlar (Software Defined Networks)

  • Posted by Kodedu
  • Categories Genel, Python, Uncategorized
  • Date 18 Ocak 2015

Mininet yazılım tanımlı ağlar (SDN – Software Defined Networks) oluşturmanızı, test etmenizi, gerçeklemenizi olanak sağlayan açık kaynak kodlu bir projedir. Şu anda Linux/Unix ortamında çalışabilen mininet, http://mininet.org/download/ adresinde tanımlı adımlarla sisteminize kurulabilmektedir.

Mininet ile hem interaktif REPL terminal üzerinden hem de Python API’si üzerinden SDN (Software Defined Networks) ‘ler oluşturmaya olanak sağlamaktadır. Bu örnek projede, Python API ile geliştirim yapılmıştır.

Kurulacak Ağ Yapısı

Mininet’in sağladığı sanallaştırma yapısıyla, basit veya karmaşık ağ mimarileri tasarlanabilmektedir. Aşağıda Mininet Python API ile tasarlanacak, Ağ mimarisini görmektesiniz.

mininet-network
Şekil 1. Ağ mimarisi

Ağ mimarisi şeklinde paylaşılan grafikte, toplamda 20 adet network elemanı yer almaktadır.

Table 1. Ağ mimarisinde kullanılan bileşenler
Bileşen Adet

Host

7

Switch

3

Router

1

Line

10

Python API ile Ağ İnşası

Mininet Python API ile yukarıdaki Ağ mimarisi hazırlanmıştır.

router_app.py
class LinuxRouter(Node): (1)

    def config(self, **params):
        super(LinuxRouter, self).config(**params)
        self.cmd('sysctl net.ipv4.ip_forward=1') (2)

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


class NetworkTopo(Topo): (4)

    def build(self, **_opts):

        router = self.addNode('r0', cls=LinuxRouter, ip='192.168.1.1/24') (5)

        h1_01 = self.addHost('h1_01', ip='192.168.1.100/24', defaultRoute='via 192.168.1.1') (6)
        h1_02 = self.addHost('h1_02', ip='192.168.1.150/24', defaultRoute='via 192.168.1.1') (7)

        h2_01 = self.addHost('h2_01', ip='172.16.0.100/12', defaultRoute='via 172.16.0.1') (8)
        h2_02 = self.addHost('h2_02', ip='172.16.0.150/12', defaultRoute='via 172.16.0.1') (9)

        h3_01 = self.addHost('h3_01', ip='10.0.0.100/8', defaultRoute='via 10.0.0.1') (10)
        h3_02 = self.addHost('h3_02', ip='10.0.0.150/8', defaultRoute='via 10.0.0.1') (11)
        h3_03 = self.addHost('h3_03', ip='10.0.0.200/8', defaultRoute='via 10.0.0.1') (12)

        s1 = self.addSwitch('s1') (13)
        s2 = self.addSwitch('s2') (14)
        s3 = self.addSwitch('s3') (15)

        self.addLink(h1_01, s1) (16)
        self.addLink(h1_02, s1) (17)
        self.addLink(h2_01, s2) (18)
        self.addLink(h2_02, s2) (19)
        self.addLink(h3_01, s3) (20)
        self.addLink(h3_02, s3) (21)
        self.addLink(h3_03, s3) (22)

        self.addLink(s1, router, intfName2='r0-eth1', params2={'ip': '192.168.1.1/24'}) (23)
        self.addLink(s2, router, intfName2='r0-eth2', params2={'ip': '172.16.0.1/12'}) (24)
        self.addLink(s3, router, intfName2='r0-eth3', params2={'ip': '10.0.0.1/8'}) (25)


def run():
    topo = NetworkTopo() (26)
    net = Mininet(topo=topo) (27)
    net.start() (28)

    print net['r0'].cmd('route') (29)
    CLI(net) (30)
    net.stop() (31)


if __name__ == '__main__':
    setLogLevel('info')
    run() (32)
1 Node sınıfı türünden LinuxRouter sınıfı hazırlanıyor.
2 config evresinde ip yönlendirme aktifleştiriliyor.
3 terminate evresinde ip yönlendirme pasifleştiriliyor.
4 Topo sınıfı türünden NetworkTopo sınıfı hazırlanıyor.
5 r0: LinuxRouter sisteme ekleniyor.
6 h1_01:192.168.1.100 Host sisteme ekleniyor.
7 h1_02:192.168.1.150 Host sisteme ekleniyor.
8 h2_01:172.16.0.100 Host sisteme ekleniyor.
9 h2_02:172.16.0.150 Host sisteme ekleniyor.
10 h3_01:10.0.0.100 Host sisteme ekleniyor.
11 h3_02:10.0.0.150 Host sisteme ekleniyor.
12 h3_03:10.0.0.200 Host sisteme ekleniyor.
13 s1: Switch sisteme ekleniyor.
14 s2: Switch sisteme ekleniyor.
15 s3: Switch sisteme ekleniyor.
16 h1_01 ve s1 birleştiriliyor.
17 h1_02 ve s1 birleştiriliyor.
18 h2_01 ve s2 birleştiriliyor.
19 h2_02 ve s2 birleştiriliyor.
20 h3_01 ve s3 birleştiriliyor.
21 h3_02 ve s3 birleştiriliyor.
22 h3_03 ve s3 birleştiriliyor.
23 s1 ve r0 birleştiriliyor.
24 s2 ve r0 birleştiriliyor.
25 s3 ve r0 birleştiriliyor.
26 NetworkTopo nesnesi oluşturuluyor.
27 NetworkTopo ‘ya göre Mininet sistemi kuruluyor.
28 Mininet sistemi çalıştırılıyor.
29 Yönlendirme tablosu konsola çıktılanıyor.
30 Mininet REPL terminali test için başlatılıyor.
31 REPL kapatıldığında uygulama da kapatılıyor.
32 Uygulama çalışıtırılıyor.

Uygulamanın Test Edilmesi

Terminal ekranından sudo python router_app.py komutu ile router_app.py uygulaması çalıştırılır. Çalıştırma işlemi sırasında aşağıdaki çıktılar konsolda belirir:

router_app.py konsol çıktısı
*** Creating network
*** Adding controller
*** Adding hosts:
h1_01 h1_02 h2_01 h2_02 h3_01 h3_02 h3_03 r0
*** Adding switches:
s1 s2 s3
*** Adding links:
(h1_01, s1) (h1_02, s1) (h2_01, s2) (h2_02, s2) (h3_01, s3) (h3_02, s3) (h3_03, s3) (s1, r0) (s2, r0) (s3, r0)
*** Configuring hosts
h1_01 h1_02 h2_01 h2_02 h3_01 h3_02 h3_03 r0
*** Starting controller
c0
*** Starting 3 switches
s1 s2 s3
*** Routing Table on Router
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0        *               255.0.0.0       U     0      0        0 r0-eth3
172.16.0.0      *               255.240.0.0     U     0      0        0 r0-eth2
192.168.1.0     *               255.255.255.0   U     0      0        0 r0-eth1

*** Starting CLI:
mininet>

Konsol çıktılarında, bileşenlerin oluşturulması, birbirleriyle bağlanması ve yönlendirme tablosu çıktısı yer almaktadır.

En son adımda ise, Mininet’in REPL komut satırı aracının başladığını görmekteyiz. Bu adımda, kurulu tüm ağı kontrol edebiliriz.

Test 1 – Ping atmak.

Örneğin şimdi h2_02‘den h3_01‘e ping atalım. Bunun için h2_02 isimli host makinenin terminal ekranına erişmeliyiz. Terminal ekranı için Mininet komut satırında xterm aracı kullanılmaktadır.

*** Starting CLI:
mininet> xterm h2_02 (1)
1 Host h2_02 ‘nin terminalini çalıştırır.

Yukarıdaki komut çalıştırıldığında, mevcut işletim sistemi üzerinde h2_02 için bir terminal ekranı başlatılacaktır.

h2_02_terminal
Şekil 2. h2_02 için terminal başlatılması

Sonrasında ise h3_01 makinesine ping atabiliriz. h3_01 isimli makinenin IP adresinin 10.0.0.100 olduğunu hatırlayalım.

h2_02_terminal_ping

ping 10.0.0.100 komutu ardından tüm paketlerin başarıyla karşı tarafa iletildiğini görmekteyiz.

Diğer bir örnek olarak, sistem üzerindeki tüm makinelerin birbirini pinglemesi için pingall komutunu kullanabiliriz.

pingall
Şekil 3. pingall komutu (8×7)

Bu komut sonrasında yine tüm makinelerin birbirlerini başarıyla pinglediğini görmekteyiz.

Test 2 – Rota izlemek

traceroute komutuyla bir cihazdan diğer cihaza erişimdeki takip edilen güzergahı gözlemeleyebiliriz.

Örneğin bu aşamada, h2_01‘den h3_03‘e erişim güzergahını gözlemleyelim. h3_03 isimli makinenin IP adresinin 10.0.0.200 olduğunu hatırlayalım.

mininet> xterm h2_01 (1)
h2_01_traceroute
Şekil 4. h2_01 için traceroute görünümü
h2_01 için traceroute çıktısı
root@ubuntu:~/mininet_ödev# traceroute 10.0.0.200
traceroute to 10.0.0.200 (10.0.0.200), 30 hops max, 60 byte packets
 1  172.16.0.1 (172.16.0.1)  56.566 ms  55.467 ms  56.748 ms
 2  * 10.0.0.200 (10.0.0.200)  65.909 ms  64.260 ms

Kaynaklar

Software Defined Networking [1]

OpenFlow_Tutorial [2]

Mininet [3]

Mininet Examples [4]

Mininet Documentation [5]

Tekrar görüşmek dileğiyle.

Tag:mininet, python, router, sdn

  • Share:
author avatar
Kodedu

Previous post

Random ve ThreadLocalRandom Sınıflarının Performans Karşılaştırması
18 Ocak 2015

Next post

Java 8 LongAdder vs AtomicLong
23 Ocak 2015

You may also like

api-logo
Swagger Nedir? Neden kullanılır?
10 Ekim, 2018
spring-cli-logo
Spring CLI ile Spring Boot Projeleri Hazırlamak
21 Ağustos, 2017
eureka_architecture
Spring Cloud Netflix ve Eureka Service Discovery
3 Temmuz, 2017

    2 Comments

  1. Murad Altay
    20 Mart 2018
    Cevapla

    Emeğiniz icin teşekkürler.

Leave A Reply Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta listesine kayıt olun!






Gözde yazılar

Dağıtık Versiyon Kontrol Sistemleri
13Ağu2012
JaxRS 2 – HTML 5 SSE (Server Sent Events)
04Tem2013
Slayt hazırlarken nelere dikkat etmeliyiz?
18May2015
Apache Tika : Dosya tipi nasıl tespit edilir?
18Ara2013

Son Yazılar

  • Java’da Record’lar 27 Ocak 2020
  • Swagger Nedir? Neden kullanılır? 10 Ekim 2018
  • Spring CLI ile Spring Boot Projeleri Hazırlamak 21 Ağustos 2017
  • Spring Cloud Netflix ve Eureka Service Discovery 3 Temmuz 2017
  • Online React.js Eğitimi ardından (15-25 Mayıs 2017) 31 Mayıs 2017

Son Yorumlar

  • Naïve Bayes Sınıflandırma Algoritması için Rahman Usta
  • Naïve Bayes Sınıflandırma Algoritması için Mete
  • YAML Nedir? Neden YAML Kullanmalıyız? için kara
  • JWT (JSON Web Tokens) Nedir? Ne işe yarar? için Furkan
  • YAML Nedir? Neden YAML Kullanmalıyız? için shahriyar

Get Java Software

Arşivler

Bizi takip edin

React.js Eğitimi Başlıyor
11-22 Eylül, 2017
Eğitmen
Rahman Usta
İletişim

merhaba@kodedu.com

  • Hakkında
  • Gizlilik Politikası
  • İletişim
  • Referanslar
Kodedu Bilişim Danışmanlık
Cemil Meriç mah. Çelebi sok.
No:16/3 Ümraniye/İSTANBUL
Tel: 0850 885 38 65
Alemdağ V.D.: 8960484815

KODEDU © Tüm hakları saklıdır.