Jawdat Mini Hackaton 2016 by Jumroh Arrasid

12
Jawdat Mini-Hackaton 2016 I'm going to show you my SDN skill! Jumroh Arrasid Watch the demo here: https://youtu.be/BZB_7EuTtxo

Transcript of Jawdat Mini Hackaton 2016 by Jumroh Arrasid

Page 1: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

Jawdat Mini-Hackaton 2016

I'm going to show you my SDN skill!

Jumroh Arrasid Watch the demo here: https://youtu.be/BZB_7EuTtxo

Page 2: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

Jawdat Mini-Hackaton 2016

Informasi Dokumen

Jenis Dokumen Laporan Hackathon

Target SDN NFV AIO VM v1.0

Penulis Jumroh Arrasid

Versi Dokumen 1.0

Tanggal Dibuat 25/03/2016

Sejarah Versi

Versi Tanggal Penulis Deskripsi

1.0 25/03/2016 Jumroh Arrasid Dokumen Awal

Kontak

Nama Jumroh Arrasid

E-Mail [email protected]

Page 3: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

Jawdat Mini-Hackaton 2016

Contents

Deskripsi Pekerjaan ................................................................................... 1

Konfigurasi ............................................................................................................... 2

1. Konfigurasi Topologi .................................................................................................................... 2

2. Konfigurasi file “startaio.sh” ....................................................................................................... 2

3. Konfigurasi file “configpusher.py”............................................................................................... 2

4. Konfigurasi file “aiomanager.py” ................................................................................................ 3

5. Konfigurasi file “topo.py “ ........................................................................................................... 4

6. Konfigurasi OpenFlow Entries “HQ-FLOW.txt” dan “BR1-FLOW.txt” ......................................... 6

7. Konfigurasi file “pushOVS.sh” dan “clearOVS.sh” ....................................................................... 6

8. Konfigurasi file “ovsHQpusher.py” dan “ovsBR1pusher.py” ...................................................... 7

9. Konfigurasi file “ovsHQclear.py” dan “ovsBR1clear.py” ............................................................. 8

Hasil dan Pembahasan .......................................................................................... 9

Page 4: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

1

Jawdat Mini-Hackaton 2016

Deskripsi Pekerjaan

Dalam SDN Mini-Hackathon kali ini penulis melakukan beberapa perubahan pada Jawdat AIO VM dengan

melakukan penambahan dan pengurangan node dan mencoba menemukan solusi network automation

pada topologi jaringan yang berbeda (Opsi skenario 5). Berikut penjelasan perubahan yang ditambah dan

topologi jaringan yang dibuat oleh penulis:

i. Penulis membuat kasus dimana suatu perusahaan ingin menghubungkan jaringan pada 2 kantor

yang berbeda secara geografis (HQ dan Branch1) serta membangun komunikasi yang aman antara

ke-2 cabang tersebut yang terhubung melalui Internet.

ii. Setiap cabang pada perusahaan menggunakan 1 Cisco Router dan 1 Open vSwitch. Dilokasi HQ

terdapat Jawdat AIO VM yang digunakan untuk melakukan automasi pada jaringan tersebut.

iii. Untuk mewujudkan komunikasi yang aman penulis mebangun jaringan point-to-point antara HQ

dan BR1 dengan menggunakan GRE over IPsec Tunnel.

iv. Pada Open vSwitch tidak digunakan menggunakan SDN Controller, penulis mencoba melakukan

entry manual untuk OpenFlow entries(just for lab purposes, not recommended for large networks).

v. Penulis juga membangun layer 2 adjacency pada masing-masing Open vSwitch dengan

menggunakan VXLAN sebagai mekanisme tunneling. Host pada setiap Open vSwitch menggunakan

alamat IP yang sama (overlapping).

vi. Routing Protocol yang digunakan adalah EIGRP.

vii. Semua konfigurasi di push melalui Jawdat AIO VM.

viii. Berikut topologi jaringan yang akan dibangun dengan menggunakan network automation:

Page 5: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

2

Jawdat Mini-Hackaton 2016

Konfigurasi

1. Konfigurasi Topologi

Node Running On Interface

Cisco IOU GNS3 VM 1.4.4 VMnet1

Jawdat AIO VM VMware WS 10.0.1 VMnet4

Open vSwitch (Mininet VM) VirtualBox 5.0.10 VBox Host only #

2. Konfigurasi file “startaio.sh”

Pada file shell “startaio.sh” penulis menonaktifkan beberapa services pada AIO VM dan hanya

mengaktifkan services yang dibutuhkan yaitu webgui dan aiomanager. Hal ini dilakukan karena penulis

merubah topologi jaringan dan juga untuk menghemat penggunaan memory pada VM.

3. Konfigurasi file “configpusher.py”

Page 6: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

3

Jawdat Mini-Hackaton 2016

Konfigurasi

Pada file “configpusher.py” penulis hanya merubah nilai pada variable self.waiting_time = 5 dengan tujuan

ketika proses SSH Failed penulis hanya perlu menunggu selama 5 detik.

4. Konfigurasi file “aiomanager.py”

Function def start(), penulis menambah baris perintah untuk melakukan SSH ke router HQ dan BR1 dan

list konfigurasi yang akan di push ke masing-masing router (provision). config_list_HQ = [ "int e0/0", "ip nat outside", "int range e0/1-2", "ip nat inside", "access-list 10 permit any", "ip nat inside source list 10 interface e0/0 overload", "crypto isakmp policy 1", "authentication pre-share", "group 1", "crypto isakmp key KUNCI address 33.33.33.2", "crypto ipsec transform-set SECURE esp-3des esp-sha-hmac", "access-list 100 permit gre host 11.11.11.2 host 33.33.33.2", "crypto map SECURE-MAP 1 ipsec-isakmp", "set peer 33.33.33.2", "set transform-set SECURE", "match address 100", "int e0/0 ", "crypto map SECURE-MAP", "interface tun 1", "ip add 10.10.10.1 255.255.255.252", "tunnel source e0/0", "tunnel destination 33.33.33.2", "router eigrp 10", "network 10.10.10.0 0.0.0.3", "network 192.168.99.0", "192.168.100.0", "!"] config_list_BR1 = [ "int e0/0", "ip nat outside", "int e0/1", "ip nat inside", "access-list 10 permit any", "ip nat inside source list 10 interface e0/0 overload", "crypto isakmp policy 1", "authentication pre-share", "group 1", "crypto isakmp key KUNCI address 11.11.11.2", "crypto ipsec transform-set SECURE esp-3des esp-sha-hmac", "access-list 100 permit gre host 33.33.33.2 host 11.11.11.2 ", "crypto map SECURE-MAP 1 ipsec-isakmp", "set peer 11.11.11.2", "set transform-set SECURE", "match address 100", "int e0/0 ", "crypto map SECURE-MAP", "ip route 192.168.100.0 255.255.255.0 10.10.10.1", "interface tun 1", "ip add 10.10.10.2 255.255.255.252", "tunnel source e0/0", "tunnel destination 11.11.11.2", "router eigrp 10", "network 10.10.10.0 0.0.0.3", "network 172.16.99.0 0.0.0.255","!"] HQ=ConfigPusher("HQ", "ios", config_list_HQ, "ssh", "192.168.100.1", 22,"cisco","cisco") BR1=ConfigPusher("BR1", "ios", config_list_BR1, "ssh", "33.33.33.2", 22,"cisco","cisco") HQ.start() BR1.start()

Page 7: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

4

Jawdat Mini-Hackaton 2016

Konfigurasi

Function def stop(), penulis menambah baris perintah untuk melakukan SSH ke router HQ dan BR1 dan

akan menghapus konfigurasi yang telah di push pada masing-masing router (deprovision). config_list_HQ = [ "int e0/0","no crypto map SECURE-MAP", "no crypto isakmp policy 1", "no crypto isakmp key KUNCI address 33.33.33.2", "no access-list 100", "no crypto map SECURE-MAP 1 ipsec-isakmp", "no crypto ipsec transform-set SECURE", "no int tun 1", "no router eigrp 10", "!"] config_list_BR1 = [ "int e0/0","no crypto map SECURE-MAP", "no crypto isakmp policy 1", "no crypto isakmp key KUNCI address 11.11.11.2", "no access-list 100", "no crypto map SECURE-MAP 1 ipsec-isakmp", "no crypto ipsec transform-set SECURE", "no int tun 1", "no router eigrp 10", "!"] HQ = ConfigPusher("HQ","ios",config_list_HQ, "ssh","192.168.100.1",22,"cisco","cisco") BR1 = ConfigPusher("BR1","ios",config_list_BR1,"ssh","33.33.33.2",22,"cisco", "cisco") HQ.start() BR1.start()

5. Konfigurasi file “topo.py “

File “topo.py” adalah file yang berisikan script python yang akan digunakan untuk membuat Open vSwitch

dan host yang berada pada Open vSwitch tersebut dimana pada kasus ini Open vSwitch di emulasikan

dengan Mininet VM.

from mininet.net import Mininet from mininet.cli import CLI from mininet.log import lg from mininet.node import Node from mininet.topolib import TreeNet from mininet.node import Controller #NAT Configuration# ######################################################################################## def startNAT( root, inetIntf='eth3', subnet='10.0/8' ): # Identify the interface connecting to the mininet network localIntf = root.defaultIntf() # Configure NAT root.cmd( 'iptables -I FORWARD -i', localIntf, '-d', subnet, '-j DROP' ) root.cmd( 'iptables -A FORWARD -i', localIntf, '-s', subnet, '-j ACCEPT' ) root.cmd( 'iptables -A FORWARD -i', inetIntf, '-d', subnet, '-j ACCEPT' ) root.cmd( 'iptables -t nat -A POSTROUTING -o ', inetIntf, '-j MASQUERADE' ) # Instruct the kernel to perform forwarding root.cmd( 'sysctl net.ipv4.ip_forward=1' ) def stopNAT( root ): """Stop NAT/forwarding between Mininet and external network""" # Flush any currently active rules root.cmd( 'iptables -F' )

Page 8: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

5

Jawdat Mini-Hackaton 2016

Konfigurasi root.cmd( 'iptables -t nat -F' ) # Instruct the kernel to stop forwarding root.cmd( 'sysctl net.ipv4.ip_forward=0' ) def fixNetworkManager( root, intf ): cfile = '/etc/network/interfaces' line = '\niface %s inet manual\n' % intf config = open( cfile ).read() if line not in config: print '*** Adding', line.strip(), 'to', cfile with open( cfile, 'a' ) as f: f.write( line ) # Probably need to restart network-manager to be safe - # hopefully this won't disconnect you root.cmd( 'service network-manager restart' ) def connectToInternet( network, switch='S1', rootip='10.254', subnet='10.0/8'): """Connect the network to the internet switch: switch to connect to root namespace rootip: address for interface in root namespace subnet: Mininet subnet""" switch = network.get( switch ) prefixLen = subnet.split( '/' )[ 1 ] # Create a node in root namespace root = Node( 'root', inNamespace=False ) # Prevent network-manager from interfering with our interface fixNetworkManager( root, 'root-eth3' ) # Create link between root NS and switch link = network.addLink( root, switch ) link.intf1.setIP( rootip, prefixLen ) # Start network that now includes link to root namespace network.start() # Start NAT and establish forwarding startNAT( root ) # Establish routes from end hosts for host in network.hosts: host.cmd( 'ip route flush root 0/0' ) host.cmd( 'route add -net', subnet, 'dev', host.defaultIntf() ) host.cmd( 'route add default gw', rootip ) return root ######################################################################################## if __name__ == '__main__': lg.setLogLevel( 'info') ################### Topologi OVS ################## net = Mininet( controller=Controller ) A1 = net.addHost( 'A1', ip='10.0.0.1/24', mac='00:00:00:00:00:A1' ) B1 = net.addHost( 'B1', ip='10.0.0.1/24', mac='00:00:00:00:00:B1' ) S1 = net.addSwitch( 'S1' ) net.addLink( A1, S1 ) net.addLink( B1, S1 ) ################### Topologi OVS ###################

Pada konfigurasi diatas, terdapat konfigurasi NAT agar host pada Open vSwitch dapat berkomunisi keluar

dari Open vSwitch. Konfigurasi tersebut bisa didapatkan dari file “/mininet/mininet/examples/nat.py”.

Keterangan “## Topologi OVS ##” adalah script yang digunakan untuk membentuk topologi Open vSwitch.

Script tersebut akan menghasilkan topologi seperti dibawah ini:

Page 9: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

6

Jawdat Mini-Hackaton 2016

Konfigurasi

6. Konfigurasi OpenFlow Entries “HQ-FLOW.txt” dan “BR1-FLOW.txt”

File “HQ-FLOW.txt” dan “BR1-FLOW.txt” adalah file teks yang dibuat oleh penulis yang berisi OpenFlow

flow entries yang akan di push ke masing-masing Open vSwitch. Kedua file tersebut berada pada direktori

“/var/www/html/flow/”. Terdapat 2 table pada file tersebut, table 0 berfungsi untuk menandai paket dan

table 1 berfungsi untuk memforward paket. Berikut penjelasan entries pada file “BR1-FLOW.txt” (file HQ-

FLOW.txt tidak dijelaskan karena fungsinya kurang lebih sama):

*note: port 10 adalah VXLAN tunnel port.

7. Konfigurasi file “pushOVS.sh” dan “clearOVS.sh”

Berfungsi untuk menandai (tag) flow yang melalui

port 1 atau port 2 dengan VNI 1000 atau VNI 2000,

dan kemudian flow tersebut akan di di proses pada

Table 1.

-jika VNI=1000 & dest.MAC=::A2, forward ke port 1

-jika VNI=2000 & dest.MAC=::B2, forward ke port 2

-jika VNI=1000 & dest.MAC=::A1, forward ke port 10

-jika VNI=2000 & dest.MAC=::B1, forward ke port 10

-Berfungsi untuk menentukan kemana untuk

meneruskan ARP Request. Dalam kasus ini ke Local

VM.

-Explicit default drop (deny any)

Page 10: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

7

Jawdat Mini-Hackaton 2016

Konfigurasi

File “pushOVS.sh” adalah file shell yang dibuat oleh penulis untuk melakukan push OpenFlow flow

entries dan membuat VXLAN tunnel interface pada masing-masing Open vSwitch. Shell “pushOVS.sh”

sendiri akan memanggil script python pada file /root/ovsBr1psuher.py dan /root/ovsHQpusher.py.

File “clearOVS.sh” adalah file shell yang dibuat oleh penulis untuk menghapus OpenFlow flow entries

dan VXLAN tunnel interface pada masing-masing Open vSwitch. Shell “clearOVS.sh” sendiri akan

memanggil script python pada file /root/ovsBr1clear.py dan /root/ovsHQclear.py.

8. Konfigurasi file “ovsHQpusher.py” dan “ovsBR1pusher.py”

import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.99.10', port=22, username='mininet', password='mininet' ) stdin, stdout, stderr = ssh.exec_command('wget http://192.168.100.200/flow/HQ-FLOW.txt') stdin, stdout, stderr = ssh.exec_command('sudo ovs-ofctl add-flows S1 HQ-FLOW.txt') stdin, stdout, stderr = ssh.exec_command('sudo ovs-vsctl add-port S1 vtep -- set interface vtep type=vxlan option:remote_ip=172.16.99.10 option:key=flow ofport_request=10’)

import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('172.16.99.10', port=22, username='mininet', password='mininet' ) stdin, stdout, stderr = ssh.exec_command('wget http://192.168.100.200/flow/BR1-FLOW.txt') stdin, stdout, stderr = ssh.exec_command('sudo ovs-ofctl add-flows S1 BR1-FLOW.txt') stdin, stdout, stderr = ssh.exec_command('sudo ovs-vsctl add-port S1 vtep -- set interface vtep type=vxlan option:remote_ip=192.168.99.10 option:key=flow ofport_request=10')

Penjelasan VXLAN Tunnel interface:

'sudo ovs-vsctl add-port S1 vtep -- set interface vtep type=vxlan option:remote_ip=192.168.99.10 option:key=flow ofport_request=10'

File “ovsHQpusher.py” dan “ovsBR1pusher.py” adalah script python yang dibuat penulis untuk melakukan

beberapa hal pada Open vSwitch:

Membuat port pada OVS dengan nama port=“vtep”

Konfigurasi interface sebagai VXLAN Tunnel

Konfigurasi IP remote OVS, dalam kasus ini IP address OVS HQ

Konfigurasi flow untuk menggunakan VNI yang ditentukan pada OpenFlow Eentries

OpenFlow Port = 10

Page 11: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

8

Jawdat Mini-Hackaton 2016

Konfigurasi

i. Mengunduh OpenFlow Entries. ('wget http://192.168.100.200/flow/xx’)

ii. Push OpenFlow Entries ke OVS. ('sudo ovs-ofctl add-flows S1 HQ-FLOW.txt’)

iii. Membuat VXLAN Tunnel Interface. ('sudo ovs-vsctl add-port S1 vtep -- set interface vtep type=vxlan

option:remote_ip=172.16.99.10 option:key=flow ofport_request=10’)

File tersebut dibuat dengan modul paramiko (module pada Python untuk implementasi SSHv2).

9. Konfigurasi file “ovsHQclear.py” dan “ovsBR1clear.py”

import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.99.10', port=22, username='mininet', password='mininet' ) stdin, stdout, stderr = ssh.exec_command('wget http://192.168.100.200/flow/HQ-FLOW.txt') stdin, stdout, stderr = ssh.exec_command('sudo ovs-ofctl add-flows S1 HQ-FLOW.txt') stdin, stdout, stderr = ssh.exec_command('sudo ovs-vsctl add-port S1 vtep -- set interface vtep type=vxlan option:remote_ip=172.16.99.10 option:key=flow ofport_request=10’)

import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('172.16.99.10', port=22, username='mininet', password='mininet' ) stdin, stdout, stderr = ssh.exec_command('rm BR1-FLOW.txt*') stdin, stdout, stderr = ssh.exec_command('sudo ovs-ofctl del-flows S1') stdin, stdout, stderr = ssh.exec_command('sudo ovs-vsctl del-port S1 vtep -- set interface vtep type=vxlan option:remote_ip=192.168.99.10 option:key=flow ofport_request=10')

File “ovsHQpusher.py” dan “ovsBR1pusher.py” adalah script python yang dibuat penulis untuk melakukan:

i. Menghapus file FLOW.txt

ii. Menghapus flow entries pada OVS.

iii. Menghapus VXLAN Tunnel Interface.

Page 12: Jawdat Mini Hackaton 2016 by Jumroh Arrasid

9

Jawdat Mini-Hackaton 2016

Hasil dan Pembahasan

Untuk hasil dan pembahasan penulis berharap pembaca dapat melihat short demo yang telah dibuat

penulis pada url berikut:

https://youtu.be/BZB_7EuTtxo

.