From 974db9c1f98ad38e047590ecc865feca7a9b9686 Mon Sep 17 00:00:00 2001 From: edoardocoli Date: Tue, 20 Jun 2023 18:19:48 +0200 Subject: [PATCH] Mininet Updates --- MininetNetPractice.py | 165 ++++++++++++++++++------------------------ MininetTEST.py | 53 ++++++++++++++ MininetTopo.conf | 79 +++++++++++--------- 3 files changed, 167 insertions(+), 130 deletions(-) create mode 100644 MininetTEST.py diff --git a/MininetNetPractice.py b/MininetNetPractice.py index b10e1f2..3a2acbf 100644 --- a/MininetNetPractice.py +++ b/MininetNetPractice.py @@ -6,7 +6,6 @@ from mininet.node import Node from mininet.cli import CLI from mininet.link import TCLink from mininet.log import setLogLevel -from copy import copy #TODO verify/temporaneo class MyRouter (Node): def config(self, **params): @@ -18,110 +17,88 @@ class MyRouter (Node): def build_topology(config_file): topo = Topo() - elementsH = {} # Dictionary to store nodes - elementsR = {} # Dictionary to store nodes - elementsS = {} # Dictionary to store nodes - - h1 = topo.addHost('h1', ip='161.46.247.131/26', defaultRoute='via 161.46.247.129') - h2 = topo.addHost('h2', ip='161.46.247.196/27', defaultRoute='via 161.46.247.195') - - r1 = topo.addNode('r1', cls=MyRouter, ip='161.46.247.129/26') - - topo.addLink(h1, r1, intfName2='R23', params2={'ip' : '161.46.247.129/26'}) - topo.addLink(h2, r1, intfName2='R22', params2={'ip' : '161.46.247.195/27'}) - - # with open(config_file, 'r') as file: - # for line in file: - # line = line.strip() - # if line.startswith('#'): #Skip comment - # continue - - # parts = line.split(" ") #Parse the topology file using spaces - # if parts[0] == 'host': #Parse hosts - # host_name = parts[1] - # host_ip = parts[2] - # host_nexthop = 'via ' + parts[3] - # host = topo.addHost(host_name, ip=host_ip, defaultRoute=host_nexthop) - # host_c = copy(host) - # elementsH[host_name] = (host_c) - - # elif parts[0] == 'router': #Parse routers - # router_name = parts[1] - # router_ip = parts[2] - # router = topo.addNode(router_name, cls=MyRouter, ip=router_ip) - # router_c = copy(router) - # elementsR[router_name] = (router_c) - - # elif parts[0] == 'switch': #Parse switches - # switch_name = parts[1] - # switch = topo.addSwitch(switch_name) - # switch_c = copy(switch) - # elementsS[switch_name] = (switch_c) - - # elif parts[0] == 'linkSH': #Parse links switches to hosts - # node1 = parts[1] - # node2 = parts[2] - # # topo.addLink(node1, node2) - - # elif parts[0] == 'linkSS': #Parse links switches to switches - # node1 = parts[1] - # node2 = parts[2] - # # topo.addLink(node1, node2) - - # elif parts[0] == 'linkHR': #Parse links hosts to routers - # node1 = parts[1] - # node2 = parts[2] - # intf_name2 = parts[3] - # n2_ip = parts[4] - # topo.addLink(elementsH.get(node1), elementsR.get(node2), intfName2=intf_name2, params2={'ip' : n2_ip}) - - # elif parts[0] == 'linkRR': #Parse links routers to routers - # node1 = parts[1] - # node2 = parts[2] - # intf_name1 = parts[3] - # intf_name2 = parts[4] - # ip1 = parts[5] - # ip2 = parts[6] - # # topo.addLink(node1, node2, intfName1=intf_name1, intfName2=intf_name2, params1={'ip' : ip1}, params2={'ip' : ip2}) - - # # elif parts[0] == 'route': #Parse routing tables - # # name = parts[1] - # # for node in topo.nodes(): - # # if node == name: - # # (node).cmd('ip route add 0.0.0.0/0 via 10.0.0.1 dev r1-eth2') - # # break + elements = {} # Dictionary to store nodes + + # elements['Internet'] = topo.addNode('Internet', cls=MyRouter, ip='0.0.0.0/0') + with open(config_file, 'r') as file: + for line in file: + line = line.strip() + if line.startswith('#'): #Skip comment + continue + parts = line.split(" ") #Parse the topology file using spaces + if parts[0] == 'host': #Parse hosts + host_name = parts[1] + host_ip = parts[2] + host_nexthop = 'via ' + parts[3] + elements[host_name] = topo.addHost(host_name, ip=host_ip, defaultRoute=host_nexthop) + + elif parts[0] == 'router': #Parse routers + router_name = parts[1] + router_ip = parts[2] + elements[router_name] = topo.addNode(router_name, cls=MyRouter, ip=router_ip) + + elif parts[0] == 'switch': #Parse switches + switch_name = parts[1] + elements[switch_name] = topo.addSwitch(switch_name) + + elif parts[0] == 'linkRR': #Parse links routers to routers + router1 = parts[1] + router1_intfName = parts[2] + router1_intfIP = parts[3] + router2 = parts[4] + router2_intfName = parts[5] + router2_intfIP = parts[6] + topo.addLink(elements.get(router1), elements.get(router2), intfName1=router1_intfName, intfName2=router2_intfName, params1={'ip' : router1_intfIP}, params2={'ip' : router2_intfIP}) + + elif parts[0] == 'linkRH': #Parse links routers to hosts + host = parts[1] + host_intfName = parts[2] + router = parts[3] + router_intfName = parts[4] + router_intfIP = parts[5] + topo.addLink(elements.get(host), elements.get(router), intfName1=host_intfName, intfName2=router_intfName, params2={'ip' : router_intfIP}) + + elif parts[0] == 'linkRS': #Parse links routers to switches + node1 = parts[1] + node2 = parts[2] + # topo.addLink(node1, node2) + + elif parts[0] == 'linkSS': #Parse links switches to switches + node1 = parts[1] + node2 = parts[2] + # topo.addLink(node1, node2) + + elif parts[0] == 'linkSH': #Parse links switches to hosts + node1 = parts[1] + node2 = parts[2] + # topo.addLink(node1, node2) return topo def run_topology(config_file): - setLogLevel('info') #Different logging levels are 'info' 'warning' 'error' 'debug' + setLogLevel('info') #Different logging levels are 'info' 'warning' 'error' 'debug' topo = build_topology(config_file) net = Mininet(topo=topo, link=TCLink) - net.start() #Starting the network - - # net.addLink(h1, r1, intfName2='R23', params2={'ip' : '161.46.247.129/26'}) - # net.addLink(h2, r1, intfName2='R22', params2={'ip' : '161.46.247.195/27'}) - - # with open(config_file, 'r') as file: #Search in the configuration file for routing table - # for line in file: - # line = line.strip() - # if line.startswith('#'): #Skip comment - # continue - # parts = line.split(" ") - # if parts[0] == 'route': #Parse routing tables - # name = parts[1] - # pck_src = parts[2] - # pck_nexthop = parts[3] - # interf = parts[4] - # cmd = 'ip route add ' + pck_src + ' via ' + pck_nexthop + ' dev ' + interf - # (net.getNodeByName(name)).cmd(cmd) - + net.start() #Starting the network + with open(config_file, 'r') as file: #Search in the configuration file for routing table + for line in file: + line = line.strip() + if line.startswith('#'): #Skip comment + continue + parts = line.split(" ") + if parts[0] == 'route': #Parse routing tables + name = parts[1] + pck_src = parts[2] + pck_nexthop = parts[3] + interf = parts[4] + cmd = 'ip route add ' + pck_src + ' via ' + pck_nexthop + ' dev ' + interf + (net.getNodeByName(name)).cmd(cmd) if net.pingAll(): print(Fore.RED + "Network has issues" + Style.RESET_ALL) else: print(Fore.GREEN + "Network working properly" + Style.RESET_ALL) CLI(net) - net.stop() #Stopping the network + net.stop() #Stopping the network if __name__ == '__main__': run_topology('MininetTopo.conf') \ No newline at end of file diff --git a/MininetTEST.py b/MininetTEST.py new file mode 100644 index 0000000..fea6659 --- /dev/null +++ b/MininetTEST.py @@ -0,0 +1,53 @@ +import configparser +from colorama import Fore, Style +from mininet.net import Mininet +from mininet.topo import Topo +from mininet.node import Node +from mininet.cli import CLI +from mininet.link import TCLink +from mininet.log import setLogLevel + +class MyRouter (Node): + def config(self, **params): + super(MyRouter, self).config(**params) + self.cmd('sysctl net.ipv4.ip_forward=1') #Enable forwarding on the router + def terminate(self): + self.cmd('sysctl net.ipv4.ip_forward=0') #Disable forwarding on the router + super(MyRouter, self).terminate + +def build_topology(config_file): + topo = Topo() + elements = {} # Dictionary to store nodes + + h4 = topo.addHost('H4', ip='161.46.247.131/26', defaultRoute='via 161.46.247.129') + h3 = topo.addHost('H3', ip='161.46.247.196/27', defaultRoute='via 161.46.247.195') + + r1 = topo.addNode('R1', cls=MyRouter, ip='161.46.247.254/30') + r2 = topo.addNode('R2', cls=MyRouter, ip='161.46.247.253/30') + + # Ordine importante + topo.addLink(r2, r1, intfName2='R13', intfName1='R21', params2={'ip' : '161.46.247.254/30'}, params1={'ip' : '161.46.247.253/30'}) + + topo.addLink(r2, h3, intfName2='H31', intfName1='R22', params1={'ip' : '161.46.247.195/27'}) + topo.addLink(r2, h4, intfName2='H41', intfName1='R23', params1={'ip' : '161.46.247.129/26'}) + + return topo + +def run_topology(config_file): + setLogLevel('info') #Different logging levels are 'info' 'warning' 'error' 'debug' + topo = build_topology(config_file) + net = Mininet(topo=topo, link=TCLink) + net.start() #Starting the network + + (net.getNodeByName('R1')).cmd('ip route add 161.46.247.192/27 via 161.46.247.254 dev R13') + (net.getNodeByName('R1')).cmd('ip route add 161.46.247.128/26 via 161.46.247.254 dev R13') + + if net.pingAll(): + print(Fore.RED + "Network has issues" + Style.RESET_ALL) + else: + print(Fore.GREEN + "Network working properly" + Style.RESET_ALL) + CLI(net) + net.stop() #Stopping the network + +if __name__ == '__main__': + run_topology('MininetTopo.conf') \ No newline at end of file diff --git a/MininetTopo.conf b/MininetTopo.conf index 01f93e8..432091c 100644 --- a/MininetTopo.conf +++ b/MininetTopo.conf @@ -1,48 +1,55 @@ -######## Set hosts ######## -## host name ip defRoute ## -########################### -host h1 161.46.247.131/26 161.46.247.129 -host h2 161.46.247.196/27 161.46.247.195 - -#### Set routers ### -## router name ip ## -#################### -router r1 161.46.247.129/26 -#router r2 10.2.0.1/24 +# L'ordine deve rimanee questo + +############# Set hosts ############# +## host name intfIP/mask defRoute ### +##################################### +host H4 161.46.247.131/26 161.46.247.129 +host H3 161.46.247.196/27 161.46.247.195 + +######## Set routers ######## +## router name intfIP/mask ## +############################# +router R1 161.46.247.254/30 +router R2 161.46.247.253/30 ## Set switches ## -## switch name ## +## switch name ## ################## # switch s1 # switch s2 -####### Set links ####### +################################################ Set links ################################################ +## linkRR router1, router1_intfName, router1_intfIP/mask, router2, router2_intfName, router2_intfIP/mask ## +########################################################################################################### +linkRR R1 R13 161.46.247.254/30 R2 R21 161.46.247.253/30 + +######################## Set links and router interfaces ##################### +## linkRH host, host_intfName, router, router_intfName, router_intfIP/mask ### +############################################################################## +linkRH H3 H31 R2 R22 161.46.247.195/27 +linkRH H4 H41 R2 R23 161.46.247.129/26 + +##################### Set links and router interfaces ##################### +## linkRS ## +##################################################### +# linkRS +# linkRS + +###### Set links ###### +## linkSS switch1, switch2 ## +###################### +# linkSS s2 s1 + +###### Set links ###### ## linkSH switch, host ## -######################### +########## # linkSH s1 h1 # linkSH s1 h2 # linkSH s2 h3 # linkSH s2 h4 -######### Set links ######### -## linkSS switch1, switch2 ## -############################# -# linkSS s2 s1 - - -##################### Set links ##################### -## linkHR host, router, router_intfName, router_ip ## -##################################################### -linkHR h1 r1 R23 161.46.247.129/26 -linkHR h2 r1 R22 161.46.247.195/27 - -######################### Set links ######################### -## linkRR router1, router2, intfName1, intfName2, ip1, ip2 ## -############################################################# -# linkRR r1 r2 r1-eth2 r2-eth2 10.0.0.0/31 10.0.0.1/31 - -############# route table ############# -## route name source destRoute interf ## -######################################## -# route r1 0.0.0.0/0 10.0.0.1 r1-eth2 -# route r2 0.0.0.0/0 10.0.0.0 r2-eth2 +################## route table ################ +## route name final_destIP/mask nextHop intf ### +################################################ +route R1 161.46.247.192/27 161.46.247.254 R13 +route R1 161.46.247.128/26 161.46.247.254 R13