Mininet ile Yazılım Tanımlı Ağlar (Software Defined Networks)
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.
Ağ mimarisi şeklinde paylaşılan grafikte, toplamda 20 adet network elemanı yer almaktadır.
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.
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:
*** 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.
Sonrasında ise h3_01
makinesine ping atabiliriz. h3_01
isimli makinenin IP adresinin 10.0.0.100 olduğunu hatırlayalım.
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.
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)
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
Tekrar görüşmek dileğiyle.
2 Comments
Emeğiniz icin teşekkürler.