14 Mayıs 2016 Cumartesi

Mininet Kurulumu ve Uygulama Örneği

Merhaba, bugün sizlere Virtual Box´a Mininet kurulumundan bahsedeceğim. 
Öncelikle birkaç cümle ile Mininet'ten biraz bahsedeyim. Mininet ile tek bir makinede çalışan içinde gerçek çekirdek, uygulama kodu ve anahtar bulunan ve saniyeler içinde derlenebilen gerçekçi sanal ağlar oluşturulabilir. Ayrıca Python kodlarını kullanarak kendi oluşturacağımız sanal ağ üzerinde de ping atabiliriz. Mininet´in bu özelliği Network ağları anlamamıza yardımcı olabilmektedir. 

Bilgisayara Kurulumu

Öncelikle Virtual Box indirip kurulumunu yapıyoruz. Eğer dosya dizinini değiştirmeyecekseniz "next" yazılarına tıklayıp kurulumu gerçekleştirebilirsiniz.

Daha sonra Virtual box´a üzerinde kurmak istediğimiz işletim sistemi ve bu işletim sisteminin kaç bit olduğunu bildiriyoruz. Yapacağım bu işlemi ve yapılacak diğer önemli işlemleri size anlatmaya çalışacağım.            


Bu işlemden sonra ne kadar önbellek ayırmak istediğimizi seçiyoruz. 




Daha sonra Mininet'i bilgisayarımıza indirip "Zip" dosyasından çıkarıyoruz. "Varolan sanal bir disk dosyası kullan" seçeneğini işaretleyip Virtual Box´ta zip dosyasından çıkarttığımız dosyanın adresini gösteriyoruz.


Daha sonra "Ayarlar > Ağ" kısmından açmak istediğimiz bağdaştırıcılar için"Ağ Bağdaştırıcısını etkinleştir"i tıklıyoruz (Ben hepsini etkinleştirdim). Daha sonra "Şuna Takıldı" kısmındaki ayarları "Sadece-Anamakine Bağdaştırıcısı" olarak değiştirip "Karma Kipi" yazısındaki kısmı ise "Tümüne izin ver" olarak işaretliyoruz.




Daha sonra Virtual Box´a çift tıklayıp açıyoruz. Karşımıza aşağıdaki ekran çıkıyor. Bu ekranda "mininet-vm login:" yazan kısma "mininet" yazısını girip karşımıza gelen "Password:" ekranına da "mininet" yazısını giriyoruz. 


Daha sonra eğer isterseniz "sudo mn" yapıp Mininet´te ping denemesi yapabilirsiniz. "mininet>" ekranından çıkmak için "exit" komutunu kullanabilirsiniz. 


Daha sonra "sudo nano ~/ahmt.py" komutuyla ahmt.py adlı Python dosyası oluşturuyoruz. "sudo dhclient eth1",  "sudo dhclient eth2", "sudo dhclient eth3" komutları ile eth1, eth2, eth3 bağlantıları da kullanabiliyoruz. Ayrıca Putty ile bağlanmak için eth1 bağlantısının adresini kullanıyoruz. 


Daha sonra ise aşağıdaki komutları yazdığımızda yukarıdaki resim gibi bir sanal ağ elde etmiş oluyoruz. 

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

class LinuxRouter( Node ):
    "A Node with IP forwarding enabled."

    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 ):
    "Ahmet ag topolojisi"

    def build( self, **_opts ):

        defaultIP = '192.168.1.1/24'  # IP address for r0-eth1

        r1, r2, r3 = [self.addNode( n, cls=LinuxRouter, ip=d ) for n, d in [ ( 'r0', '192.168.1.1/29' ), ( 'r1', '192.168.1.2/29' ), ( 'r2', '192.168.1.3/29' ) ] ]
        self.addLink( r1, r2,
                      intfName1='r0-eth0', params1={ 'ip' : '172.16.16.1/30' },
                      intfName2='r1-eth0', params2={ 'ip' : '172.16.16.2/30' } )
        self.addLink( r2, r3,
                      intfName1='r1-eth1', params1={ 'ip' : '172.16.16.5/30' },
                      intfName2='r2-eth0', params2={ 'ip' : '172.16.16.6/30' } )


        s1, s2, s3, s4, s5 = [ self.addSwitch( s ) for s in 's0', 's1', 's2', 's3', 's4' ]

        self.addLink( s1, r1, intfName2='r0-eth1',
                      params2={ 'ip' : '10.9.128.1/17' } )
        self.addLink( s2, r1, intfName2='r0-eth2',
                      params2={ 'ip' : '10.9.0.1/17' } )
        self.addLink( s3, r3, intfName2='r2-eth1',
                      params2={ 'ip' : '10.7.0.1/23' } )
        self.addLink( s4, r3, intfName2='r2-eth2',
                      params2={ 'ip' : '10.6.0.1/25' } )
        self.addLink( s5, r2, intfName2='r1-eth3',
                      params2={ 'ip' : '10.8.110.1/24' } )



        h1 = self.addHost( 'h1', ip='10.9.128.100/17',
                           defaultRoute='via 10.9.128.1' )
        h2 = self.addHost( 'h2', ip='10.9.128.101/17',
                           defaultRoute='via 10.9.128.1' )
        h3 = self.addHost( 'h3', ip='10.9.0.100/17',
                           defaultRoute='via 10.9.0.1' )
        h4 = self.addHost( 'h4', ip='10.9.0.101/17',
                           defaultRoute='via 10.9.0.1' )
        h5 = self.addHost( 'h5', ip='10.7.0.100/23',
                           defaultRoute='via 10.7.0.1' )
        h6 = self.addHost( 'h6', ip='10.7.0.101/23',
                           defaultRoute='via 10.7.0.1' )
        h7 = self.addHost( 'h7', ip='10.6.0.100/25',
                           defaultRoute='via 10.6.0.1' )
        h8 = self.addHost( 'h8', ip='10.6.0.101/25',
                           defaultRoute='via 10.6.0.1' )
        h9 = self.addHost( 'h9', ip='10.8.110.100/24',
                           defaultRoute='via 10.8.110.1' )
        h10 = self.addHost( 'h10', ip='10.8.110.101/24',
                           defaultRoute='via 10.8.110.1' )
        for h, s in [ (h1, s1), (h2, s1), (h3, s2), (h4, s2), (h5, s3), (h6, s3), (h7, s4), (h8, s4), (h9, s5), (h10, s5) ]:
            self.addLink( h, s )


def run():
    "Test linux router"
    topo = NetworkTopo()
    net = Mininet( topo=topo )  # controller is used by s1-s3
    net.start()
    info( '*** Router yonlendirme tablolari:\n---------MC--pw--------\n' )
    for s in [ 'r0', 'r1', 'r2' ]:
        print net[ s ].cmd( 'route' )
    CLI( net )
    net.stop()

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

topos = { 'mytopo': ( lambda: run() ) }



En son olarakta "sudo mn --custom ~/ahmt.py --topo mytopo --test pingall" komutuyla derleyip tüm ping´leri test ediyoruz. "exit" komutunu girerek Mininet´ten çıkş yapıyoruz.



KAYNAKLAR

https://www.youtube.com/watch?v=jAhCuHq08pc

http://mininet.org/walkthrough/

https://github.com/mininet/mininet/wiki/Mininet-VM-Images

https://github.com/mininet/mininet/tree/master/examples