def build(self, *args, **kwargs): """ +-------+ +------+ as2r +-------+ | +-------+ | | = = | | | +---+---+ $ +---+---+ | as1r +<-------------+ as3r | +---+---+ +---+---+ | | | $ $ | | +-------+ | +----->+ as4r +<------+ +-------+ """ # Add all routers as1r = self.addRouter('as1r') as2r = self.addRouter('as2r') as3r = self.addRouter('as3r') as4r = self.addRouter('as4r') routers = self.routers() prefix = {routers[i]: '2001:db:%04x::/48' % i for i in range(len(routers))} as1r.addDaemon(BGP, address_families=(AF_INET6(networks=(prefix[as1r],)),)) as2r.addDaemon(BGP, address_families=(AF_INET6(networks=(prefix[as2r],)),)) as3r.addDaemon(BGP, address_families=(AF_INET6(networks=(prefix[as3r],)),)) as4r.addDaemon(BGP, address_families=(AF_INET6(networks=(prefix[as4r],)),)) # Add links self.addLink(as1r, as2r) self.addLink(as1r, as3r) self.addLink(as1r, as4r) self.addLink(as2r, as3r) self.addLink(as3r, as4r) # Set AS-ownerships self.addAS(1, (as1r,)) self.addAS(2, (as2r,)) self.addAS(3, (as3r,)) self.addAS(4, (as4r,)) # Add BGP peering ebgp_session(self, as1r, as2r, link_type=SHARE) ebgp_session(self, as3r, as2r, link_type=SHARE) ebgp_session(self, as3r, as1r, link_type=CLIENT_PROVIDER) ebgp_session(self, as1r, as4r, link_type=CLIENT_PROVIDER) ebgp_session(self, as3r, as4r, link_type=CLIENT_PROVIDER) # Add test hosts for r in self.routers(): link = self.addLink(r, self.addHost('h%s' % r)) self.addSubnet(links=[link], subnets=[prefix[r]]) super().build(*args, **kwargs)
def build(self, *args, **kwargs): """ +-------+ +------+ as2r +-------+ | +-------+ | | = = | | | +---+---+ $ +---+---+ | as1r +<-------------+ as3r | +---+---+ +---+---+ | | | $ $ | | +-------+ | +----->+ as4r +<------+ +-------+ """ # Add all routers as1r = self.addRouter('as1r') as2r = self.addRouter('as2r') as3r = self.addRouter('as3r') as4r = self.addRouter('as4r') as1r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:1::/48', )), )) as2r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:2::/48', )), )) as3r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:3::/48', )), )) as4r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:4::/48', )), )) # Add links self.addLink(as1r, as2r) self.addLink(as1r, as3r) self.addLink(as1r, as4r) self.addLink(as2r, as3r) self.addLink(as3r, as4r) # Set AS-ownerships self.addAS(1, (as1r, )) self.addAS(2, (as2r, )) self.addAS(3, (as3r, )) self.addAS(4, (as4r, )) # Add BGP peering ebgp_session(self, as1r, as2r, SHARE) ebgp_session(self, as3r, as2r, SHARE) ebgp_session(self, as3r, as1r, CLIENT_PROVIDER) ebgp_session(self, as1r, as4r, CLIENT_PROVIDER) ebgp_session(self, as3r, as4r, CLIENT_PROVIDER) # Add test hosts for r in self.routers(): self.addLink(r, self.addHost('h%s' % r)) super(BGPPrefixConnectedTopo, self).build(*args, **kwargs)
def build(self, *args, **kwargs): """ Topo from slide 27 BGP-RR-TE """ # Add all routers as1r1 = self.bgp('as1r1') as1r3 = self.bgp('as1r3') as1r5 = self.bgp('as1r5') as1r6 = self.bgp('as1r6') as6r1 = self.addRouter('as6r1') as6r1.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), )) as6r2 = self.addRouter('as6r2') as6r2.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), )) h1 = self.addHost('h1') h2 = self.addHost('h2') h3 = self.addHost('h3') h4 = self.addHost('h4') # Add Links self.addLink(as1r1, as1r6, ipg_cost=1) self.addLink(as1r5, as1r6, igp_cost=1) self.addLink(as1r3, as1r5, igp_cost=1) self.addLink(as1r1, as1r3, igp_cost=5) self.addLink(as6r1, as1r1) self.addLink(as6r2, as1r3) self.addLink(as6r1, h1, params1={"ip": "dead:beef::/48"}, params2={"ip": "dead:beef::1/48"}) self.addLink(as6r2, h2, params1={"ip": "dead:beef::2/48"}, params2={"ip": "dead:beef::3/48"}) self.addLink(as1r5, h3) self.addLink(as1r6, h4) set_rr(self, rr=as1r1, peers=[as1r3, as1r5]) set_rr(self, rr=as1r3, peers=[as1r1, as1r6]) # Add full mesh self.addAS(6, (as6r1, as6r2)) self.addAS(1, (as1r1, as1r3, as1r5, as1r6)) # Add eBGP session ebgp_session(self, as1r1, as6r1) ebgp_session(self, as1r3, as6r2) super(SimpleBGPTopoErr, self).build(*args, **kwargs)
def build(self, *args, **kwargs): """ Topo from slide 38 iBGP """ # Add all routers as1r1 = self.bgp('as1r1') as1r2 = self.bgp('as1r2') as1r3 = self.bgp('as1r3') as1r4 = self.bgp('as1r4') as1r5 = self.bgp('as1r5') as1r6 = self.bgp('as1r6') as4r1 = self.addRouter('as4r1') as4r1.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/48', )), )) as4r2 = self.addRouter('as4r2') as4r2.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/48', )), )) h1 = self.addHost('h1') # Add Links self.addLink(as1r1, as1r6) self.addLink(as1r1, as1r3) self.addLink(as1r3, as1r2) self.addLink(as1r3, as1r6) self.addLink(as1r2, as1r4) self.addLink(as1r4, as1r5) self.addLink(as1r5, as1r6) self.addLink(as4r1, as1r6) self.addLink(as4r2, as1r5) self.addLink(as4r1, h1, params1={"ip": "dead:beef::/48"}, params2={"ip": "dead:beef::1/48"}) self.addLink(as4r2, h1, params1={"ip": "dead:beef::2/48"}, params2={"ip": "dead:beef::3/48"}) set_rr(self, as1r3, peers=[as1r1, as1r2, as1r4, as1r5, as1r6]) # Add full mesh self.addAS(4, (as4r1, as4r2)) self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6)) # Add eBGP session ebgp_session(self, as1r6, as4r1) ebgp_session(self, as1r5, as4r2) super(SimpleBGPTopoRR, self).build(*args, **kwargs)
def build(self, *args, **kwargs): """ Topo from slide 33 iBGP """ # Add all routers as1r1 = self.bgp('as1r1') as1r4 = self.bgp('as1r4') as1r5 = self.bgp('as1r5') as1r6 = self.bgp('as1r6') as4r1 = self.bgp('as4r1') as4r2 = self.bgp('as4r2') as5r1 = self.bgp('as5r1') as3r1 = self.bgp('as3r1') as2r1 = self.addRouter('as2r1') as2r1.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/48', )), )) h1 = self.addHost('h1') # Add Links self.addLink(as1r1, as1r6) self.addLink(as1r1, as1r4) self.addLink(as1r4, as1r5) self.addLink(as1r5, as1r6) self.addLink(as4r1, as1r5) self.addLink(as4r2, as1r4) self.addLink(as3r1, as1r1) self.addLink(as5r1, as1r6) self.addLink(as3r1, as5r1) self.addLink(as5r1, as2r1) self.addLink(as2r1, as4r1) self.addLink(as4r1, as4r2) self.addLink(as2r1, h1, params1={"ip": "dead:beef::/48"}, params2={"ip": "dead:beef::1/48"}) # Add full mesh self.addAS(2, (as2r1, )) self.addAS(3, (as3r1, )) self.addAS(5, (as5r1, )) self.addiBGPFullMesh(4, routers=[as4r1, as4r2]) self.addAS(1, (as1r1, as1r4, as1r5, as1r6)) bgp_peering(self, as1r1, as1r6) bgp_peering(self, as1r1, as1r4) bgp_peering(self, as1r4, as1r5) bgp_peering(self, as1r6, as1r5) # Add eBGP session ebgp_session(self, as1r1, as3r1) ebgp_session(self, as1r4, as4r2) ebgp_session(self, as1r5, as4r1) ebgp_session(self, as3r1, as5r1) ebgp_session(self, as5r1, as2r1) ebgp_session(self, as2r1, as4r1) super(SimpleBGPTopoMissing3, self).build(*args, **kwargs)
def add_bgp(self, ovh_routers, external_routers): """ Add Border Gateway Protocol (BGP) to the routers and specify which prefixes they advertise (both for IPv4 and IPv6). :param all_routers: (list of RouterDescription) A list of all routers contained in the network. :param ovh_routers: (list of RouterDescription) List of OVH's routers having an eBGP session which will redistribute prefixes advertised by other ASes. :param telia_routers: (list of RouterDescription) List of Telia's routers to which OVH routers are connected. :param google_routers: (list of RouterDescription) List of Google's routers to which OVH routers are connected. :param cogent_routers: (list of RouterDescription) List of Cogent's routers to which OVH routers are connected. :param level3_routers: (list of RouterDescription) List of Level3's routers to which OVH routers are connected. """ rules = [ Rule("-A INPUT -p 89 -j DROP"), Rule("-A OUTPUT -p 89 -j DROP") ] # Drop incoming and outgoing OSPF packets (for external AS) families = (AF_INET(redistribute=("connected", )), AF_INET6(redistribute=("connected", ))) for router in ovh_routers: router.addDaemon(BGP, address_families=families) ovh_rules = list() for interface in router.interfaces().getInterfaces(): if "_" not in interface.getPeerRouter( ): # Check if it is a peer router ovh_rules.append( Rule("-A INPUT -i {} -p 89 -j DROP".format( interface))) # Drop OSPF packets from other AS ovh_rules.append( Rule("-A OUTPUT -o {} -p 89 -j DROP".format( interface))) # Drop OSPF packets to other AS # Accept 30 connections before limiting a 2 connections per second ovh_rules.append( Rule( "-A INPUT -i {} -m limit --limit 2/s --limit-burst 30 -j ACCEPT" .format(interface))) router.addDaemon(IPTables, rules=ovh_rules) router.addDaemon(IP6Tables, rules=ovh_rules) # Other AS advertise specific prefixes for router in external_routers: router.addDaemon(BGP, address_families=families) router.addDaemon(IPTables, rules=rules) router.addDaemon(IP6Tables, rules=rules)
def add_daemons(self, router, daemons, default_daemons=[]): """ Add daemon to router. Arguments : - router : the router class to which add daemons. - daemons : daemons specific for this router. - default_daemons : daemons by default. daemons and default_daemons can be : - list : name of daemons (will be added without specific config). - dict : {daemon_name : dict (config)} """ if isinstance(default_daemons, list): default_daemons = {d: {} for d in default_daemons} if isinstance(daemons, list): daemons = {d: {} for d in daemons} daemons = deep_merge(default_daemons, daemons) for d, d_config in daemons.items(): if self.debug: print("Adding daemon {} with config {}".format(d, d_config)) if d == 'ospf': router.addDaemon(OSPF) elif d == 'ospf6': router.addDaemon(OSPF6) elif d == 'bgp': if 'networks' in d_config: d_config['networks'] = format_address( d_config['networks'], self.__prefixes) if 'communities' in d_config: self.__communities[router] = d_config["communities"] families = (AF_INET(redistribute=('connected', )), AF_INET6(redistribute=('connected', ))) router.addDaemon(BGP, address_families=families) else: raise NotImplementedError( "Daemon {} is not supported yet !".format(d)) return True
def add_daemons(self, router, daemons, default_daemons=[]): if isinstance(default_daemons, list): default_daemons = {d: {} for d in default_daemons} if isinstance(daemons, list): daemons = {d: {} for d in daemons} daemons = {**default_daemons, **daemons} for d, d_config in daemons.items(): if self.debug: print("Adding daemon {} with config {}".format(d, d_config)) if d == 'ospf': router.addDaemon(OSPF) elif d == 'ospf6': router.addDaemon(OSPF6) elif d == 'bgp': if 'networks' in d_config: d_config['networks'] = format_address( d_config['networks'], self.__prefixes) families = (AF_INET(redistribute=('connected', )), AF_INET6(redistribute=('connected', ))) router.addDaemon(BGP, address_families=families) return True
def build(self, *args, **kwargs): """ +-----+ +-----+ +---+as4r | |as3r +---+ | +--+--+ +--+--+ | | | \ = / = | = | = | | \ / | | | | \ / | | | $ | $ \ | | | | / \ | | | | / \ | | | V / \ | | | +-----+ +--+--+ | | |as2r | |as5r | | | +--+--+ +-----+ | | | = | | | | | | | | | | | | | | +--+--+ | +-->+as1r +-----------------+ +-----+ """ list_as_name = ["as1r", "as2r", "as3r", "as4r", "as5r"] link_type_name = ["SHARE", "CLIENT_PROVIDER"] link_type_object = [SHARE, CLIENT_PROVIDER] expected_format = '[AS1] [AS2] [LINK]' link = input( "Please enter the link you wish to add or 'ok' to let the network as it is\n" "To add a link between 2 AS, type '" + expected_format + "' where\n" " - [AS1] is the first AS (e.g. 'as1r')\n" "- [AS2] is the second AS (e.g. " "'as2r')\n " " - [LINK] is the type of link, i.e.\n" " * 'SHARE' for a shared-cost link\n" " * 'CLIENT_PROVIDER' for a " "client-provider link\n") while True: try: l, change = check_correct_link(link, list_as_name, link_type_name) break except Exception as e: link = input("Error: {}\n Try again: '".format(str(e)) + expected_format + "'\n") # Add all routers as1r = self.addRouter('as1r') as2r = self.addRouter('as2r') as3r = self.addRouter('as3r') as4r = self.addRouter('as4r') as5r = self.addRouter('as5r') list_as_object = [as1r, as2r, as3r, as4r, as5r] as1r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:1::/48', )), )) as2r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:2::/48', )), )) as3r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:3::/48', )), )) as4r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:4::/48', )), )) as5r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:5::/48', )), )) # Add links self.addLink(as1r, as2r) self.addLink(as1r, as3r) self.addLink(as1r, as4r) self.addLink(as2r, as3r) self.addLink(as2r, as4r) self.addLink(as3r, as5r) self.addLink(as4r, as5r) # Set AS-ownerships self.addAS(1, (as1r, )) self.addAS(2, (as2r, )) self.addAS(3, (as3r, )) self.addAS(4, (as4r, )) self.addAS(5, (as5r, )) # Add BGP peering ebgp_session(self, as1r, as2r, SHARE) ebgp_session(self, as1r, as3r, SHARE) ebgp_session(self, as2r, as3r, SHARE) ebgp_session(self, as3r, as5r, SHARE) ebgp_session(self, as4r, as5r, SHARE) ebgp_session(self, as4r, as1r, CLIENT_PROVIDER) ebgp_session(self, as4r, as2r, CLIENT_PROVIDER) # Add custom link if change: src_as = None dst_as = None link_chosen = None for i in range(len(list_as_object)): if l[0] == list_as_name[i]: src_as = list_as_object[i] if dst_as is not None: break if l[1] == list_as_name[i]: dst_as = list_as_object[i] if src_as is not None: break for i in range(len(link_type_object)): if l[2] == link_type_name[i]: link_chosen = link_type_object[i] break self.addLink(src_as, dst_as) ebgp_session(self, src_as, dst_as, link_chosen) # Add test hosts for r in self.routers(): self.addLink(r, self.addHost('h%s' % r)) super(BGPAdjust, self).build(*args, **kwargs)
def build(self, *args, **kwargs): r""" +-----+ +-----+ +---+as4r | |as3r +---+ | +--+--+ +--+--+ | | | \ = / = | = | = | | \ / | | | | \ / | | | $ | $ \ | | | | / \ | | | | / \ | | | V / \ | | | +-----+ +--+--+ | | |as2r | |as5r | | | +--+--+ +-----+ | | | = | | | | | | | | | | | | | | +--+--+ | +-->+as1r +-----------------+ +-----+ """ # Add all routers as1r, as2r, as3r, as4r, as5r = self.addRouters('as1r', 'as2r', 'as3r', 'as4r', 'as5r') routers = self.routers() prefix = { routers[i]: '2001:db:%04x::/48' % i for i in range(len(routers)) } as1r.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[as1r], )), )) as2r.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[as2r], )), )) as3r.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[as3r], )), )) as4r.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[as4r], )), )) as5r.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[as5r], )), )) # Add links self.addLinks((as1r, as2r), (as1r, as3r), (as1r, as4r), (as2r, as3r), (as2r, as4r), (as3r, as5r), (as4r, as5r)) # Set AS-ownerships self.addAS(1, (as1r, )) self.addAS(2, (as2r, )) self.addAS(3, (as3r, )) self.addAS(4, (as4r, )) self.addAS(5, (as5r, )) # Add BGP peering ebgp_session(self, as1r, as2r, link_type=SHARE) ebgp_session(self, as1r, as3r, link_type=SHARE) ebgp_session(self, as2r, as3r, link_type=SHARE) ebgp_session(self, as3r, as5r, link_type=SHARE) ebgp_session(self, as4r, as5r, link_type=SHARE) ebgp_session(self, as4r, as1r, link_type=CLIENT_PROVIDER) ebgp_session(self, as4r, as2r, link_type=CLIENT_PROVIDER) # Check extra link parameters self.check_extra_link() # Add custom link if self.as_start is not None: self.addLink(self.as_start, self.as_end) ebgp_session(self, self.as_start, self.as_end, link_type=self.bgp_policy) # Add test hosts for r in self.routers(): link = self.addLink(r, self.addHost('h%s' % r)) self.addSubnet(links=[link], subnets=[prefix[r]]) super().build(*args, **kwargs)
def build(self, *args, **kwargs): """ +-----+ +----->+as2r +<----------------+ | +-----+ | | $ $ | | | +--+--+ = +--+--+ | |as1r +-------------+ as3r| | +--+--+ +--+--+ | ^ ^ | | $ $ | | | | | +--+--+ = +--+--+ | |as4r +-------------+as8r | | +--+--+ +--+--+ | ^ ^ | | $ $ | | | | | +--+--+ = +--+--+ | |as6r+--------------+as5r +-------+ +--+--+ +--+--+ ^ | | $ $ | | +------+ | +------+ as7r +<----+ +------+ """ # Add all routers as1r = self.addRouter('as1r') as2r = self.addRouter('as2r') as3r = self.addRouter('as3r') as4r = self.addRouter('as4r') as5r = self.addRouter('as5r') as6r = self.addRouter('as6r') as7r = self.addRouter('as7r') as8r = self.addRouter('as8r') as1r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:1::/48', )), )) as2r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:2::/48', )), )) as3r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:3::/48', )), )) as4r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:4::/48', )), )) as5r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:5::/48', )), )) as6r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:6::/48', )), )) as7r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:7::/48', )), )) as8r.addDaemon( BGP, address_families=(AF_INET6(networks=('2001:db:8::/48', )), )) # Add links self.addLink(as1r, as2r) self.addLink(as1r, as3r) self.addLink(as1r, as4r) self.addLink(as2r, as5r) self.addLink(as3r, as8r) self.addLink(as4r, as6r) self.addLink(as4r, as8r) self.addLink(as5r, as6r) self.addLink(as5r, as7r) self.addLink(as5r, as8r) self.addLink(as6r, as7r) # Set AS-ownerships self.addAS(1, (as1r, )) self.addAS(2, (as2r, )) self.addAS(3, (as3r, )) self.addAS(4, (as4r, )) self.addAS(5, (as5r, )) self.addAS(6, (as6r, )) self.addAS(7, (as7r, )) self.addAS(8, (as8r, )) # Add BGP peering ebgp_session(self, as1r, as3r, SHARE) ebgp_session(self, as4r, as8r, SHARE) ebgp_session(self, as6r, as5r, SHARE) ebgp_session(self, as1r, as2r, CLIENT_PROVIDER) ebgp_session(self, as4r, as1r, CLIENT_PROVIDER) ebgp_session(self, as5r, as2r, CLIENT_PROVIDER) ebgp_session(self, as5r, as7r, CLIENT_PROVIDER) ebgp_session(self, as5r, as8r, CLIENT_PROVIDER) ebgp_session(self, as6r, as4r, CLIENT_PROVIDER) ebgp_session(self, as7r, as6r, CLIENT_PROVIDER) ebgp_session(self, as8r, as3r, CLIENT_PROVIDER) # Add test hosts for r in self.routers(): self.addLink(r, self.addHost('h%s' % r)) super(BGPMultipleWays, self).build(*args, **kwargs)
def build(self, *args, **kwargs): """ Topo from slide 26 iBGP """ # Add all routers as1r1 = self.bgp('as1r1') as1r2 = self.bgp('as1r2') as1r3 = self.bgp('as1r3') as1r4 = self.bgp('as1r4') as1r5 = self.bgp('as1r5') as1r6 = self.bgp('as1r6') as4r1 = self.bgp('as4r1') as4r2 = self.bgp('as4r2') as3r1 = self.bgp('as3r1') as3r2 = self.bgp('as3r2') as2r1 = self.addRouter('as2r1') as2r1.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), )) as2h1 = self.addHost("as2h1") as1h1 = self.addHost("as1h1") as1h2 = self.addHost("as1h2") as1h3 = self.addHost("as1h3") as1h4 = self.addHost("as1h4") as1h5 = self.addHost("as1h5") as1h6 = self.addHost("as1h6") # Add Links self.addLink(as1r1, as1r6, params1={"ip": ("fd00:1:1::1/48", )}, params2={"ip": ("fd00:1:1::2/48", )}) self.addLink(as1r1, as1r3, params1={"ip": ("fd00:1:2::1/48", )}, params2={"ip": ("fd00:1:2::2/48", )}) self.addLink(as1r3, as1r2, params1={"ip": ("fd00:1:4::1/48", )}, params2={"ip": ("fd00:1:4::2/48", )}) self.addLink(as1r3, as1r6, params1={"ip": ("fd00:1:3::1/48", )}, params2={"ip": ("fd00:1:3::2/48", )}) self.addLink(as1r2, as1r4, params1={"ip": ("fd00:1:5::1/48", )}, params2={"ip": ("fd00:1:5::2/48", )}) self.addLink(as1r4, as1r5, params1={"ip": ("fd00:1:6::1/48", )}, params2={"ip": ("fd00:1:6::2/48", )}) self.addLink(as1r5, as1r6, params1={"ip": ("fd00:1:7::1/48", )}, params2={"ip": ("fd00:1:7::2/48", )}) self.addLink(as4r1, as1r5, params1={"ip": ("fd00:4:2::1/48", )}, params2={"ip": ("fd00:4:2::2/48", )}) self.addLink(as4r2, as1r4, params1={"ip": ("fd00:4:1::1/48", )}, params2={"ip": ("fd00:4:1::2/48", )}) self.addLink(as3r2, as1r1, params1={"ip": ("fd00:3:1::1/48", )}, params2={"ip": ("fd00:3:1::2/48", )}) self.addLink(as3r1, as1r6, params1={"ip": ("fd00:3:2::1/48", )}, params2={"ip": ("fd00:3:2::2/48", )}) self.addLink(as3r1, as3r2, params1={"ip": ("fd00:3:3::1/48", )}, params2={"ip": ("fd00:3:3::2/48", )}, igp_cost=7) self.addLink(as3r1, as2r1, params1={"ip": ("fd00:2:1::1/48", )}, params2={"ip": ("fd00:2:1::2/48", )}) self.addLink(as2r1, as4r1, params1={"ip": ("fd00:2:2::1/48", )}, params2={"ip": ("fd00:2:2::2/48", )}) self.addLink(as4r1, as4r2, params1={"ip": ("fd00:4:3::1/48", )}, params2={"ip": ("fd00:4:3::2/48", )}, igp_cost=2) self.addLink(as2r1, as2h1, params1={"ip": ("dead:beef::1/32", )}, params2={"ip": ("dead:beef::2/32", )}) self.addLink(as1r1, as1h1) self.addLink(as1r2, as1h2) self.addLink(as1r3, as1h3) self.addLink(as1r4, as1h4) self.addLink(as1r5, as1h5) self.addLink(as1r6, as1h6) # Set Med al = AccessList(name='all', entries=('any', )) as3r2.get_config(BGP).set_med(7, to_peer=as1r1, matching=(al, )) as3r1.get_config(BGP).set_med(0, to_peer=as1r6, matching=(al, )) as4r1.get_config(BGP).set_med(0, to_peer=as1r5, matching=(al, )) as4r2.get_config(BGP).set_med(2, to_peer=as1r4, matching=(al, )) # Add full mesh self.addAS(2, (as2r1, )) self.addiBGPFullMesh(3, routers=[as3r1, as3r2]) self.addiBGPFullMesh(4, routers=[as4r1, as4r2]) self.addiBGPFullMesh( 1, routers=[as1r1, as1r2, as1r3, as1r4, as1r5, as1r6]) # Add eBGP session ebgp_session(self, as1r6, as3r1) ebgp_session(self, as1r1, as3r2) ebgp_session(self, as1r4, as4r2) ebgp_session(self, as1r5, as4r1) ebgp_session(self, as3r1, as2r1) ebgp_session(self, as2r1, as4r1) super(MedBGPTopo, self).build(*args, **kwargs)
def build(self, *args, **kwargs): """ + AS1 | AS3 +----------------------------+ | | | +---+---+ | +---+---+ | as1r1 +--------+ | | as3r1 | +---+---+ | | +---+---+ | | | | 2 | | +-------|------------+ | | | | AS5 +---+---+ +---+---+ | +---+---+ | as1r3 +----+ as1r6 +-------+ as5r1 + +---+---+ +---+---+ | +---+---+ | | | | | | +-------|------------+ | | | | AS2 +---+---+ | | +---+---+ +---+---+ | as1r2 | | | | as2r1 +----+ as2h1 | +---+---+ | | +---+---+ +---+---+ | | | | 4 | | +-------|------------+ | | | | AS4 +---+---+ +---+---+ | +---+---+ | as1r4 +----+ as1r5 +-------+ as4r1 + +---+---+ +-------+ | +---+---+ | | | | | +---+---+ +------------------------+ as4r2 + | +-------+ | + """ # Add all routers as1r1 = self.bgp('as1r1') as1r2 = self.bgp('as1r2') as1r3 = self.bgp('as1r3') as1r4 = self.bgp('as1r4') as1r5 = self.bgp('as1r5', family=AF_INET6(redistribute=('ospf6', 'connected'))) as1r6 = self.bgp('as1r6', family=AF_INET6(redistribute=('ospf6', 'connected'))) as4r1 = self.bgp('as4r1', family=AF_INET6(redistribute=('ospf6', 'connected'))) as4r2 = self.bgp('as4r2', family=AF_INET6(redistribute=('ospf6', 'connected'))) as5r1 = self.bgp('as5r1', family=AF_INET6(redistribute=('connected',))) as3r1 = self.bgp('as3r1', family=AF_INET6(redistribute=('connected',))) as2r1 = self.bgp('as2r1', family=AF_INET6(networks=('dead:beef::/32',))) # Add host as2h1 = self.addHost('as2h1') # Add Links self.addLink(as1r1, as1r6) self.addLink(as1r1, as1r3, igp_metric=2) self.addLinks((as1r3, as1r2), (as1r3, as1r6)) self.addLink(as1r2, as1r4, igp_metric=4) self.addLinks((as1r4, as1r5), (as1r5, as1r6), (as4r1, as1r5), (as4r2, as1r4), (as3r1, as1r1), (as5r1, as1r6), (as3r1, as5r1), (as5r1, as2r1), (as2r1, as4r1), (as4r1, as4r2), (as2r1, as2h1)) self.addSubnet((as2r1, as2h1), subnets=('dead:beef::/32',)) set_rr(self, rr=as1r1, peers=[as1r3, as1r2, as1r4, as1r5, as1r6]) set_rr(self, rr=as1r5, peers=[as1r1, as1r2, as1r4, as1r3, as1r6]) # Add full mesh self.addAS(2, (as2r1,)) self.addAS(3, (as3r1,)) self.addAS(5, (as5r1,)) self.addiBGPFullMesh(4, routers=[as4r1, as4r2]) self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6)) # Add eBGP session ebgp_session(self, as1r6, as5r1) ebgp_session(self, as1r1, as3r1) ebgp_session(self, as1r4, as4r2) ebgp_session(self, as1r5, as4r1) ebgp_session(self, as3r1, as5r1) ebgp_session(self, as5r1, as2r1) ebgp_session(self, as2r1, as4r1) super().build(*args, **kwargs)
def build(self, *args, **kwargs): """ Topo from slide 30 iBGP """ # Add all routers as1r1 = self.addRouter('as1r1') as1r1.addDaemon(BGP, address_families=(AF_INET6(networks=('1:1::/48', )), )) as1r2 = self.addRouter('as1r2') as1r2.addDaemon(BGP, address_families=(AF_INET6(networks=('1:1::/48', )), )) as1r3 = self.addRouter('as1r3') as1r3.addDaemon(BGP, address_families=(AF_INET6(networks=('1:1::/48', )), )) as1r4 = self.addRouter('as1r4') as1r4.addDaemon(BGP, address_families=(AF_INET6(networks=('1:1::/48', )), )) as2r1 = self.addRouter('as2r1') as2r1.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/48', )), )) h1 = self.addHost('h1') as3r1 = self.addRouter('as3r1') as3r1.addDaemon( BGP, address_families=(AF_INET6(networks=('beef:dead::/48', )), )) as3r2 = self.addRouter('as3r2') as3r2.addDaemon( BGP, address_families=(AF_INET6(networks=('beef:dead::/48', )), )) h2 = self.addHost('h2') # Add links self.addLink(as1r1, as1r2) self.addLink(as1r1, as1r3) self.addLink(as1r3, as1r4) self.addLink(as1r2, as1r4) self.addLink(as1r3, as2r1) self.addLink(as1r2, as3r1) self.addLink(as3r1, as3r2) self.addLink(as3r2, as2r1) self.addLink(as2r1, h1, params1={"ip": "dead:beef::/48"}, params2={"ip": "dead:beef::1/48"}) self.addLink(as3r1, h2, params1={"ip": "dead:beef::4/48"}, params2={"ip": "dead:beef::5/48"}) self.addLink(as3r2, h2, params1={"ip": "dead:beef::2/48"}, params2={"ip": "dead:beef::3/48"}) # Add AS and fullmeshes self.addAS(2, (as2r1, )) self.addiBGPFullMesh(1, routers=[as1r1, as1r2, as1r3, as1r4]) self.addiBGPFullMesh(3, routers=[as3r1, as3r2]) # Add eBGP sessions ebgp_session(self, as1r2, as3r1) ebgp_session(self, as3r2, as2r1) ebgp_session(self, as2r1, as1r3) super(SimpleBGPTopoRoutes, self).build(*args, **kwargs)
def build(self, *args, **kwargs): family = AF_INET6() lan_as1_h1 = 'cafe:babe:dead:beaf::/64' lan_as2_h2 = 'c1a4:4ad:c0ff:ee::/64' # first step, adding routers # routers of as1 as1_rr1 = self.addRouter("as1_rr1", config=RouterConfig) as1_rr2 = self.addRouter("as1_rr2", config=RouterConfig) as1_s1 = self.addRouter("as1_s1", config=RouterConfig) as1_s2 = self.addRouter("as1_s2", config=RouterConfig) # adding OSPF6 as IGP as1_rr1.addDaemon(OSPF6) as1_rr2.addDaemon(OSPF6) as1_s1.addDaemon(OSPF6) as1_s2.addDaemon(OSPF6) # adding BGP to establish iBGP sessions as1_rr1.addDaemon(BGP, address_families=(AF_INET6(networks=(lan_as1_h1,),),)) as1_rr2.addDaemon(BGP, address_families=(AF_INET6(networks=(lan_as1_h1,),),)) as1_s1.addDaemon(BGP, address_families=(family,)) as1_s2.addDaemon(BGP, address_families=(family,)) # set the ASN for routers belonging to AS1 self.addAS(1, (as1_rr1, as1_rr2, as1_s1, as1_s2)) # configure as1_rr{1,2} as route reflectors set_rr(self, rr=as1_rr1, peers=[as1_s1, as1_rr2]) set_rr(self, rr=as1_rr2, peers=[as1_s2, as1_rr1]) # routers of as2 as2_cl1 = self.addRouter("as2_cl1", config=RouterConfig) as2_cl2 = self.addRouter("as2_cl2", config=RouterConfig) # adding a BGP daemon for AS2 routers as2_cl1.addDaemon(BGP, address_families=(AF_INET6(redistribute=['connected']),)) as2_cl2.addDaemon(BGP, address_families=(AF_INET6(redistribute=['connected']),)) # set the ASN for routers belonging to AS2 self.addAS(2, (as2_cl1, as2_cl2)) # we add a host in as1 as1_h1 = self.addHost("as1_h1") # and also in as2 as2_h2 = self.addHost("as2_h2") # The goal of this network is to establish a connection between h1 and h2 # adding links between the routers (and hosts) self.addLink(as1_rr1, as1_rr2, igp_metric=5) self.addLinks((as1_s1, as1_s2), (as1_s1, as1_rr2), (as1_s2, as1_rr1), (as1_rr1, as2_cl1), (as1_rr2, as2_cl2), (as1_h1, as1_s2), (as2_cl1, as2_h2), (as2_cl2, as2_h2)) # adding a subnet between hosts and routers self.addSubnet((as1_s2, as1_h1), subnets=(lan_as1_h1,)) self.addSubnet((as2_cl1, as2_h2), subnets=(lan_as2_h2,)) self.addSubnet((as2_cl2, as2_h2), subnets=(lan_as2_h2,)) # adding eBGP sessions between the two ASes ebgp_session(self, as2_cl1, as1_rr1, link_type=SHARE) ebgp_session(self, as2_cl2, as1_rr2, link_type=SHARE) super().build(*args, **kwargs)
def bgp(self, name, family=AF_INET6()): r = self.addRouter(name) r.addDaemon(BGP, address_families=(family, )) return r
def build(self, *args, **kwargs): """ Build the topology of our OVH network and set up it by adding routers, links, protocols, setting up routers reflectors, etc. """ # Adding routers fra1_g1 = self.addRouter("fra1_g1", [ IPv6Address("2023", "a", "c", "0", "0", "0", "0", "1", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 1, IPV4_LO_PREFIX).__str__() ]) fra1_g2 = self.addRouter("fra1_g2", [ IPv6Address("2023", "a", "c", "0", "0", "0", "0", "2", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 2, IPV4_LO_PREFIX).__str__() ]) fra_sbb1 = self.addRouter("fra_sbb1", [ IPv6Address("2023", "a", "c", "0", "0", "0", "0", "3", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 3, IPV4_LO_PREFIX).__str__() ]) fra_sbb2 = self.addRouter("fra_sbb2", [ IPv6Address("2023", "a", "c", "0", "0", "0", "0", "4", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 4, IPV4_LO_PREFIX).__str__() ]) fra_1 = self.addRouter("fra_1", [ IPv6Address("2023", "a", "c", "0", "0", "0", "0", "5", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 5, IPV4_LO_PREFIX).__str__() ]) fra_5 = self.addRouter("fra_5", [ IPv6Address("2023", "a", "c", "0", "0", "0", "0", "6", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 6, IPV4_LO_PREFIX).__str__() ]) rbx_g1 = self.addRouter("rbx_g1", [ IPv6Address("2023", "a", "d", "0", "0", "0", "0", "1", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 7, IPV4_LO_PREFIX).__str__() ]) rbx_g2 = self.addRouter("rbx_g2", [ IPv6Address("2023", "a", "d", "0", "0", "0", "0", "2", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 8, IPV4_LO_PREFIX).__str__() ]) sbg_g1 = self.addRouter("sbg_g1", [ IPv6Address("2023", "a", "e", "0", "0", "0", "0", "1", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 9, IPV4_LO_PREFIX).__str__() ]) sbg_g2 = self.addRouter("sbg_g2", [ IPv6Address("2023", "a", "e", "0", "0", "0", "0", "2", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 10, IPV4_LO_PREFIX).__str__() ]) par_th2 = self.addRouter("par_th2", [ IPv6Address("2023", "a", "f", "0", "0", "0", "0", "1", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 11, IPV4_LO_PREFIX).__str__() ]) par_gsw = self.addRouter("par_gsw", [ IPv6Address("2023", "a", "f", "0", "0", "0", "0", "2", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 12, IPV4_LO_PREFIX).__str__() ]) telia = self.addRouter("telia", [ IPv6Address("2299", "a", "5", "0", "0", "0", "0", "1", IPV6_LO_PREFIX).__str__(), IPv4Address(123, 3, 2, 1, IPV4_LO_PREFIX).__str__() ]) google = self.addRouter("google", [ IPv6Address("2169", "a", "6", "0", "0", "0", "0", "1", IPV6_LO_PREFIX).__str__(), IPv4Address(124, 3, 2, 1, IPV4_LO_PREFIX).__str__() ]) cogent = self.addRouter("cogent", [ IPv6Address("2174", "a", "7", "0", "0", "0", "0", "1", IPV6_LO_PREFIX).__str__(), IPv4Address(125, 3, 2, 1, IPV4_LO_PREFIX).__str__() ]) level3 = self.addRouter("level3", [ IPv6Address("2356", "a", "8", "0", "0", "0", "0", "1", IPV6_LO_PREFIX).__str__(), IPv4Address(126, 3, 2, 1, IPV4_LO_PREFIX).__str__() ]) all_routers = [ fra1_g1, fra1_g2, fra_sbb1, fra_sbb2, fra_1, fra_5, rbx_g1, rbx_g2, sbg_g1, sbg_g2, par_th2, par_gsw, telia, google, cogent, level3 ] fra_routers = [fra1_g1, fra1_g2, fra_sbb1, fra_sbb2, fra_1, fra_5] # In Frankfurt rbx_routers = [rbx_g1, rbx_g2] # In Roubaix sbg_routers = [sbg_g1, sbg_g2] # In Strasbourg par_routers = [par_th2, par_gsw] # In Paris ovh_routers = fra_routers + rbx_routers + sbg_routers + par_routers external_routers = [telia, google, cogent, level3] # Adding physical links self.add_physical_link(fra1_g1, fra1_g2, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "0", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 0, IPV4_LINK_PREFIX))) self.add_physical_link(fra1_g1, fra_sbb1, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "2", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 2, IPV4_LINK_PREFIX))) self.add_physical_link(fra1_g2, fra_sbb2, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "4", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 4, IPV4_LINK_PREFIX))) self.add_physical_link(fra_sbb1, fra_sbb2, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "6", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 6, IPV4_LINK_PREFIX))) self.add_physical_link(fra_sbb1, fra_5, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "8", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 8, IPV4_LINK_PREFIX))) self.add_physical_link(fra_sbb1, fra_1, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "a", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 10, IPV4_LINK_PREFIX))) self.add_physical_link( fra_sbb1, sbg_g1, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "c", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 12, IPV4_LINK_PREFIX)), igp_cost_value=2) self.add_physical_link( fra_sbb1, rbx_g1, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "e", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 14, IPV4_LINK_PREFIX)), igp_cost_value=5) self.add_physical_link(fra_sbb2, fra_1, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "10", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 16, IPV4_LINK_PREFIX))) self.add_physical_link(fra_sbb2, fra_5, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "12", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 18, IPV4_LINK_PREFIX))) self.add_physical_link( fra_sbb2, rbx_g2, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "14", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 20, IPV4_LINK_PREFIX)), igp_cost_value=5) self.add_physical_link( fra_sbb2, sbg_g2, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "16", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 22, IPV4_LINK_PREFIX)), igp_cost_value=2) self.add_physical_link(fra_1, telia, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "18", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 24, IPV4_LINK_PREFIX))) self.add_physical_link(fra_5, telia, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "1a", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 26, IPV4_LINK_PREFIX))) self.add_physical_link(fra_5, level3, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "1c", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 28, IPV4_LINK_PREFIX))) self.add_physical_link(rbx_g1, rbx_g2, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "1e", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 30, IPV4_LINK_PREFIX))) self.add_physical_link( rbx_g1, par_th2, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "20", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 32, IPV4_LINK_PREFIX)), igp_cost_value=3) self.add_physical_link(rbx_g2, par_gsw, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "22", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 34, IPV4_LINK_PREFIX))) self.add_physical_link(sbg_g1, sbg_g2, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "24", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 36, IPV4_LINK_PREFIX))) self.add_physical_link( sbg_g1, par_th2, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "26", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 38, IPV4_LINK_PREFIX)), igp_cost_value=5) self.add_physical_link(par_th2, par_gsw, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "28", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 40, IPV4_LINK_PREFIX))) self.add_physical_link( par_th2, google, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "2a", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 42, IPV4_LINK_PREFIX)), igp_cost_value=2) self.add_physical_link(par_th2, cogent, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "2c", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 44, IPV4_LINK_PREFIX))) self.add_physical_link( par_gsw, sbg_g2, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "2e", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 46, IPV4_LINK_PREFIX)), igp_cost_value=5) self.add_physical_link(par_gsw, level3, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "30", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 48, IPV4_LINK_PREFIX))) self.add_physical_link(par_gsw, cogent, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "32", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 50, IPV4_LINK_PREFIX))) self.add_physical_link( par_gsw, google, (IPv6Address("2023", "b", "0", "0", "0", "0", "0", "34", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 52, IPV4_LINK_PREFIX)), igp_cost_value=2) # Adding OSPF and BGP daemons to routers self.add_ospf(all_routers) self.add_bgp(ovh_routers, external_routers) # Adding AS ownerships self.addAS(OVH_AS, (fra1_g1, fra1_g2, fra_sbb1, fra_sbb2, fra_1, fra_5, rbx_g1, rbx_g2, sbg_g1, par_th2, par_gsw, sbg_g2)) self.addAS(TELIA_AS, (telia, )) self.addAS(COGENT_AS, (cogent, )) self.addAS(LEVEL3_AS, (level3, )) self.addAS(GOOGLE_AS, (google, )) # Configuring RRs/iBGP sessions peers_fra_fr5_sbb1 = peers_fra_5 = [fra1_g1, fra1_g2, fra_sbb2, fra_1] peers_rbx_g1 = peers_rbx_g2 = [sbg_g1, par_th2, par_gsw, sbg_g2] set_rr(self, rr=fra_sbb1, peers=peers_fra_fr5_sbb1) set_rr(self, rr=fra_5, peers=peers_fra_5) set_rr(self, rr=rbx_g1, peers=peers_rbx_g1) set_rr(self, rr=rbx_g2, peers=peers_rbx_g2) self.addiBGPFullMesh(16276, routers=[fra_sbb1, fra_5, rbx_g1, rbx_g2]) # (4*3)/2 iBGP sessions # Adding eBGP sessions ebgp_session(self, telia, fra_1, link_type=CLIENT_PROVIDER) ebgp_session(self, telia, fra_5, link_type=CLIENT_PROVIDER) ebgp_session(self, level3, fra_5, link_type=CLIENT_PROVIDER) ebgp_session(self, google, par_gsw, link_type=CLIENT_PROVIDER) ebgp_session(self, cogent, par_gsw, link_type=CLIENT_PROVIDER) ebgp_session(self, level3, par_gsw, link_type=CLIENT_PROVIDER) ebgp_session(self, cogent, par_th2, link_type=CLIENT_PROVIDER) ebgp_session(self, google, par_th2, link_type=CLIENT_PROVIDER) # DNS anycast sbg_web = self.addHost("sbg_web") fra_server = self.addRouter("fra_server", [ IPv6Address("2023", "a", "c", "0", "0", "0", "0", "7", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 13, IPV4_LO_PREFIX).__str__() ]) rbx_server = self.addRouter("rbx_server", [ IPv6Address("2023", "a", "c", "0", "0", "0", "0", "7", IPV6_LO_PREFIX).__str__(), IPv4Address(12, 16, 216, 13, IPV4_LO_PREFIX).__str__() ]) fra_server.addDaemon( BGP, address_families=(AF_INET(redistribute=("connected", )), AF_INET6(redistribute=("connected", )))) rbx_server.addDaemon( BGP, address_families=(AF_INET(redistribute=("connected", )), AF_INET6(redistribute=("connected", )))) self.addAS(64512, (fra_server, )) # private ASN self.addAS(64513, (rbx_server, )) self.add_physical_link(rbx_g1, rbx_server, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "36", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 54, IPV4_LINK_PREFIX))) self.add_physical_link(fra_sbb2, fra_server, (IPv6Address( "2023", "b", "0", "0", "0", "0", "0", "36", IPV6_LINK_PREFIX), IPv4Address(12, 16, 217, 54, IPV4_LINK_PREFIX))) self.add_physical_link(sbg_g2, sbg_web, (IPv6Address( "2023", "e", "2", "0", "0", "0", "0", "3", IPV6_LINK_PREFIX), IPv4Address(12, 16, 218, 71, IPV4_LINK_PREFIX))) ebgp_session(self, fra_server, fra_sbb2, link_type=CLIENT_PROVIDER) ebgp_session(self, rbx_server, rbx_g1, link_type=CLIENT_PROVIDER) fra_server.addDaemon(Named) rbx_server.addDaemon(Named) self.addDNSZone(name=DOMAIN, dns_master=fra_server, dns_slaves=[rbx_server], nodes=[sbg_web]) reverse_domain_name_ipv6 = ip_address("2023::").reverse_pointer[ -10:] # adding a missing PTR record ptr_record_ipv6 = PTRRecord( IPv6Address("2023", "b", "0", "0", "0", "0", "0", "38", IPV6_LINK_PREFIX).__str__()[:-4], sbg_web + f".{DOMAIN}") self.addDNSZone(name=reverse_domain_name_ipv6, dns_master=fra_server, dns_slaves=[rbx_server], ns_domain_name=DOMAIN, records=[ptr_record_ipv6]) super().build(*args, **kwargs)
def build(self, *args, **kwargs): # --- Metrics --- small = 1 medium = 3 large = 8 extra_large = 13 # IPv4 range 198.27.92.0/24 # IPv6 range 2604:2dc0::/32 # lan USA : 2604:2dc0:0000::/34 # OTHER : 2604:2dc0:2000::/34 # lan APAC : 2604:2dc0:4000::/34 # lan EU : 2604:2dc0:8000::/34 #OVH = \32 #OVH+continent = \34 #OVH+continent+type = \36 # ===================== OVH Router configurations ================== # 16 routers identified by a single IPv4, IPv6 address # ================================================================== # --- Routers configuration --- sin = self.addRouter("sin", config=RouterConfig,lo_addresses=["2604:2dc0:4000::0/36","198.27.92.0/24"]) syd = self.addRouter("syd", config=RouterConfig,lo_addresses=["2604:2dc0:4000::1/36","198.27.92.1/24"]) pao = self.addRouter("pao", config=RouterConfig,lo_addresses=["2604:2dc0::0/36","198.27.92.2/24"]) sjo = self.addRouter("sjo", config=RouterConfig,lo_addresses=["2604:2dc0::1/36","198.27.92.3/24"]) lax1 = self.addRouter("lax1", config=RouterConfig,lo_addresses=["2604:2dc0::2/36","198.27.92.4/24"]) chi1 = self.addRouter("chi1", config=RouterConfig,lo_addresses=["2604:2dc0::3/36","198.27.92.5/24"]) chi5 = self.addRouter("chi5", config=RouterConfig,lo_addresses=["2604:2dc0::4/36","198.27.92.6/24"]) bhs1 = self.addRouter("bhs1", config=RouterConfig,lo_addresses=["2604:2dc0::5/36","198.27.92.7/24"]) bhs2 = self.addRouter("bhs2", config=RouterConfig,lo_addresses=["2604:2dc0::6/36","198.27.92.8/24"]) ash1 = self.addRouter("ash1", config=RouterConfig,lo_addresses=["2604:2dc0::7/36","198.27.92.9/24"]) ash5 = self.addRouter("ash5", config=RouterConfig,lo_addresses=["2604:2dc0::8/36","198.27.92.10/24"]) nwk1 = self.addRouter("nwk1", config=RouterConfig,lo_addresses=["2604:2dc0::9/36","198.27.92.11/24"]) nwk5 = self.addRouter("nwk5", config=RouterConfig,lo_addresses=["2604:2dc0::a/36","198.27.92.12/24"]) nyc = self.addRouter("nyc", config=RouterConfig,lo_addresses=["2604:2dc0::b/36","198.27.92.13/24"]) lon_thw = self.addRouter("lon_thw", config=RouterConfig,lo_addresses=["2604:2dc0:8000::0/36","198.27.92.14/24"]) lon_drch = self.addRouter("lon_drch", config=RouterConfig,lo_addresses=["2604:2dc0:8000::1/36","198.27.92.15/24"]) anycast1 = self.addRouter("anycast1",config = RouterConfig, lo_addresses = ["2604:2dc1::0/128","192.27.92.255/32",] ) anycast2 = self.addRouter("anycast2",config = RouterConfig, lo_addresses = ["2604:2dc1::0/128","192.27.92.255/32",] ) anycast3 = self.addRouter("anycast3",config = RouterConfig, lo_addresses = ["2604:2dc1::0/128","192.27.92.255/32",] ) anycastServers = [anycast1,anycast2,anycast3] OVHRouters = [sin, syd, pao, sjo, lax1, chi1, chi5, bhs1, bhs2, ash1, ash5, nwk1, nwk5, nyc, lon_thw, lon_drch,anycast1,anycast2,anycast3] NARouters = [pao,sjo,lax1,chi1,chi5,bhs1,bhs2,ash1,ash5,nwk1,nwk5,nyc] APACRouters = [sin,syd] EURouters = [lon_thw,lon_drch] self.addAS(16276, OVHRouters) # --- Subnets of each router --- # IPv6 subnetSin6 = "2604:2dc0:4800::0/40" subnetSyd6 = "2604:2dc0:4900::0/40" subnetPao6 = "2604:2dc0:0800::0/40" subnetSjo6 = "2604:2dc0:0900::0/40" subnetLax16 = "2604:2dc0:0a00::0/40" subnetChi16 = "2604:2dc0:0b00::0/40" subnetChi56 = "2604:2dc0:0c00::0/40" subnetBhs16 = "2604:2dc0:0d00::0/40" subnetBhs26 = "2604:2dc0:0e00::0/40" subnetAsh16 = "2604:2dc0:0f00::0/40" subnetAsh56 = "2604:2dc0:1000::0/40" subnetNwk16 = "2604:2dc0:1100::0/40" subnetNwk56 = "2604:2dc0:1200::0/40" subnetNyc6 = "2604:2dc0:1300::0/40" subnetLon_thw6 = "2604:2dc0:8800::0/40" subnetLon_drch6 = "2604:2dc0:8900::0/40" # IPv4 subnetSin = "198.27.92.16/28" subnetSyd = "198.27.92.32/28" subnetPao = "198.27.92.48/28" subnetSjo = "198.27.92.64/28" subnetLax1 = "198.27.92.80/28" subnetChi1 = "198.27.92.96/28" subnetChi5 = "198.27.92.112/28" subnetBhs1 = "198.27.92.128/28" subnetBhs2 = "198.27.92.144/28" subnetAsh1 = "198.27.92.160/28" subnetAsh5 = "198.27.92.176/28" subnetNwk1 = "198.27.92.192/28" subnetNwk5 = "198.27.92.208/28" subnetNyc = "198.27.92.224/28" subnetLon_thw = "198.27.92.240/29" subnetLon_drch = "198.27.92.248/29" OVHSubsnets4 = [subnetSin, subnetSyd,subnetPao,subnetSjo,subnetLax1,subnetChi1,subnetChi5,subnetBhs1,subnetBhs2,subnetAsh1,subnetAsh5,subnetNwk1,subnetNwk5,subnetNyc,subnetLon_thw,subnetLon_drch] OVHSubsnets6 = [subnetSin6, subnetSyd6,subnetPao6,subnetSjo6,subnetLax16,subnetChi16,subnetChi56,subnetBhs16,subnetBhs26,subnetAsh16,subnetAsh56,subnetNwk16,subnetNwk56,subnetNyc6,subnetLon_thw6,subnetLon_drch6] # ====== Host configuration ======================================== # # ================================================================== hpao = self.addHost("hpao") self.addLink(hpao,pao) hsjo = self.addHost("hsjo") self.addLink(hsjo,sjo) hlax1 = self.addHost("hlax1") self.addLink(hlax1,lax1) hchi1 = self.addHost("hchi1") self.addLink(hchi1,chi1) hchi5 = self.addHost("hchi5") self.addLink(hchi5,chi5) hbhs1 = self.addHost("hbhs1") self.addLink(hbhs1,bhs1) hbhs2 = self.addHost("hbhs2") self.addLink(hbhs2,bhs2) hash1 = self.addHost("hash1") self.addLink(hash1,ash1) hash5 = self.addHost("hash5") self.addLink(hash5,ash5) hnwk1 = self.addHost("hnwk1") self.addLink(hnwk1,nwk1) hnwk5 = self.addHost("hnwk5") self.addLink(hnwk5,nwk5) hnyc = self.addHost("hnyc") self.addLink(hnyc,nyc) hEU = self.addHost("hEU") self.addLink(hEU,lon_thw,igp_metric=1) hAPAC = self.addHost("hAPAC") self.addLink(hAPAC,sin,igp_metric=1) self.addSubnet(nodes = [sin,hAPAC], subnets = [subnetSin6, subnetSin]) self.addSubnet(nodes = [syd], subnets = [subnetSyd6,subnetSyd]) self.addSubnet(nodes = [pao,hpao], subnets = [subnetPao6,subnetPao]) self.addSubnet(nodes = [sjo,hsjo], subnets = [subnetSjo6,subnetSjo]) self.addSubnet(nodes = [lax1,hlax1], subnets = [subnetLax16,subnetLax1]) self.addSubnet(nodes = [chi1,hchi1], subnets = [subnetChi16,subnetChi1]) self.addSubnet(nodes = [chi5,hchi5], subnets = [subnetChi56,subnetChi5]) self.addSubnet(nodes = [bhs1,hbhs1], subnets = [subnetBhs16,subnetBhs1]) self.addSubnet(nodes = [bhs2,hbhs2], subnets = [subnetBhs26,subnetBhs2]) self.addSubnet(nodes = [ash1,hash1], subnets = [subnetAsh16,subnetAsh1]) self.addSubnet(nodes = [ash5,hash5], subnets = [subnetAsh56,subnetAsh5]) self.addSubnet(nodes = [nwk1,hnwk1], subnets = [subnetNwk16,subnetNwk1]) self.addSubnet(nodes = [nwk5,hnwk5], subnets = [subnetNwk56,subnetNwk5]) self.addSubnet(nodes = [nyc,hnyc], subnets = [subnetNyc6,subnetNyc]) self.addSubnet(nodes = [lon_thw,hEU], subnets = [subnetLon_thw6,subnetLon_thw]) self.addSubnet(nodes = [lon_drch], subnets = [subnetLon_drch6,subnetLon_drch]) # --- Physical links between routers --- self.addLink(sin, sjo,igp_metric=extra_large) self.addLink(syd,lax1,igp_metric=extra_large) self.addLink(syd,sin,igp_metric=large) self.addLink(syd,lon_thw,igp_metric=extra_large) self.addLink(syd,lon_drch,igp_metric=extra_large) self.addLink(sin,lon_thw,igp_metric=extra_large) self.addLink(sin,lon_drch,igp_metric=extra_large) self.addLink(lon_thw,lon_drch,igp_metric=small) self.addLink(pao,sjo,igp_metric=medium) self.addLink(sjo,lax1,igp_metric=medium) self.addLink(pao,chi1,igp_metric=medium) self.addLink(pao,chi5,igp_metric=medium) self.addLink(chi1,chi5,igp_metric=small) self.addLink(lax1,ash1,igp_metric=large) self.addLink(lax1,ash5,igp_metric=large) self.addLink(ash1,ash5,igp_metric=small) self.addLink(chi1,bhs1,igp_metric=medium) self.addLink(chi5,bhs2,igp_metric=medium) self.addLink(bhs1,bhs2,igp_metric=small) self.addLink(bhs1,nwk1,igp_metric=medium) self.addLink(bhs2,nwk5,igp_metric=medium) self.addLink(ash1,nwk1,igp_metric=large) self.addLink(ash5,nwk5,igp_metric=large) self.addLink(ash1,chi1,igp_metric=large) self.addLink(ash5,chi5,igp_metric=large) self.addLink(nwk1,nwk5,igp_metric=small) self.addLink(nwk1,nyc,igp_metric=small) self.addLink(nwk5,nyc,igp_metric=small) self.addLink(nwk1,lon_thw,igp_metric=extra_large) self.addLink(nwk5,lon_drch,igp_metric=extra_large) """ self.addLink(anycast1,sin) self.addLink(anycast2,ash1); self.addLink(anycast3,lon_thw) """ anycast1_link = self.addLink(anycast1, sin) anycast1_link[anycast1].addParams(ip = ("fc00:0:27::2/48","192.168.39.2/24")) anycast1_link[sin].addParams(ip = ("fc00:0:27::1/48","192.168.39.1/24")) anycast2_link = self.addLink(anycast2, ash1) anycast2_link[anycast2].addParams(ip = ("fc00:0:28::1/48","192.168.40.1/24")) anycast2_link[ash1].addParams(ip = ("fc00:0:28::2/48","192.168.40.2/24")) anycast3_link = self.addLink(anycast3, lon_thw) anycast3_link[anycast3].addParams(ip = ("fc00:0:29::1/48","192.168.41.1/24")) anycast3_link[lon_thw].addParams(ip = ("fc00:0:29::2/48","192.168.41.2/24")) # --- Rules for inputTable --- ip_rules = [InputFilter(default="DROP", rules=[ Allow(iif='lo'), Allow(m='conntrack --ctstate RELATED,ESTABLISHED'), Deny(m='conntrack --ctstate INVALID'), Allow(p='icmp --icmp-type 0', m='conntrack --ctstate NEW'), Allow(p='icmp --icmp-type 3', m='conntrack --ctstate NEW'), Allow(p='icmp --icmp-type 8', m='conntrack --ctstate NEW'), Allow(p='icmp --icmp-type 9', m='conntrack --ctstate NEW'), Allow(p='icmp --icmp-type 10', m='conntrack --ctstate NEW'), Allow(p='icmp --icmp-type 11', m='conntrack --ctstate NEW'), Allow(src='1.3.1.0/24'), Allow(src='1.4.2.0/24'), Allow(src='1.5.3.0/24'), Allow(src='1.6.4.0/24'), Allow(src='198.27.92.0/24'), ]), OutputFilter(default="ACCEPT", rules=[ Deny(m='state --state INVALID'), ]), TransitFilter(default="ACCEPT", rules=[ Deny(m='state --state INVALID'), ])] ip6_rules = [ Rule('-A INPUT -i lo -j ACCEPT'), Rule('-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT'), Rule('-A INPUT -m conntrack --ctstate INVALID -j DROP'), Rule('-A INPUT -p icmpv6 --icmpv6-type 0 -m conntrack --ctstate NEW -j ACCEPT'), Rule('-A INPUT -p icmpv6 --icmpv6-type 3 -m conntrack --ctstate NEW -j ACCEPT'), Rule('-A INPUT -p icmpv6 --icmpv6-type 8 -m conntrack --ctstate NEW -j ACCEPT'), Rule('-A INPUT -p icmpv6 --icmpv6-type 9 -m conntrack --ctstate NEW -j ACCEPT'), Rule('-A INPUT -p icmpv6 --icmpv6-type 10 -m conntrack --ctstate NEW -j ACCEPT'), Rule('-A INPUT -p icmpv6 --icmpv6-type 11 -m conntrack --ctstate NEW -j ACCEPT'), Rule('-A INPUT -s c1a4:4ad:c0ff:ee::/64 -j ACCEPT'), Rule('-A INPUT -s c1a4:4ad:c0ff:ee::/64 -j ACCEPT'), Rule('-A INPUT -s cafe:d0d0:e5:dead::/64 -j ACCEPT'), Rule('-A INPUT -s aaaa:aaaa:aaaa:aaaa::/64 -j ACCEPT'), Rule('-A INPUT -s 2604:2dc0::/32 -j ACCEPT'), Rule('-P INPUT ACCEPT')] for r in OVHRouters: r.addDaemon(IPTables, rules=ip_rules) r.addDaemon(IP6Tables, rules=ip6_rules) # ========================= OSPF configuration ================== # # =============================================================== # --- Add a OSPF daemon on each router of OVH for r in OVHRouters: if(r not in anycastServers): r.addDaemon(OSPF, KEYID=1, KEY="OVHKEY") r.addDaemon(OSPF6) # ========================= BGP configuration ================== # - 3 route reflectors at level 1 (highest in hierarchy) # - 3 route reflectors at level 0 # ============================================================== # --- Add a BGP daemon on each router --- for i in range(len(OVHRouters)-len(anycastServers)): OVHRouters[i].addDaemon(BGP,debug = ("neighbor",),address_families=(AF_INET(networks=(OVHSubsnets4[i],)),AF_INET6(networks=(OVHSubsnets6[i],))), bgppassword="******") anycast1.addDaemon(BGP,RouterConfig,address_families = ( AF_INET6( networks=("2604:2dc0::0/128",) ), AF_INET( networks=("192.27.92.255/32",)))); anycast2.addDaemon(BGP,RouterConfig,address_families = ( AF_INET6( networks=("2604:2dc0::0/128",) ), AF_INET( networks=("192.27.92.255/32",)))); anycast3.addDaemon(BGP,RouterConfig,address_families = ( AF_INET6( networks=("2604:2dc0::0/128",) ), AF_INET( networks=("192.27.92.255/32",)))); bgp_anycast(self,sin,anycast1) bgp_anycast(self,ash1,anycast2) bgp_anycast(self,lon_thw,anycast3) # add bgp communities setup for r in NARouters: rm_setup(self,r,'NA') for r in EURouters: rm_setup(self,r,'EU') for r in APACRouters: rm_setup(self,r,'APAC') # --- Configure the router reflectors --- # Lower hierarchy route reflectors # --- Configure the router reflectors --- set_rr(self, rr= bhs1, peers=[chi1,pao,nwk1,nyc]) set_rr(self, rr= bhs2, peers=[nwk5,pao,sjo,chi1,chi5,lax1]) set_rr(self, rr= ash5, peers=[nyc,chi5,nwk5,lax1,sjo,nwk1]) bgp_peering(self, bhs1, bhs2) bgp_peering(self, bhs1, ash5) bgp_peering(self, bhs2, ash5) # higher hierarchy route reflectors set_rr(self, rr= ash1, peers=[bhs1,bhs2,ash5,anycast1]) # This one is a super RR set_rr(self, rr = lon_thw, peers=[lon_drch,anycast2]) # This one is a super RR set_rr(self, rr = sin, peers=[syd,anycast3]) # This one is a super RR ibgp_Inter_Region(self, ash1, lon_thw) ibgp_Inter_Region(self, ash1, sin) ibgp_Inter_Region(self, sin, lon_thw) # ====== Router configurations of transit/stub providers =========== # - 1 stub provider : Google (ggl) # - 3 transit providers : # - Cogent (cgt) # - Level3 (lvl3) # - Telia (tel) # ================================================================== # --- Google (AS=2) ggl = self.addRouter("ggl", config=RouterConfig) self.addLinks( (ggl,ash1), (ggl,ash5) ) self.addAS(2,(ggl , )) lan_ggl = '1.3.1.0/24' lan_ggl_v6 = 'cafe:babe:dead:beaf::/64' ggl.addDaemon(BGP, address_families=(AF_INET(networks=(lan_ggl,)),AF_INET6(networks=(lan_ggl_v6,))), bgppassword="******") h_ggl = self.addHost("h_ggl") self.addSubnet(nodes = [ggl, h_ggl], subnets=(lan_ggl,lan_ggl_v6)) self.addLink(h_ggl,ggl,igp_metric=1) ebgp_Client(self,ash5,ggl,'NA') ebgp_Client(self,ash1,ggl,'NA') # --- Cogent (AS=3) cgt = self.addRouter("cgt", config=RouterConfig) self.addLinks( (cgt,nwk1), (cgt,nwk5), (cgt,ash1), (cgt,ash5), (cgt,chi1), (cgt,sjo) ) self.addAS(3,(cgt , )) lan_cgt = '1.4.2.0/24' lan_cgt_v6 = 'c1a4:4ad:c0ff:ee::/64' cgt.addDaemon(BGP, address_families=(AF_INET6(networks=(lan_cgt_v6,)),AF_INET(networks=(lan_cgt,)),), bgppassword="******") h_cgt = self.addHost("h_cgt") self.addSubnet(nodes = [cgt, h_cgt], subnets=(lan_cgt,lan_cgt_v6)) self.addLink(h_cgt,cgt,igp_metric=1) ebgp_Peer(self,nwk1, cgt,'NA') ebgp_Peer(self,nwk5, cgt,'NA') ebgp_Peer(self,ash1, cgt,'NA') ebgp_Peer(self,ash5, cgt,'NA') ebgp_Peer(self,chi1, cgt,'NA') ebgp_Peer(self,sjo, cgt,'NA') # --- Level 3 (AS=4) lvl3 = self.addRouter("lvl3", config=RouterConfig) self.addLinks( (lvl3,nwk1), (lvl3,nwk5), (lvl3,chi1), (lvl3,chi5), (lvl3,sjo) ) self.addAS(4,(lvl3, )) lan_lvl3 = '1.5.3.0/24' lan_lvl3_v6 = 'cafe:d0d0:e5:dead::/64' lvl3.addDaemon(BGP, address_families=(AF_INET6(networks=(lan_lvl3_v6,)),AF_INET(networks=(lan_lvl3,)),), bgppassword="******") h_lvl3 = self.addHost("h_lvl3") self.addSubnet(nodes = [lvl3, h_lvl3], subnets=(lan_lvl3,lan_lvl3_v6)) self.addLink(h_lvl3,lvl3,igp_metric=1) ebgp_Peer(self,nwk1, lvl3,'NA') ebgp_Peer(self,nwk5, lvl3,'NA') ebgp_Peer(self,chi1, lvl3,'NA') ebgp_Peer(self,chi5, lvl3,'NA') ebgp_Peer(self,sjo, lvl3,'NA') # --- Telia (AS=5) tel = self.addRouter("tel", config=RouterConfig) self.addLinks( (tel,nwk1), (tel,nwk5), (tel,ash5), (tel,chi5), (tel,pao) ) self.addAS(5,(tel, )) lan_tel = '1.6.4.0/24' lan_tel_v6 = 'aaaa:aaaa:aaaa:aaaa::/64' tel.addDaemon(BGP, address_families=(AF_INET6(networks=(lan_tel_v6,)),AF_INET(networks=(lan_tel,)),), bgppassword="******") h_tel = self.addHost("h_tel") self.addSubnet(nodes = [tel, h_tel], subnets=(lan_tel,lan_tel_v6)) self.addLink(h_tel,tel,igp_metric=1) ebgp_Peer(self,nwk1, tel,'NA') ebgp_Peer(self,nwk5, tel,'NA') ebgp_Peer(self,ash5, tel,'NA') ebgp_Peer(self,chi5, tel,'NA') ebgp_Peer(self,pao, tel,'NA') # ebgp_session(self, tel, nwk1, link_type=SHARE) # ebgp_session(self, tel, nwk5, link_type=SHARE) # ebgp_session(self, tel, ash5, link_type=SHARE) # ebgp_session(self, tel, chi5, link_type=SHARE) # ebgp_session(self, tel, pao, link_type=SHARE) externalRouters = [ggl, cgt, lvl3, tel] for eR in externalRouters: eR.addDaemon(OSPF6) eR.addDaemon(OSPF) # --- Test for BGP communities --- # tel shouldn't be reached by hosts outside NA tel.get_config(BGP).set_community(community = '16276:31',to_peer= nwk1) tel.get_config(BGP).set_community(community = '16276:31',to_peer= nwk5) tel.get_config(BGP).set_community(community = '16276:31',to_peer= ash5) tel.get_config(BGP).set_community(community = '16276:31',to_peer= chi5) tel.get_config(BGP).set_community(community = '16276:31',to_peer= pao) # routes from ggl should be sent to other clients/peers with prepending ggl.get_config(BGP).set_community(community = '16276:9',to_peer= ash1) ggl.get_config(BGP).set_community(community = '16276:9',to_peer= ash5) # routes from cgt sent to other clients/peers should have the no-export community cgt.get_config(BGP).set_community(community= '16276:95',to_peer= nwk1) cgt.get_config(BGP).set_community(community= '16276:95',to_peer= nwk5) cgt.get_config(BGP).set_community(community= '16276:95',to_peer= ash1) cgt.get_config(BGP).set_community(community= '16276:95',to_peer= ash5) cgt.get_config(BGP).set_community(community= '16276:95',to_peer= chi1) cgt.get_config(BGP).set_community(community= '16276:95',to_peer= sjo) # routes from lvl3 should be blackholed other than chi should be blackholed lvl3.get_config(BGP).set_community(community='blackhole',to_peer=nwk1) lvl3.get_config(BGP).set_community(community='blackhole',to_peer=nwk5) lvl3.get_config(BGP).set_community(community='blackhole',to_peer=sjo) # routes from lvl3 learn by chi1 should have a higher pref and those learn by chi5 a lower pref lvl3.get_config(BGP).set_community(community='16276:10',to_peer=chi1) lvl3.get_config(BGP).set_community(community='16276:20',to_peer=chi5) super().build(*args, **kwargs)
def build(self, *args, **kwargs): """ Topo from slide 43 iBGP """ # Add all routers as1r1 = self.bgp('as1r1') as1r2 = self.bgp('as1r2') as1r3 = self.bgp('as1r3') as1r4 = self.bgp('as1r4') as1r5 = self.bgp('as1r5') as1r6 = self.bgp('as1r6') as4r1 = self.bgp('as4r1') as4r2 = self.bgp('as4r2') as5r1 = self.bgp('as5r1') as3r1 = self.bgp('as3r1') as2r1 = self.addRouter('as2r1') as2r1.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), )) as2h1 = self.addHost("as2h1") as1h1 = self.addHost("as1h1") as1h2 = self.addHost("as1h2") as1h3 = self.addHost("as1h3") as1h4 = self.addHost("as1h4") as1h5 = self.addHost("as1h5") as1h6 = self.addHost("as1h6") # Add Links self.addLink(as1r1, as1r6, params1={"ip": ("fd00:1:1::1/48", )}, params2={"ip": ("fd00:1:1::2/48", )}) self.addLink(as1r1, as1r3, params1={"ip": ("fd00:1:2::1/48", )}, params2={"ip": ("fd00:1:2::2/48", )}) self.addLink(as1r3, as1r2, params1={"ip": ("fd00:1:4::1/48", )}, params2={"ip": ("fd00:1:4::2/48", )}) self.addLink(as1r3, as1r6, params1={"ip": ("fd00:1:3::1/48", )}, params2={"ip": ("fd00:1:3::2/48", )}) self.addLink(as1r2, as1r4, params1={"ip": ("fd00:1:5::1/48", )}, params2={"ip": ("fd00:1:5::2/48", )}) self.addLink(as1r4, as1r5, params1={"ip": ("fd00:1:6::1/48", )}, params2={"ip": ("fd00:1:6::2/48", )}) self.addLink(as1r5, as1r6, params1={"ip": ("fd00:1:7::1/48", )}, params2={"ip": ("fd00:1:7::2/48", )}) self.addLink(as4r1, as1r5, params1={"ip": ("fd00:4:2::1/48", )}, params2={"ip": ("fd00:4:2::2/48", )}) self.addLink(as4r2, as1r4, params1={"ip": ("fd00:4:1::1/48", )}, params2={"ip": ("fd00:4:1::2/48", )}) self.addLink(as3r1, as1r1, params1={"ip": ("fd00:3:1::1/48", )}, params2={"ip": ("fd00:3:1::2/48", )}) self.addLink(as5r1, as1r6, params1={"ip": ("fd00:5:1::1/48", )}, params2={"ip": ("fd00:5:1::2/48", )}) self.addLink(as3r1, as5r1, params1={"ip": ("fd00:5:2::1/48", )}, params2={"ip": ("fd00:5:2::2/48", )}) self.addLink(as5r1, as2r1, params1={"ip": ("fd00:2:1::1/48", )}, params2={"ip": ("fd00:2:1::2/48", )}) self.addLink(as2r1, as4r1, params1={"ip": ("fd00:2:2::1/48", )}, params2={"ip": ("fd00:2:2::2/48", )}) self.addLink(as4r1, as4r2, params1={"ip": ("fd00:4:3::1/48", )}, params2={"ip": ("fd00:4:3::2/48", )}) self.addLink(as2r1, as2h1, params1={"ip": ("dead:beef::1/32", )}, params2={"ip": ("dead:beef::2/32", )}) self.addLink(as1r1, as1h1) self.addLink(as1r2, as1h2) self.addLink(as1r3, as1h3) self.addLink(as1r4, as1h4) self.addLink(as1r5, as1h5) self.addLink(as1r6, as1h6) set_rr(self, rr=as1r2, peers=[as1r1, as1r3, as1r4, as1r5, as1r6]) set_rr(self, rr=as1r4, peers=[as1r1, as1r2, as1r5, as1r3, as1r6]) set_rr(self, rr=as1r3, peers=[as1r1, as1r2, as1r4, as1r5, as1r6]) # Add full mesh self.addAS(2, (as2r1, )) self.addAS(3, (as3r1, )) self.addAS(5, (as5r1, )) self.addiBGPFullMesh(4, routers=[as4r1, as4r2]) self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6)) # Add eBGP session ebgp_session(self, as1r6, as5r1) ebgp_session(self, as1r1, as3r1) ebgp_session(self, as1r4, as4r2) ebgp_session(self, as1r5, as4r1) ebgp_session(self, as3r1, as5r1) ebgp_session(self, as5r1, as2r1) ebgp_session(self, as2r1, as4r1) super(BGPTopo3RR1, self).build(*args, **kwargs)
def build(self, *args, **kwargs): """ +---$>----AS5--------------=-----+ | | AS1 -<$--- AS2 --=--> AS3---=----AS4 ^ | +-----------$---------+ """ # Add all routers as1 = self.addRouter('as1') as2 = self.addRouter('as2') as3 = self.addRouter('as3') as4 = self.addRouter('as4') as5 = self.addRouter('as5') routers = self.routers() prefix = { routers[i]: '2001:cafe:%04x::/48' % (i + 1) for i in range(len(routers)) } as1.addDaemon(BGP, address_families=(AF_INET6(networks=(prefix[as1], )), )) as2.addDaemon(BGP, address_families=(AF_INET6(networks=(prefix[as2], )), )) as3.addDaemon(BGP, address_families=(AF_INET6(networks=(prefix[as3], )), )) as4.addDaemon(BGP, address_families=(AF_INET6(networks=(prefix[as4], )), )) as5.addDaemon(BGP, address_families=(AF_INET6(networks=(prefix[as5], )), )) # Add hosts h1 = self.addHost("h1") h2 = self.addHost("h2") h3 = self.addHost("h3") h4 = self.addHost("h4") h5 = self.addHost("h5") # Add all links l12 = self.addLink(as1, as2, delay='10ms') l12[as1].addParams(ip="2001:cafe:1:12::1/64") l12[as2].addParams(ip="2001:cafe:1:12::2/64") l13 = self.addLink(as1, as3, delay='10ms') l13[as1].addParams(ip="2001:cafe:1:13::1/64") l13[as3].addParams(ip="2001:cafe:1:13::3/64") l23 = self.addLink(as2, as3, delay='10ms') l23[as2].addParams(ip="2001:cafe:2:23::2/64") l23[as3].addParams(ip="2001:cafe:2:23::3/64") l15 = self.addLink(as1, as5, delay='10ms') l15[as1].addParams(ip="2001:cafe:1:15::1/64") l15[as5].addParams(ip="2001:cafe:1:15::5/64") l24 = self.addLink(as2, as4, delay='10ms') l24[as2].addParams(ip="2001:cafe:2:24::2/64") l24[as4].addParams(ip="2001:cafe:2:24::4/64") l34 = self.addLink(as3, as4, delay='10ms') l34[as3].addParams(ip="2001:cafe:3:34::3/64") l34[as4].addParams(ip="2001:cafe:3:34::4/64") l45 = self.addLink(as4, as5, delay='10ms') l45[as4].addParams(ip="2001:cafe:4:45::4/64") l45[as5].addParams(ip="2001:cafe:4:45::5/64") # Links to the hosts las1h1 = self.addLink(as1, h1) las1h1[as1].addParams(ip=("2001:cafe:1:1::1/64")) las1h1[h1].addParams(ip=("2001:cafe:1:1::11/64")) las2h2 = self.addLink(as2, h2) las2h2[as2].addParams(ip=("2001:cafe:2:1::2/64")) las2h2[h2].addParams(ip=("2001:cafe:2:1::12/64")) las3h3 = self.addLink(as3, h3) las3h3[as3].addParams(ip=("2001:cafe:3:1::3/64")) las3h3[h3].addParams(ip=("2001:cafe:3:1::13/64")) las4h4 = self.addLink(as4, h4) las4h4[as4].addParams(ip=("2001:cafe:4:1::4/64")) las4h4[h4].addParams(ip=("2001:cafe:4:1::14/64")) las5h5 = self.addLink(as5, h5) las5h5[as5].addParams(ip=("2001:cafe:5:1::5/64")) las5h5[h5].addParams(ip=("2001:cafe:5:1::15/64")) # Set AS-ownerships self.addAS(1, (as1, )) self.addAS(2, (as2, )) self.addAS(3, (as3, )) self.addAS(4, (as4, )) self.addAS(5, (as5, )) # Add eBGP sessions ebgp_session(self, as2, as1, link_type=CLIENT_PROVIDER) ebgp_session(self, as3, as1, link_type=CLIENT_PROVIDER) ebgp_session(self, as5, as1, link_type=CLIENT_PROVIDER) ebgp_session(self, as3, as4, link_type=CLIENT_PROVIDER) ebgp_session(self, as2, as3, link_type=SHARE) ebgp_session(self, as2, as4, link_type=SHARE) ebgp_session(self, as4, as5, link_type=SHARE) super(MyTopology, self).build(*args, **kwargs)
def build(self, *args, **kwargs): # first step, adding routers # ========================================================= # routers of MRS MRS1 = self.addRouter( "MRS1", config=RouterConfig, lo_addresses=[europe_ipv6 + "000::/64", MRS_ipv4 + "100/32"]) MRS2 = self.addRouter( "MRS2", config=RouterConfig, lo_addresses=[europe_ipv6 + "100::/64", MRS_ipv4 + "110/32"]) # routers of PAR PAR1 = self.addRouter( "PAR1", config=RouterConfig, lo_addresses=[europe_ipv6 + "200::/64", PAR_ipv4 + "100/32"]) PAR2 = self.addRouter( "PAR2", config=RouterConfig, lo_addresses=[europe_ipv6 + "300::/64", PAR_ipv4 + "110/32"]) # routers of SIN SIN1 = self.addRouter( "SIN1", config=RouterConfig, lo_addresses=[asia_ipv6 + "000::/64", SIN_ipv4 + "100/32"]) SIN2 = self.addRouter( "SIN2", config=RouterConfig, lo_addresses=[asia_ipv6 + "100::/64", SIN_ipv4 + "110/32"]) # routers of SYD SYD1 = self.addRouter( "SYD1", config=RouterConfig, lo_addresses=[asia_ipv6 + "200::/64", SYD_ipv4 + "100/32"]) SYD2 = self.addRouter( "SYD2", config=RouterConfig, lo_addresses=[asia_ipv6 + "300::/64", SYD_ipv4 + "110/32"]) # routers of LAX LAX1 = self.addRouter( "LAX1", config=RouterConfig, lo_addresses=[NA_ipv6 + "000::/64", LAX_ipv4 + "100/32"]) LAX2 = self.addRouter( "LAX2", config=RouterConfig, lo_addresses=[NA_ipv6 + "100::/64", LAX_ipv4 + "110/32"]) # routers of SJO SJO1 = self.addRouter( "SJO1", config=RouterConfig, lo_addresses=[NA_ipv6 + "200::/64", SJO_ipv4 + "100/32"]) SJO2 = self.addRouter( "SJO2", config=RouterConfig, lo_addresses=[NA_ipv6 + "300::/64", SJO_ipv4 + "110/32"]) # routers of ASH ASH1 = self.addRouter( "ASH1", config=RouterConfig, lo_addresses=[NA_ipv6 + "400::/64", ASH_ipv4 + "100/32"]) ASH2 = self.addRouter( "ASH2", config=RouterConfig, lo_addresses=[NA_ipv6 + "500::/64", ASH_ipv4 + "110/32"]) # routers peering vodafone VDFSIN1 = self.addRouter( "VDFSIN1", config=RouterConfig, lo_addresses=[VDF_ipv6 + "000::/64", VDF_ipv4 + "100/32"]) VDFSIN2 = self.addRouter( "VDFSIN2", config=RouterConfig, lo_addresses=[VDF_ipv6 + "001::/64", VDF_ipv4 + "110/32"]) VDFASH1 = self.addRouter( "VDFASH1", config=RouterConfig, lo_addresses=[VDF_ipv6 + "002::/64", VDF_ipv4 + "120/32"]) VDFPAR2 = self.addRouter( "VDFPAR2", config=RouterConfig, lo_addresses=[VDF_ipv6 + "003::/64", VDF_ipv4 + "130/32"]) # routers peering equinix EQXSIN1 = self.addRouter( "EQXSIN1", config=RouterConfig, lo_addresses=[EQX_ipv6 + "000::/64", EQX_ipv4 + "100/32"]) EQXSYD2 = self.addRouter( "EQXSYD2", config=RouterConfig, lo_addresses=[EQX_ipv6 + "001::/64", EQX_ipv4 + "110/32"]) # routers peering NTT NTTSYD1 = self.addRouter( "NTTSYD1", config=RouterConfig, lo_addresses=[NTT_ipv6 + "000::/64", NTT_ipv4 + "100/32"]) NTTSYD2 = self.addRouter( "NTTSYD2", config=RouterConfig, lo_addresses=[NTT_ipv6 + "001::/64", NTT_ipv4 + "110/32"]) # adding OSPF6 as IGP # ========================================================= MRS1.addDaemon(OSPF6) MRS2.addDaemon(OSPF6) SIN1.addDaemon(OSPF6) SIN2.addDaemon(OSPF6) SYD1.addDaemon(OSPF6) SYD2.addDaemon(OSPF6) LAX1.addDaemon(OSPF6) LAX2.addDaemon(OSPF6) SJO1.addDaemon(OSPF6) SJO2.addDaemon(OSPF6) ASH1.addDaemon(OSPF6) ASH2.addDaemon(OSPF6) PAR1.addDaemon(OSPF6) PAR2.addDaemon(OSPF6) VDFSIN1.addDaemon(OSPF6) VDFSIN2.addDaemon(OSPF6) VDFASH1.addDaemon(OSPF6) VDFPAR2.addDaemon(OSPF6) EQXSIN1.addDaemon(OSPF6) EQXSYD2.addDaemon(OSPF6) NTTSYD1.addDaemon(OSPF6) NTTSYD2.addDaemon(OSPF6) # adding OSPF # ========================================================= MRS1.addDaemon(OSPF) MRS2.addDaemon(OSPF) SIN1.addDaemon(OSPF) SIN2.addDaemon(OSPF) SYD1.addDaemon(OSPF) SYD2.addDaemon(OSPF) LAX1.addDaemon(OSPF) LAX2.addDaemon(OSPF) SJO1.addDaemon(OSPF) SJO2.addDaemon(OSPF) ASH1.addDaemon(OSPF) ASH2.addDaemon(OSPF) PAR1.addDaemon(OSPF) PAR2.addDaemon(OSPF) VDFSIN1.addDaemon(OSPF) VDFSIN2.addDaemon(OSPF) VDFASH1.addDaemon(OSPF) VDFPAR2.addDaemon(OSPF) EQXSIN1.addDaemon(OSPF) EQXSYD2.addDaemon(OSPF) NTTSYD1.addDaemon(OSPF) NTTSYD2.addDaemon(OSPF) # adding BGP # ========================================================= MRS1.addDaemon(BGP, debug=("neighbor", "updates")) MRS2.addDaemon(BGP, debug=("neighbor", "updates")) SIN1.addDaemon(BGP, debug=("neighbor", "updates")) SIN2.addDaemon(BGP, debug=("neighbor", "updates")) SYD1.addDaemon(BGP, debug=("neighbor", "updates")) SYD2.addDaemon(BGP, debug=("updates", "neighbor")) LAX1.addDaemon(BGP, debug=("neighbor", "updates")) LAX2.addDaemon(BGP, debug=("updates", "neighbor")) SJO1.addDaemon(BGP, debug=("updates", "neighbor")) SJO2.addDaemon(BGP, debug=("updates", "neighbor")) ASH1.addDaemon(BGP, debug=("updates", "neighbor")) ASH2.addDaemon(BGP, debug=("updates", "neighbor")) PAR1.addDaemon(BGP, debug=("updates", "neighbor")) PAR2.addDaemon(BGP, debug=("updates", "neighbor")) VDFSIN1.addDaemon(BGP, address_families=( AF_INET6(redistribute=['connected']), AF_INET(redistribute=['connected']), ), debug=("updates", )) VDFSIN2.addDaemon(BGP, address_families=( AF_INET6(redistribute=['connected']), AF_INET(redistribute=['connected']), ), debug=("updates", )) VDFASH1.addDaemon(BGP, address_families=( AF_INET6(redistribute=['connected']), AF_INET(redistribute=['connected']), ), debug=("updates", )) VDFPAR2.addDaemon(BGP, address_families=( AF_INET6(redistribute=['connected']), AF_INET(redistribute=['connected']), ), debug=("updates", )) EQXSIN1.addDaemon(BGP, address_families=( AF_INET6(redistribute=['connected']), AF_INET(redistribute=['connected']), ), debug=("updates", )) EQXSYD2.addDaemon(BGP, address_families=( AF_INET6(redistribute=['connected']), AF_INET(redistribute=['connected']), ), debug=("updates", )) NTTSYD1.addDaemon(BGP, address_families=( AF_INET6(redistribute=['connected']), AF_INET(redistribute=['connected']), ), debug=("updates", )) NTTSYD2.addDaemon(BGP, address_families=( AF_INET6(redistribute=['connected']), AF_INET(redistribute=['connected']), ), debug=("updates", )) # linkin twin datacenters # ========================================================= l_MRS1_MRS2 = self.addLink(MRS1, MRS2, igp_metric=2, password=OSPF_PW_EU) l_MRS1_MRS2[MRS1].addParams(ip=(europe_ipv6 + "00a::1/64", MRS_ipv4 + "129/30")) l_MRS1_MRS2[MRS2].addParams(ip=(europe_ipv6 + "00a::2/64", MRS_ipv4 + "130/30")) l_SIN1_SIN2 = self.addLink(SIN1, SIN2, igp_metric=2, password=OSPF_PW_AS) l_SIN1_SIN2[SIN1].addParams(ip=(asia_ipv6 + "00a::1/64", SIN_ipv4 + "129/30")) l_SIN1_SIN2[SIN2].addParams(ip=(asia_ipv6 + "00a::2/64", SIN_ipv4 + "130/30")) l_SYD1_SYD2 = self.addLink(SYD1, SYD2, igp_metric=2, password=OSPF_PW_AS) l_SYD1_SYD2[SYD1].addParams(ip=(asia_ipv6 + "00c::1/64", SYD_ipv4 + "129/30")) l_SYD1_SYD2[SYD2].addParams(ip=(asia_ipv6 + "00c::2/64", SYD_ipv4 + "130/30")) l_PAR1_PAR2 = self.addLink(PAR1, PAR2, igp_metric=2, password=OSPF_PW_EU) l_PAR1_PAR2[PAR1].addParams(ip=(europe_ipv6 + "00b::1/64", PAR_ipv4 + "129/30")) l_PAR1_PAR2[PAR2].addParams(ip=(europe_ipv6 + "00b::2/64", PAR_ipv4 + "130/30")) l_ASH1_ASH2 = self.addLink(ASH1, ASH2, igp_metric=2, password=OSPF_PW_NA) l_ASH1_ASH2[ASH1].addParams(ip=(NA_ipv6 + "00a::1/64", ASH_ipv4 + "129/30")) l_ASH1_ASH2[ASH2].addParams(ip=(NA_ipv6 + "00a::2/64", ASH_ipv4 + "130/30")) l_LAX1_LAX2 = self.addLink(LAX1, LAX2, igp_metric=2, password=OSPF_PW_NA) l_LAX1_LAX2[LAX1].addParams(ip=(NA_ipv6 + "00b::1/64", LAX_ipv4 + "129/30")) l_LAX1_LAX2[LAX2].addParams(ip=(NA_ipv6 + "00b::2/64", LAX_ipv4 + "130/30")) l_SJO1_SJO2 = self.addLink(SJO1, SJO2, igp_metric=2, password=OSPF_PW_NA) l_SJO1_SJO2[SJO1].addParams(ip=(NA_ipv6 + "00c::1/64", SJO_ipv4 + "129/30")) l_SJO1_SJO2[SJO2].addParams(ip=(NA_ipv6 + "00c::2/64", SJO_ipv4 + "130/30")) # ========================================================= l_MRS1_SIN1 = self.addLink(MRS1, SIN1, igp_metric=20, password=OSPF_PW_EU) l_MRS1_SIN1[MRS1].addParams(ip=(europe_ipv6 + "011::1/64", MRS_ipv4 + "5/30")) l_MRS1_SIN1[SIN1].addParams(ip=(europe_ipv6 + "011::2/64", MRS_ipv4 + "6/30")) l_MRS2_SIN2 = self.addLink(MRS2, SIN2, igp_metric=26, password=OSPF_PW_EU) l_MRS2_SIN2[MRS2].addParams(ip=(europe_ipv6 + "022::1/64", MRS_ipv4 + "9/30")) l_MRS2_SIN2[SIN2].addParams(ip=(europe_ipv6 + "022::2/64", MRS_ipv4 + "10/30")) l_SIN1_SYD1 = self.addLink(SIN1, SYD1, igp_metric=3, password=OSPF_PW_AS) l_SIN1_SYD1[SIN1].addParams(ip=(asia_ipv6 + "011::1/64", SIN_ipv4 + "5/30")) l_SIN1_SYD1[SYD1].addParams(ip=(asia_ipv6 + "011::2/64", SIN_ipv4 + "6/30")) l_SIN2_SYD2 = self.addLink(SIN2, SYD2, igp_metric=3, password=OSPF_PW_AS) l_SIN2_SYD2[SIN2].addParams(ip=(asia_ipv6 + "022::1/64", SIN_ipv4 + "9/30")) l_SIN2_SYD2[SYD2].addParams(ip=(asia_ipv6 + "022::2/64", SIN_ipv4 + "10/30")) l_SIN2_SJO1 = self.addLink(SIN2, SJO1, igp_metric=20, password=OSPF_PW_AS) l_SIN2_SJO1[SIN2].addParams(ip=(asia_ipv6 + "021::1/64", SIN_ipv4 + "13/30")) l_SIN2_SJO1[SJO1].addParams(ip=(asia_ipv6 + "021::2/64", SIN_ipv4 + "14/30")) l_SIN1_SJO2 = self.addLink(SIN1, SJO2, igp_metric=20, password=OSPF_PW_AS) l_SIN1_SJO2[SIN1].addParams(ip=(asia_ipv6 + "220::1/64", SIN_ipv4 + "17/30")) l_SIN1_SJO2[SJO2].addParams(ip=(asia_ipv6 + "220::2/64", SIN_ipv4 + "18/30")) # ======================================================= l_ASH1_LAX1 = self.addLink(ASH1, LAX1, igp_metric=3, password=OSPF_PW_NA) l_ASH1_LAX1[ASH1].addParams(ip=(NA_ipv6 + "011::1/64", ASH_ipv4 + "5/30")) l_ASH1_LAX1[LAX1].addParams(ip=(NA_ipv6 + "011::2/64", ASH_ipv4 + "6/30")) l_ASH2_LAX2 = self.addLink(ASH2, LAX2, igp_metric=3, password=OSPF_PW_NA) l_ASH2_LAX2[ASH2].addParams(ip=(NA_ipv6 + "022::1/64", ASH_ipv4 + "9/30")) l_ASH2_LAX2[LAX2].addParams(ip=(NA_ipv6 + "022::2/64", ASH_ipv4 + "10/30")) l_ASH1_LAX2 = self.addLink(ASH1, LAX2, igp_metric=3, password=OSPF_PW_NA) l_ASH1_LAX2[ASH1].addParams(ip=(NA_ipv6 + "012::1/64", ASH_ipv4 + "13/30")) l_ASH1_LAX2[LAX2].addParams(ip=(NA_ipv6 + "012::2/64", ASH_ipv4 + "14/30")) l_SJO1_LAX1 = self.addLink(SJO1, LAX1, igp_metric=3, password=OSPF_PW_NA) l_SJO1_LAX1[SJO1].addParams(ip=(NA_ipv6 + "110::1/64", SJO_ipv4 + "5/30")) l_SJO1_LAX1[LAX1].addParams(ip=(NA_ipv6 + "110::2/64", SJO_ipv4 + "6/30")) l_SJO2_LAX2 = self.addLink(SJO2, LAX2, igp_metric=3, password=OSPF_PW_NA) l_SJO2_LAX2[SJO2].addParams(ip=(NA_ipv6 + "220::1/64", SJO_ipv4 + "9/30")) l_SJO2_LAX2[LAX2].addParams(ip=(NA_ipv6 + "220::2/64", SJO_ipv4 + "10/30")) l_PAR1_ASH1 = self.addLink(PAR1, ASH1, igp_metric=20, password=OSPF_PW_EU) l_PAR1_ASH1[PAR1].addParams(ip=(europe_ipv6 + "110::1/64", PAR_ipv4 + "5/30")) l_PAR1_ASH1[ASH1].addParams(ip=(europe_ipv6 + "110::2/64", PAR_ipv4 + "6/30")) l_PAR2_ASH2 = self.addLink(PAR2, ASH2, igp_metric=20, password=OSPF_PW_EU) l_PAR2_ASH2[PAR2].addParams(ip=(europe_ipv6 + "220::1/64", PAR_ipv4 + "9/30")) l_PAR2_ASH2[ASH2].addParams(ip=(europe_ipv6 + "220::2/64", PAR_ipv4 + "10/30")) l_PAR1_MRS2 = self.addLink(PAR1, MRS2, igp_metric=3, password=OSPF_PW_EU) l_PAR1_MRS2[PAR1].addParams(ip=(europe_ipv6 + "101::1/64", PAR_ipv4 + "13/30")) l_PAR1_MRS2[MRS2].addParams(ip=(europe_ipv6 + "101::2/64", PAR_ipv4 + "14/30")) l_PAR2_MRS1 = self.addLink(PAR2, MRS1, igp_metric=3, password=OSPF_PW_EU) l_PAR2_MRS1[PAR2].addParams(ip=(europe_ipv6 + "202::1/64", PAR_ipv4 + "17/30")) l_PAR2_MRS1[MRS1].addParams(ip=(europe_ipv6 + "202::2/64", PAR_ipv4 + "18/30")) l_SYD2_LAX2 = self.addLink(SYD2, LAX2, igp_metric=20, password=OSPF_PW_AS) l_SYD2_LAX2[SYD2].addParams(ip=(NA_ipv6 + "303::1/64", SYD_ipv4 + "5/30")) l_SYD2_LAX2[LAX2].addParams(ip=(NA_ipv6 + "303::2/64", SYD_ipv4 + "6/30")) # ============================================================================= # Peering links l_VDF_PAR2 = self.addLink(VDFPAR2, PAR2, igp_metric=11) l_VDF_PAR2[VDFPAR2].addParams(ip=(europe_ipv6 + "ffa::1/64", PAR_ipv4 + "21/30")) l_VDF_PAR2[PAR2].addParams(ip=(europe_ipv6 + "ffa::2/64", PAR_ipv4 + "22/30")) l_VDF_ASH1 = self.addLink(VDFASH1, ASH1, igp_metric=11) l_VDF_ASH1[VDFASH1].addParams(ip=(NA_ipv6 + "ffa::1/64", ASH_ipv4 + "21/30")) l_VDF_ASH1[ASH1].addParams(ip=(NA_ipv6 + "ffa::2/64", ASH_ipv4 + "22/30")) l_VDF_SIN1 = self.addLink(VDFSIN1, SIN1, igp_metric=11) l_VDF_SIN1[VDFSIN1].addParams(ip=(asia_ipv6 + "ffa::1/64", SIN_ipv4 + "21/30")) l_VDF_SIN1[SIN1].addParams(ip=(asia_ipv6 + "ffa::2/64", SIN_ipv4 + "22/30")) l_VDF_SIN2 = self.addLink(VDFSIN2, SIN2, igp_metric=11) l_VDF_SIN2[VDFSIN2].addParams(ip=(asia_ipv6 + "1fa::1/64", SIN_ipv4 + "25/30")) l_VDF_SIN2[SIN2].addParams(ip=(asia_ipv6 + "1fa::2/64", SIN_ipv4 + "26/30")) l_EQX_SIN1 = self.addLink(EQXSIN1, SIN1, igp_metric=11) l_EQX_SIN1[EQXSIN1].addParams(ip=(asia_ipv6 + "2fb::1/64", SIN_ipv4 + "29/30")) l_EQX_SIN1[SIN1].addParams(ip=(asia_ipv6 + "2fb::2/64", SIN_ipv4 + "30/30")) l_EQX_SYD2 = self.addLink(EQXSYD2, SYD2, igp_metric=11) l_EQX_SYD2[EQXSYD2].addParams(ip=(asia_ipv6 + "3fa::1/64", SYD_ipv4 + "9/30")) l_EQX_SYD2[SYD2].addParams(ip=(asia_ipv6 + "3fa::2/64", SYD_ipv4 + "10/30")) l_NTT_SYD2 = self.addLink(NTTSYD2, SYD2, igp_metric=11) l_NTT_SYD2[NTTSYD2].addParams(ip=(asia_ipv6 + "4fb::1/64", SYD_ipv4 + "13/30")) l_NTT_SYD2[SYD2].addParams(ip=(asia_ipv6 + "4fb::2/64", SYD_ipv4 + "14/30")) l_NTT_SYD1 = self.addLink(NTTSYD1, SYD1, igp_metric=11) l_NTT_SYD1[NTTSYD1].addParams(ip=(asia_ipv6 + "5fa::1/64", SYD_ipv4 + "17/30")) l_NTT_SYD1[SYD1].addParams(ip=(asia_ipv6 + "5fa::2/64", SYD_ipv4 + "18/30")) # ============================================================================= # servers SER1 = self.addRouter( "SER1", config=RouterConfig, lo_addresses=[server_ipv6 + "1::/64", server_ipv4 + "1/32"]) SER2 = self.addRouter( "SER2", config=RouterConfig, lo_addresses=[server_ipv6 + "1::/64", server_ipv4 + "1/32"]) SER3 = self.addRouter( "SER3", config=RouterConfig, lo_addresses=[server_ipv6 + "1::/64", server_ipv4 + "1/32"]) # Adding BGP daemons to manage failures SER1.addDaemon(BGP, address_families=(AF_INET6(networks=(server_ipv6 + "1::/64", )), AF_INET(redistribute=['connected']))) SER2.addDaemon(BGP, address_families=(AF_INET6(networks=(server_ipv6 + "1::/64", )), AF_INET(redistribute=['connected']))) SER3.addDaemon(BGP, address_families=(AF_INET6(networks=(server_ipv6 + "1::/64", )), AF_INET(redistribute=['connected']))) self.addAS(64512, (SER1, SER2, SER3)) l_SER1_SJO2 = self.addLink(SER1, SJO2, igp_metric=3) l_SER1_SJO2[SER1].addParams(ip=(server_ipv6 + "a1a::1/64", server_ipv4 + "2/27")) l_SER1_SJO2[SJO2].addParams(ip=(server_ipv6 + "a1a::2/64", server_ipv4 + "3/27")) l_SER2_PAR2 = self.addLink(SER2, PAR2, igp_metric=3) l_SER2_PAR2[SER2].addParams(ip=(server_ipv6 + "a2a::1/64", server_ipv4 + "5/27")) l_SER2_PAR2[PAR2].addParams(ip=(server_ipv6 + "a2a::2/64", server_ipv4 + "6/27")) l_SER3_SIN2 = self.addLink(SER3, SIN2, igp_metric=3) l_SER3_SIN2[SER3].addParams(ip=(server_ipv6 + "a3a::1/64", server_ipv4 + "9/27")) l_SER3_SIN2[SIN2].addParams(ip=(server_ipv6 + "a3a::2/64", server_ipv4 + "10/27")) ebgp_session(self, SER1, SJO2) ebgp_session(self, SER2, PAR2) ebgp_session(self, SER3, SIN2) # ============================================================================= # BGP setup self.addAS(1, (MRS1, MRS2, PAR1, PAR2, SIN1, SIN2, SYD1, SYD2, SJO1, SJO2, LAX1, LAX2, ASH1, ASH2)) set_rr(self, rr=SIN1, peers=[SYD1, MRS1, SIN2, MRS2, SJO1, SJO2, SYD2, ASH1, PAR2]) set_rr(self, rr=SYD2, peers=[SYD1, SIN2, SJO1, LAX1, LAX2, SIN1, ASH1, PAR2]) set_rr(self, rr=ASH1, peers=[SJO1, SJO2, LAX1, LAX2, PAR1, ASH2, SIN1, SYD2, PAR2]) set_rr(self, rr=PAR2, peers=[MRS1, MRS2, PAR1, ASH2, SIN1, SYD2, ASH1]) self.addAS(2, (EQXSIN1, EQXSYD2)) self.addAS(3, (VDFASH1, VDFPAR2, VDFSIN1, VDFSIN2)) self.addAS(4, (NTTSYD1, NTTSYD2)) ebgp_session(self, VDFPAR2, PAR2) ebgp_session(self, VDFASH1, ASH1) ebgp_session(self, VDFSIN1, SIN1) ebgp_session(self, VDFSIN2, SIN2) ebgp_session(self, EQXSIN1, SIN1) ebgp_session(self, EQXSYD2, SYD2) ebgp_session(self, NTTSYD2, SYD2) ebgp_session(self, NTTSYD1, SYD1) hVdfPar2 = self.addHost("hVdfPar2") hVdfAsh1 = self.addHost("hVdfAsh1") hVdfSin1 = self.addHost("hVdfSin1") hVdfSin2 = self.addHost("hVdfSin2") hEqxSin1 = self.addHost("hEqxSin1") hEqxSyd2 = self.addHost("hEqxSyd2") hNttSyd2 = self.addHost("hNttSyd2") hNttSyd1 = self.addHost("hNttSyd1") # Host setup l_hVdfPar2 = self.addLink(hVdfPar2, VDFPAR2, igp_metric=2) l_hVdfPar2[hVdfPar2].addParams(ip=(VDF_ipv6 + "aaa::1/64", VDF_ipv4 + "21/30")) l_hVdfPar2[VDFPAR2].addParams(ip=(VDF_ipv6 + "aaa::2/64", VDF_ipv4 + "22/30")) l_hVdfAsh1 = self.addLink(hVdfAsh1, VDFASH1, igp_metric=2) l_hVdfAsh1[hVdfAsh1].addParams(ip=(VDF_ipv6 + "bbb::1/64", VDF_ipv4 + "25/30")) l_hVdfAsh1[VDFASH1].addParams(ip=(VDF_ipv6 + "bbb::2/64", VDF_ipv4 + "26/30")) l_hVdfSin1 = self.addLink(hVdfSin1, VDFSIN1, igp_metric=2) l_hVdfSin1[hVdfSin1].addParams(ip=(VDF_ipv6 + "ccc::1/64", VDF_ipv4 + "29/30")) l_hVdfSin1[VDFSIN1].addParams(ip=(VDF_ipv6 + "ccc::2/64", VDF_ipv4 + "30/30")) l_hVdfSin2 = self.addLink(hVdfSin2, VDFSIN2, igp_metric=2) l_hVdfSin2[hVdfSin2].addParams(ip=(VDF_ipv6 + "ddd::1/64", VDF_ipv4 + "33/30")) l_hVdfSin2[VDFSIN2].addParams(ip=(VDF_ipv6 + "ddd::2/64", VDF_ipv4 + "34/30")) l_hEqxSyd2 = self.addLink(hEqxSyd2, EQXSYD2, igp_metric=2) l_hEqxSyd2[hEqxSyd2].addParams(ip=(EQX_ipv6 + "aaa::1/64", EQX_ipv4 + "13/30")) l_hEqxSyd2[EQXSYD2].addParams(ip=(EQX_ipv6 + "aaa::2/64", EQX_ipv4 + "14/30")) l_hEqxSin1 = self.addLink(hEqxSin1, EQXSIN1, igp_metric=2) l_hEqxSin1[hEqxSin1].addParams(ip=(EQX_ipv6 + "bbb::1/64", EQX_ipv4 + "17/30")) l_hEqxSin1[EQXSIN1].addParams(ip=(EQX_ipv6 + "bbb::2/64", EQX_ipv4 + "18/30")) l_hNttSyd2 = self.addLink(hNttSyd2, NTTSYD2, igp_metric=2) l_hNttSyd2[hNttSyd2].addParams(ip=(NTT_ipv6 + "aaa::1/64", NTT_ipv4 + "13/30")) l_hNttSyd2[NTTSYD2].addParams(ip=(NTT_ipv6 + "aaa::2/64", NTT_ipv4 + "14/30")) l_hNttSyd1 = self.addLink(hNttSyd1, NTTSYD1, igp_metric=2) l_hNttSyd1[hNttSyd1].addParams(ip=(NTT_ipv6 + "bbb::1/64", NTT_ipv4 + "17/30")) l_hNttSyd1[NTTSYD1].addParams(ip=(NTT_ipv6 + "bbb::2/64", NTT_ipv4 + "18/30")) super().build(*args, **kwargs)
def build(self, *args, **kwargs): """ Topo from slide 44 iBGP BLUE config """ # Add routers as1r1 = self.bgp('as1r1') as1r2 = self.bgp('as1r2') as1r3 = self.bgp('as1r3') as1r4 = self.bgp('as1r4') as1r5 = self.bgp('as1r5') as1r6 = self.bgp('as1r6') as1r7 = self.bgp('as1r7') as1r8 = self.bgp('as1r8') as1r9 = self.bgp('as1r9') as1ra = self.bgp('as1ra') as1rb = self.bgp('as1rb') as5r1 = self.bgp('as5r1') as3r1 = self.bgp('as3r1') as2r1 = self.addRouter('as2r1') as2r1.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/48', )), )) # Add Links self.addLink(as1r1, as1r6) self.addLink(as1r1, as1r3) self.addLink(as1r3, as1r2) self.addLink(as1r3, as1r6) self.addLink(as1r2, as1r4) self.addLink(as1r4, as1r5) self.addLink(as1r5, as1r6) self.addLink(as1r5, as1r7) self.addLink(as1r5, as1r9) self.addLink(as1r6, as1r7) self.addLink(as1r6, as1r8) self.addLink(as1r8, as1ra) self.addLink(as1r8, as1r9) self.addLink(as1r9, as1rb) self.addLink(as1ra, as2r1) self.addLink(as1ra, as1rb) self.addLink(as1rb, as2r1) self.addLink(as3r1, as1r1) self.addLink(as5r1, as1r6) self.addLink(as3r1, as5r1) self.addLink(as5r1, as2r1) set_rr(self, rr=as1r2, peers=[ as1r1, as1r3, as1r4, as1r5, as1r6, as1r7, as1r8, as1r9, as1ra, as1rb ]) set_rr(self, rr=as1r3, peers=[ as1r1, as1r2, as1r4, as1r5, as1r6, as1r7, as1r8, as1r9, as1ra, as1rb ]) set_rr(self, rr=as1r8, peers=[ as1r1, as1r2, as1r3, as1r4, as1r5, as1r6, as1r7, as1r9, as1ra, as1rb ]) set_rr(self, rr=as1r9, peers=[ as1r1, as1r2, as1r3, as1r4, as1r5, as1r6, as1r7, as1r8, as1ra, as1rb ]) # Add full mesh self.addAS(2, (as2r1, )) self.addAS(3, (as3r1, )) self.addAS(5, (as5r1, )) self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6, as1r7, as1r8, as1r9, as1ra, as1rb)) # Add eBGP session ebgp_session(self, as1r6, as5r1) ebgp_session(self, as1r1, as3r1) ebgp_session(self, as3r1, as5r1) ebgp_session(self, as5r1, as2r1) ebgp_session(self, as1ra, as2r1) ebgp_session(self, as1rb, as2r1) super(BGPTopo3RR3, self).build(*args, **kwargs)
def build(self, *args, **kwargs): """ Topo from slide 42 iBGP RED config """ # Add all routers as1r1 = self.bgp('as1r1') as1r2 = self.bgp('as1r2') as1r3 = self.bgp('as1r3') as1r4 = self.bgp('as1r4') as1r5 = self.bgp('as1r5') as1r6 = self.bgp('as1r6') as4r1 = self.bgp('as4r1') as4r2 = self.bgp('as4r2') as5r1 = self.bgp('as5r1') as3r1 = self.bgp('as3r1') as2r1 = self.addRouter('as2r1') as2r1.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), )) as2h1 = self.addHost("as2h1") as1h1 = self.addHost("as1h1") as1h2 = self.addHost("as1h2") as1h3 = self.addHost("as1h3") as1h4 = self.addHost("as1h4") as1h5 = self.addHost("as1h5") as1h6 = self.addHost("as1h6") # Add Links self.addLink(as1r1, as1r6) self.addLink(as1r1, as1r3) self.addLink(as1r3, as1r2) self.addLink(as1r3, as1r6) self.addLink(as1r2, as1r4) self.addLink(as1r4, as1r5) self.addLink(as1r5, as1r6) self.addLink(as4r1, as1r5) self.addLink(as4r2, as1r4) self.addLink(as3r1, as1r1) self.addLink(as5r1, as1r6) self.addLink(as3r1, as5r1) self.addLink(as5r1, as2r1) self.addLink(as2r1, as4r1) self.addLink(as4r1, as4r2) self.addLink(as2r1, as2h1) self.addSubnet((as2r1, as2h1), subnets=('dead:beef::/32', )) self.addLink(as1r1, as1h1) self.addLink(as1r2, as1h2) self.addLink(as1r3, as1h3) self.addLink(as1r4, as1h4) self.addLink(as1r5, as1h5) self.addLink(as1r6, as1h6) set_rr(self, rr=as1r1, peers=[as1r3, as1r2, as1r4, as1r5, as1r6]) set_rr(self, rr=as1r5, peers=[as1r1, as1r2, as1r4, as1r3, as1r6]) # Add full mesh self.addAS(2, (as2r1, )) self.addAS(3, (as3r1, )) self.addAS(5, (as5r1, )) self.addiBGPFullMesh(4, routers=[as4r1, as4r2]) self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6)) # Add eBGP session ebgp_session(self, as1r6, as5r1) ebgp_session(self, as1r1, as3r1) ebgp_session(self, as1r4, as4r2) ebgp_session(self, as1r5, as4r1) ebgp_session(self, as3r1, as5r1) ebgp_session(self, as5r1, as2r1) ebgp_session(self, as2r1, as4r1) super(BGPTopo2RR2, self).build(*args, **kwargs)
def build(self, *args, **kwargs): """ +---$>----AS3---$>-- AS4---$>---AS7---$>--AS8 | || || $ | | || || \/ | AS1 -<$--- AS2 --$--> AS5---=---AS6-----=--- """ # Add all routers and hosts r = [None] * 9 h = [None] * 9 for i in range(1, 9): r[i] = self.addRouter("as" + str(i)) h[i] = self.addHost("h" + str(i)) r[i].addDaemon(BGP, address_families=(AF_INET6( networks=('2001:cafe:%04x::/48' % (i), )), )) self.addAS(i, (r[i], )) # Add all links l12 = self.addLink(r[1], r[2], delay='10ms') l12[r[1]].addParams(ip="2001:cafe:1:12::1/64") l12[r[2]].addParams(ip="2001:cafe:1:12::2/64") l13 = self.addLink(r[1], r[3], delay='10ms') l13[r[1]].addParams(ip="2001:cafe:1:13::1/64") l13[r[3]].addParams(ip="2001:cafe:1:13::3/64") l23 = self.addLink(r[2], r[3], delay='10ms') l23[r[2]].addParams(ip="2001:cafe:2:23::2/64") l23[r[3]].addParams(ip="2001:cafe:2:23::3/64") l25 = self.addLink(r[2], r[5], delay='10ms') l25[r[2]].addParams(ip="2001:cafe:2:25::2/64") l25[r[5]].addParams(ip="2001:cafe:2:25::5/64") l34 = self.addLink(r[3], r[4], delay='10ms') l34[r[3]].addParams(ip="2001:cafe:3:34::3/64") l34[r[4]].addParams(ip="2001:cafe:3:34::4/64") l45 = self.addLink(r[4], r[5], delay='10ms') l45[r[4]].addParams(ip="2001:cafe:4:45::4/64") l45[r[5]].addParams(ip="2001:cafe:4:45::5/64") l47 = self.addLink(r[4], r[7], delay='10ms') l47[r[4]].addParams(ip="2001:cafe:4:47::4/64") l47[r[7]].addParams(ip="2001:cafe:4:47::7/64") l56 = self.addLink(r[5], r[6], delay='10ms') l56[r[5]].addParams(ip="2001:cafe:5:56::5/64") l56[r[6]].addParams(ip="2001:cafe:5:56::6/64") l78 = self.addLink(r[7], r[8], delay='10ms') l78[r[7]].addParams(ip="2001:cafe:7:78::7/64") l78[r[8]].addParams(ip="2001:cafe:7:78::8/64") l68 = self.addLink(r[6], r[8], delay='10ms') l68[r[6]].addParams(ip="2001:cafe:6:68::6/64") l68[r[8]].addParams(ip="2001:cafe:6:68::8/64") l67 = self.addLink(r[6], r[7], delay='10ms') l67[r[6]].addParams(ip="2001:cafe:6:67::6/64") l67[r[7]].addParams(ip="2001:cafe:6:67::7/64") # Links to the hosts for i in range(1, 9): l = self.addLink(r[i], h[i]) l[r[i]].addParams(ip=('2001:cafe:%04x:1::%04x/64' % (i, i))) l[h[i]].addParams(ip=('2001:cafe:%04x:1::%04x/64' % (i, 16 + i))) # Add eBGP sessions ebgp_session(self, r[2], r[1], link_type=CLIENT_PROVIDER) ebgp_session(self, r[1], r[3], link_type=CLIENT_PROVIDER) ebgp_session(self, r[3], r[4], link_type=CLIENT_PROVIDER) ebgp_session(self, r[2], r[5], link_type=CLIENT_PROVIDER) ebgp_session(self, r[4], r[7], link_type=CLIENT_PROVIDER) ebgp_session(self, r[7], r[6], link_type=CLIENT_PROVIDER) ebgp_session(self, r[7], r[8], link_type=CLIENT_PROVIDER) ebgp_session(self, r[2], r[3], link_type=SHARE) ebgp_session(self, r[4], r[5], link_type=SHARE) ebgp_session(self, r[5], r[6], link_type=SHARE) ebgp_session(self, r[8], r[6], link_type=SHARE) super(MyTopology, self).build(*args, **kwargs)
def build(self, *args, **kwargs): """ + AS1 | AS4 +-------+ | | as1r1 +--------+ | +---+---+ | | 2 | | | +---+---+ +---+---+ | +-------+ | as1r3 +----+ as1r6 +-------+ as4r1 +--------+ +---+---+ +---+---+ | +-------+ | | | | | +---+---+ | | +--+--+ +-------+ | as1r2 | | | | s4 +-----+ as4h1 | +---+---+ | | +--+--+ +-------+ 4 | | | | +---+---+ +---+---+ | +-------+ | | as1r4 +----+ as1r5 +-------+ as4r2 +--------+ +-------+ +-------+ | +-------+ | + """ # Add all routers as1r1 = self.bgp('as1r1') as1r2 = self.bgp('as1r2') as1r3 = self.bgp('as1r3') as1r4 = self.bgp('as1r4') as1r5 = self.bgp('as1r5', family=AF_INET6(redistribute=('ospf6', 'connected'))) as1r6 = self.bgp('as1r6', family=AF_INET6(redistribute=('ospf6', 'connected'))) as4r1 = self.bgp('as4r1', family=AF_INET6(networks=('dead:beef::/32', ))) as4r2 = self.bgp('as4r2', family=AF_INET6(networks=('dead:beef::/32', ))) # Add the host and the switch as4h1 = self.addHost('as4h1') switch = self.addSwitch('s4') # Add Links self.addLink(as1r1, as1r6) self.addLink(as1r1, as1r3, igp_metric=2) self.addLinks((as1r3, as1r2), (as1r3, as1r6)) self.addLink(as1r2, as1r4, igp_metric=4) self.addLinks((as1r4, as1r5), (as1r5, as1r6), (as4r1, as1r6), (as4r2, as1r5), (as4r1, switch), (as4r2, switch), (switch, as4h1)) self.addSubnet((as4r1, as4r2, as4h1), subnets=('dead:beef::/32', )) al = AccessList(name='all', entries=('any', )) as1r6.get_config(BGP).set_local_pref(99, from_peer=as4r1, matching=(al, )) as1r5.get_config(BGP).set_local_pref(50, from_peer=as4r2, matching=(al, )) # Add full mesh self.addAS(4, (as4r1, as4r2)) self.addiBGPFullMesh(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6)) # Add eBGP session ebgp_session(self, as1r6, as4r1) ebgp_session(self, as1r5, as4r2) super().build(*args, **kwargs)
def build(self, *args, **kwargs): """ TODO slide 42 iBGP RED config +----------+ +--------+ | | AS1 | AS2 | AS3 | | | | +-------+ eBGP | +-------+ iBGP +-------+ | eBGP +-------+ | as1r1 +------------+ as2r1 +-------------+ as2r2 +------------+ as3r1 | +-------+ | +-------+ +-------+ | +-------+ | | | | | | +------------+ +--------+ """ # Add all routers as1r1 = self.addRouter('as1r1') as1r1.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as1r2 = self.addRouter('as1r2') as1r2.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as1r3 = self.addRouter('as1r3') as1r3.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as1r4 = self.addRouter('as1r4') as1r4.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as1r5 = self.addRouter('as1r5') as1r5.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as1r6 = self.addRouter('as1r6') as1r6.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as4r1 = self.addRouter('as4r1') as4r1.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as4r2 = self.addRouter('as4r2') as4r2.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as5r1 = self.addRouter('as5r1') as5r1.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as3r1 = self.addRouter('as3r1') as3r1.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as2r1 = self.addRouter('as2r1') as2r1.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), )) as2h1 = self.addHost('as21') # Add Links self.addLink(as1r1, as1r6) self.addLink(as1r1, as1r3) self.addLink(as1r3, as1r2) self.addLink(as1r3, as1r6) self.addLink(as1r2, as1r4) self.addLink(as1r4, as1r5) self.addLink(as1r5, as1r6) self.addLink(as4r1, as1r5) self.addLink(as4r2, as1r4) self.addLink(as3r1, as1r1) self.addLink(as5r1, as1r6) self.addLink(as3r1, as5r1) self.addLink(as5r1, as2r1) self.addLink(as2r1, as4r1) self.addLink(as4r1, as4r2) self.addLink(as2r1, as2h1) self.addSubnet((as2r1, as2h1), subnets=('dead:beef::/32', )) set_rr(self, as1r1, peers=[as1r3, as1r2, as1r4, as1r5, as1r6]) set_rr(self, as1r5, peers=[as1r1, as1r2, as1r4, as1r3, as1r6]) # Add full mesh self.addAS(2, (as2r1, )) self.addAS(3, (as3r1, )) self.addAS(5, (as5r1, )) self.addiBGPFullMesh(4, routers=[as4r1, as4r2]) self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6)) # Add eBGP session ebgp_session(self, as1r6, as5r1) ebgp_session(self, as1r1, as3r1) ebgp_session(self, as1r4, as4r2) ebgp_session(self, as1r5, as4r1) ebgp_session(self, as3r1, as5r1) ebgp_session(self, as5r1, as2r1) ebgp_session(self, as2r1, as4r1) super(BGPTopoRR, self).build(*args, **kwargs)
def build(self, *args, **kwargs): """ TODO +----------+ +--------+ | | AS1 | AS2 | AS3 | | | | +-------+ eBGP | +-------+ iBGP +-------+ | eBGP +-------+ | as1r1 +------------+ as2r1 +-------------+ as2r2 +------------+ as3r1 | +-------+ | +-------+ +-------+ | +-------+ | | | | | | +------------+ +--------+ """ # Add all routers as1r1 = self.addRouter('as1r1') as1r1.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as1r2 = self.addRouter('as1r2') as1r2.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as1r3 = self.addRouter('as1r3') as1r3.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as1r4 = self.addRouter('as1r4') as1r4.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as1r5 = self.addRouter('as1r5') as1r5.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as1r6 = self.addRouter('as1r6') as1r6.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) as4r1 = self.addRouter('as4r1') as4r1.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), )) as4r2 = self.addRouter('as4r2') as4r2.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), )) as4h1 = self.addHost("as4h1") # Add Links self.addLink(as1r1, as1r6) self.addLink(as1r1, as1r3) self.addLink(as1r3, as1r2) self.addLink(as1r3, as1r6) self.addLink(as1r2, as1r4) self.addLink(as1r4, as1r5) self.addLink(as1r5, as1r6) self.addLink(as4r1, as1r6) self.addLink(as4r2, as1r5) self.addLink(as4r1, as4h1) self.addLink(as4r2, as4h1) self.addSubnet((as4r1, as4h1), subnets=('dead:beef::/32', )) self.addSubnet((as4h1, as4r2), subnets=('dead:beef::/32', )) al = new_access_list(name='all', entries=('any', )) set_local_pref(self, as1r6, as4r1, 99, filter_list=(al, )) set_local_pref(self, as1r5, as4r2, 50, filter_list=(al, )) # Add full mesh self.addAS(4, (as4r1, as4r2)) self.addiBGPFullMesh(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6)) # Add eBGP session ebgp_session(self, as1r6, as4r1) ebgp_session(self, as1r5, as4r2) super(BGPTopoLocalPref, self).build(*args, **kwargs)
def build(self, *args, **kwargs): """ Topo from slide 30 BGP_RR_TE with R3 and R4 as RRs """ # Add all routers as1r1 = self.bgp('as1r1') as1r2 = self.bgp('as1r2') as1r3 = self.bgp('as1r3') as1r4 = self.bgp('as1r4') as1r5 = self.bgp('as1r5') as1r6 = self.bgp('as1r6') as8r1 = self.addRouter('as8r1') as8r1.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), )) as8r2 = self.addRouter('as8r2') as8r2.addDaemon( BGP, address_families=(AF_INET6(networks=('dead:beef::/32', )), )) h1 = self.addHost('h1') as7r1 = self.addRouter('as7r1') as7r1.addDaemon( BGP, address_families=(AF_INET6(networks=('feeb:daed::/32', )), )) as7r2 = self.addRouter('as7r2') as7r2.addDaemon( BGP, address_families=(AF_INET6(networks=('feeb:daed::/32', )), )) as7r3 = self.addRouter('as7r3') as7r3.addDaemon( BGP, address_families=(AF_INET6(networks=('feeb:daed::/32', )), )) h2 = self.addHost('h2') # Add Links self.addLink(as1r1, as1r6) self.addLink(as1r1, as1r3) self.addLink(as1r3, as1r2) self.addLink(as1r3, as1r6) self.addLink(as1r2, as1r4) self.addLink(as1r4, as1r5) self.addLink(as1r5, as1r6) self.addLink(as1r2, as8r1) self.addLink(as1r4, as8r2) self.addLink(as1r1, as7r1) self.addLink(as1r3, as7r2) self.addLink(as1r5, as7r3) self.addLink(as1r6, as7r3) self.addLink(as8r1, h1, params1={"ip": "dead:beef::/48"}, params2={"ip": "dead:beef::1/48"}) self.addLink(as8r2, h1, params1={"ip": "dead:beef::2/48"}, params2={"ip": "dead:beef::3/48"}) self.addLink(as7r1, h2, params1={"ip": "feeb:daed::/48"}, params2={"ip": "feeb:daed::1/48"}) self.addLink(as7r1, h2, params1={"ip": "feeb:daed::4/48"}, params2={"ip": "feeb:daed::5/48"}) self.addLink(as7r2, h2, params1={"ip": "feeb:daed::2/48"}, params2={"ip": "feeb:daed::3/48"}) set_rr(self, rr=as1r3, peers=[as1r1, as1r2, as1r4, as1r5, as1r6]) set_rr(self, rr=as1r4, peers=[as1r1, as1r2, as1r3, as1r5, as1r6]) # Add full mesh self.addiBGPFullMesh(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6)) self.addAS(7, (as7r1, as7r2, as7r3)) self.addAS(8, (as8r1, as8r2)) # Add eBGP session ebgp_session(self, as1r2, as8r1) ebgp_session(self, as1r4, as8r2) ebgp_session(self, as1r1, as7r1) ebgp_session(self, as1r3, as7r2) ebgp_session(self, as1r5, as7r3) ebgp_session(self, as1r6, as7r3) super(BGPTopoTE2, self).build(*args, **kwargs)
def bgp(self, name): r = self.addRouter(name) r.addDaemon( BGP, address_families=(AF_INET6(redistribute=('connected', )), )) return r
#!/usr/bin/env python3 from ipmininet.ipnet import IPNet from ipmininet.cli import IPCLI from ipmininet.iptopo import IPTopo from ipmininet.router.config import BGP, OSPF, OSPF6, RouterConfig, AF_INET, AF_INET6, set_rr, bgp_fullmesh, ebgp_session, SHARE, CLIENT_PROVIDER, bgp_peering families = ( AF_INET(redistribute=('connected',)), AF_INET6(redistribute=('connected',)) ) class TestTopo(IPTopo): def build(self, * args, ** kwargs): def add_daemon(r): r.addDaemon(BGP, address_families=families) r.addDaemon(OSPF) r.addDaemon(OSPF6) return r as1_r1 = self.addRouter("as1_r1", config = RouterConfig) as2_r1 = self.addRouter("as2_r1", config = RouterConfig) as1_r2 = self.addRouter("as1_r2", config = RouterConfig) as2_r2 = self.addRouter("as2_r2", config = RouterConfig) as1_h = self.addHost("as1_h") as2_h = self.addHost("as2_h") self.addAS(1, [as1_r1, as1_r2]) self.addAS(2, [as2_r1, as2_r2])