def build(self, *args, **kwargs): def add_daemon(*routers): for r in routers: r.addDaemon(BGP, address_families=families, **kwargs) r.addDaemon(OSPF) r.addDaemon(OSPF6) return routers server_ip = ["10.10.10.10", "10::10"] """ Routers """ as1_r1, as1_r2, as1_rr = self.addRouters("as1_r1", "as1_r2", "as1_rr") as2_r1 = self.addRouter("as2_r1", config=RouterConfig) """ Hosts """ as1_h1, as1_h2 = [self.addHost(n) for n in ("as1_h1", "as1_h2")] as2_h = self.addHost("as2_h") """ Servers """ master = self.addHost("master") serv1 = self.addHost("s1") serv2 = self.addHost("s2") """ AS """ self.addAS(1, [as1_r1, as1_r2, as1_rr]) self.addAS(2, [as2_r1]) """ Daemons """ serv1.addDaemon(Named) serv2.addDaemon(Named) records = [ ARecord(serv1, server_ip[0], ttl=240), AAAARecord(serv1, server_ip[1]) ] self.addDNSZone( name="group10", dns_master=master, dns_slaves=[], nodes=[serv2, serv1], ) #add_daemon(serv1, serv2) add_daemon(as1_r1, as1_r2, as1_rr) add_daemon(as2_r1) """ Links """ self.addLinks((as1_r1, serv1), (as1_r2, serv2)) self.addLink(as1_r1, master) self.addLink(as1_rr, as1_r1, igp_metric=2) self.addLinks((as1_rr, as1_r2), (as1_rr, as2_r1)) self.addLinks((as1_r1, as1_h1), (as1_rr, as1_h2), (as2_r1, as2_h)) set_rr(self, rr=as1_rr, peers=[as1_r1, as1_r2]) ebgp_session(self, as1_rr, as2_r1, link_type=SHARE) super().build(*args, **kwargs)
def add_bgp_clients(self, rr_name, clients): self.__bgp_sessions['clients'][rr_name] = clients if self.debug: print( "Setting router {} as Route Reflector with clients {}".format( rr_name, clients)) if len(clients) > 0: set_rr(self, rr=self.__routers[rr_name], peers=clients) return True
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): 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]) add_daemon(as1_r1) add_daemon(as2_r1) add_daemon(as1_r2) add_daemon(as2_r2) self.addLink(as1_r2, as1_h) self.addLink(as1_r2, as1_r1) self.addLink(as1_r1, as2_r1) self.addLink(as2_r2, as2_r1) self.addLink(as2_r1, as2_h) set_rr(self, rr = as1_r1, peers = [as1_r2]) set_rr(self, rr = as2_r1, peers = [as2_r2]) ebgp_session(self, as1_r1, as2_r1, link_type=CLIENT_PROVIDER) super().build(*args, **kwargs)
def build(self, *args, **kwargs): def add_daemon(*routers, ospf=True, bgp=True): for r in routers: if bgp: r.addDaemon(BGP, address_families=families, **kwargs) if ospf: r.addDaemon(OSPF) r.addDaemon(OSPF6) return routers server_ip = ["10.10.10.10/32", "10::10/128"] """ Routers """ as1_r1, as1_r2, as1_rr = self.addRouters("as1_r1", "as1_r2", "as1_rr") as2_r1 = self.addRouter("as2_r1", config=RouterConfig) """ Hosts """ as1_h1, as1_h2 = [self.addHost(n) for n in ("as1_h1", "as1_h2")] as2_h = self.addHost("as2_h") """ Servers """ serv1 = self.addRouter("s1", lo_addresses=server_ip) serv2 = self.addRouter("s2", lo_addresses=server_ip) """ AS """ self.addAS(1, [as1_r1, as1_r2, as1_rr, serv1, serv2]) self.addAS(2, [as2_r1]) """ Daemons """ add_daemon(serv1, serv2, ospf=False) add_daemon(as1_r1, as1_r2, as1_rr) add_daemon(as2_r1) """ Links """ self.addLinks((as1_r1, serv1), (as1_r2, serv2)) self.addLink(as1_rr, as1_r1, igp_metric=2) self.addLinks((as1_rr, as1_r2), (as1_rr, as2_r1)) self.addLinks((as1_r1, as1_h1), (as1_rr, as1_h2), (as2_r1, as2_h)) set_rr(self, rr=as1_rr, peers=[as1_r1, as1_r2]) set_rr(self, rr=as1_r1, peers=[serv1]) set_rr(self, rr=as1_r2, peers=[serv2]) ebgp_session(self, as1_rr, as2_r1, link_type=SHARE) super().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 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 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): """ 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', )) cl = new_community_list(name='loc-pref', community='1:80') set_local_pref(self, as1r6, as4r1, 99, filter_list=(al, )) set_community(self, as4r1, as1r6, '1:80', filter_list=(al, ), direction='in') set_med(self, as1r6, as4r1, 50, filter_list=(al, )) set_med(self, as4r1, as1r6, 50, filter_list=(al, )) set_local_pref(self, as1r5, as4r2, 50, filter_list=(al, )) # Add full mesh self.addAS(4, (as4r1, as4r2)) self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6)) set_rr(self, as1r3, (as1r1, as1r2, as1r4, as1r5, as1r6)) # Add eBGP session ebgp_session(self, as1r6, as4r1) ebgp_session(self, as1r5, as4r2) super(BGPTopoFull, self).build(*args, **kwargs)
def build(self, * args, ** kwargs): def add_daemon(* routers, ospf = True, bgp = True): for r in routers: if bgp: r.addDaemon(BGP, address_families=families, ** kwargs) if ospf: r.addDaemon(OSPF) r.addDaemon(OSPF6) return routers server_ip = ["10.10.10.10/32", "10::10/128"] # vérifier que les paquets sur le port de bgp respectent le ttl # these rules seem to work, they don't break ping4all. ip_rule = [InputFilter(default="DROP", rules=[ # rule to allow bgp packets that match ttl == 255 (this one doesn't seem to work) Allow(proto = 'tcp --dport 179', match = 'ttl --ttl-eq 255'), # allow loopback addresses Allow(iif = 'lo'), # allow tcp connections that were previously created Allow(proto = 'tcp', iif = 'eth0', match = 'conntrack --ctstate RELATED,ESTABLISHED'), # allow the routers of our network (in this test topology it allows all routers to send messages => this has to be changed) Allow(proto = 'tcp', s = '192.168.0.0/20'), # we allow the icmp protocol Allow(proto = 'icmp')])] # ipv6 rules ip6_rule = [Rule('-P INPUT DROP'), Rule('-A INPUT -i lo -j ACCEPT'), Rule('-A INPUT -p icmpv6 -j ACCEPT'), Rule('-A INPUT -p tcp --dport 179 -m hl --hl-lt 254 -j DROP'), Rule('-A INPUT -p tcp -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT'), # this seems not very safe but i did not find a rule to avoid it yet (i tried using the -s option but didn't manage to get something good) Rule('-A INPUT -p tcp -j ACCEPT') ] """ Routers """ as1_r1, as1_r2, as1_rr = self.addRouters("as1_r1", "as1_r2", "as1_rr") as2_r1 = self.addRouter("as2_r1", config = RouterConfig) """ Hosts """ as1_h1, as1_h2 = [self.addHost(n) for n in ("as1_h1", "as1_h2")] as2_h = self.addHost("as2_h") """ Servers """ serv1 = self.addRouter("s1", lo_addresses = server_ip) serv2 = self.addRouter("s2", lo_addresses = server_ip) """ AS """ self.addAS(1, [as1_r1, as1_r2, as1_rr, serv1, serv2]) self.addAS(2, [as2_r1]) """ Daemons """ add_daemon(serv1, serv2, ospf = False) add_daemon(as1_r1, as1_r2, as1_rr) add_daemon(as2_r1) # we add the ip_rule to the router of our AS that is connected to the other AS as1_rr.addDaemon(IPTables, rules = ip_rule) #as1_r1.addDaemon(IPTables, rules = ip_rule) #as1_r2.addDaemon(IPTables, rules = ip_rule) as1_rr.addDaemon(IP6Tables, rules = ip6_rule) """ Links """ self.addLinks((as1_r1, serv1), (as1_r2, serv2)) self.addLink(as1_rr, as1_r1, igp_metric = 2) self.addLinks((as1_rr, as1_r2), (as1_rr, as2_r1)) self.addLinks((as1_r1, as1_h1), (as1_rr, as1_h2), (as2_r1, as2_h)) set_rr(self, rr = as1_rr, peers = [as1_r1, as1_r2]) set_rr(self, rr = as1_r1, peers = [serv1]) set_rr(self, rr = as1_r2, peers = [serv2]) ebgp_session(self, as1_rr, as2_r1, link_type=None) super().build(*args, **kwargs)
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): """ 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): 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 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): """ + 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,))\ .set_med(50, to_peer=as4r1, matching=(al,)) as4r1.get_config(BGP)\ .set_community('1:80', from_peer=as1r6, matching=(al,))\ .set_med(50, to_peer=as1r6, matching=(al,)) as1r5.get_config(BGP).set_local_pref(50, from_peer=as4r2, matching=(al, )) # Add full mesh self.addAS(4, (as4r1, as4r2)) self.addAS(1, (as1r1, as1r2, as1r3, as1r4, as1r5, as1r6)) set_rr(self, rr=as1r3, peers=(as1r1, as1r2, 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): # 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 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): """ 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): #Adressage IP Routeur IPV4 serveur_ipv4 = "160.72.247." nwk_ipv4 = "160.72.241." bhs_ipv4 = "160.72.242." chi_ipv4 = "160.72.243." ash_ipv4 = "160.72.244." europe_ipv4 = "160.72.245." asia_ipv4 = "160.72.246." #Adressage IP Routeur IPV6 serveur_ipv6 = "2010:1000:0000:0" usa_ipv6 = "2010:1100:0000:0" europe_ipv6 = "2010:1200:0000:0" asia_ipv6 = "2010:1300:0000:0" # Building OVH Network # test routers used for pingall when checking eBGP # Building New York routers nwk_1 = self.addRouter( "nwk_1", lo_addresses=[usa_ipv6 + "000::/64", nwk_ipv4 + "100/24"]) nwk_5 = self.addRouter( "nwk_5", lo_addresses=[usa_ipv6 + "100::/64", nwk_ipv4 + "110/24"]) # Building Bhs routers bhs_g1 = self.addRouter( "bhs_g1", lo_addresses=[usa_ipv6 + "200::/64", bhs_ipv4 + "100/24"]) bhs_g2 = self.addRouter( "bhs_g2", lo_addresses=[usa_ipv6 + "300::/64", bhs_ipv4 + "110/24"]) # Building Chicago routers chi_1 = self.addRouter( "chi_1", lo_addresses=[usa_ipv6 + "400::/64", chi_ipv4 + "100/24"]) chi_5 = self.addRouter( "chi_5", lo_addresses=[usa_ipv6 + "500::/64", chi_ipv4 + "110/24"]) # Building Ashburn routers ash_1 = self.addRouter( "ash_1", lo_addresses=[usa_ipv6 + "600::/64", ash_ipv4 + "100/24"]) ash_5 = self.addRouter( "ash_5", lo_addresses=[usa_ipv6 + "700::/64", ash_ipv4 + "110/24"]) # Building europe's routers abstractly europe = self.addRouter( "europe", lo_addresses=[europe_ipv6 + "000::/64", europe_ipv4 + "100/24"]) # Building asia's routers abstractly asia = self.addRouter( "asia", lo_addresses=[asia_ipv6 + "000::/64", asia_ipv4 + "100/24"]) routers = self.routers() prefix = { routers[i]: '2001:100:%04x::/48' % i for i in range(len(routers)) } nwk_1.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[nwk_1], ('2001:3c::/64'))), ), routerid='1.1.1.1') nwk_5.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[nwk_5], )), ), routerid='1.1.1.2') bhs_g1.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[bhs_g1], )), ), routerid='1.1.1.3') bhs_g2.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[bhs_g2], )), ), routerid='1.1.1.4') chi_1.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[chi_1], )), ), routerid='1.1.1.5') chi_5.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[chi_5], )), ), routerid='1.1.1.6') ash_1.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[ash_1], )), ), routerid='1.1.1.7') ash_5.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[ash_5], )), ), routerid='1.1.1.8') europe.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[europe], ('2001:3c::/64'))), ), routerid='1.1.2.9') asia.addDaemon( BGP, address_families=(AF_INET6(networks=(prefix[asia], ('2001:3c::/64'))), ), routerid='1.1.3.10') # Adding Links and igp_metrics between OVH routers and ip local adress ipv6 las1 = self.addLink(nwk_1, nwk_5) las1[nwk_1].addParams(ip6=(usa_ipv6 + "000::1/64"), ip4=(nwk_ipv4 + "101/24")) las1[nwk_5].addParams(ip6=(usa_ipv6 + "100::1/64"), ip4=(nwk_ipv4 + "111/24")) las2 = self.addLink(bhs_g1, bhs_g2) las2[bhs_g1].addParams(ip6=(usa_ipv6 + "200::1/64"), ip4=(bhs_ipv4 + "101/24")) las2[bhs_g2].addParams(ip6=(usa_ipv6 + "300::1/64"), ip4=(bhs_ipv4 + "111/24")) las3 = self.addLink(ash_1, ash_5) las3[ash_1].addParams(ip6=(usa_ipv6 + "600::1/64"), ip4=(ash_ipv4 + "101/24")) las3[ash_5].addParams(ip6=(usa_ipv6 + "700::1/64"), ip4=(ash_ipv4 + "111/24")) las4 = self.addLink(chi_1, chi_5) las4[chi_1].addParams(ip6=(usa_ipv6 + "400::1/64"), ip4=(chi_ipv4 + "101/24")) las4[chi_5].addParams(ip6=(usa_ipv6 + "500::1/64"), ip4=(chi_ipv4 + "111/24")) las11 = self.addLink(nwk_1, bhs_g1) las11[nwk_1].addParams(ip6=(usa_ipv6 + "000::2/64"), ip4=(nwk_ipv4 + "102/24")) las11[bhs_g1].addParams(ip6=(usa_ipv6 + "200::2/64"), ip4=(bhs_ipv4 + "102/24")) las12 = self.addLink(nwk_1, ash_1) las12[nwk_1].addParams(ip6=(usa_ipv6 + "000::3/64"), ip4=(nwk_ipv4 + "103/24")) las12[ash_1].addParams(ip6=(usa_ipv6 + "600::2/64"), ip4=(ash_ipv4 + "102/24")) las13 = self.addLink(nwk_5, bhs_g2) las13[nwk_5].addParams(ip6=(usa_ipv6 + "100::2/64"), ip4=(nwk_ipv4 + "112/24")) las13[bhs_g2].addParams(ip6=(usa_ipv6 + "300::2/64"), ip4=(bhs_ipv4 + "112/24")) las14 = self.addLink(nwk_5, ash_5) las14[nwk_5].addParams(ip6=(usa_ipv6 + "100::3/64"), ip4=(nwk_ipv4 + "113/24")) las14[ash_5].addParams(ip6=(usa_ipv6 + "700::2/64"), ip4=(ash_ipv4 + "112/24")) las41 = self.addLink(chi_1, bhs_g1, igp_metric=3) las41[chi_1].addParams(ip6=(usa_ipv6 + "400::2/64"), ip4=(chi_ipv4 + "102/24")) las41[bhs_g1].addParams(ip6=(usa_ipv6 + "200::3/64"), ip4=(bhs_ipv4 + "103/24")) las42 = self.addLink(chi_1, ash_1, igp_metric=3) las42[chi_1].addParams(ip6=(usa_ipv6 + "400::3/64"), ip4=(chi_ipv4 + "103/24")) las42[ash_1].addParams(ip6=(usa_ipv6 + "600::3/64"), ip4=(ash_ipv4 + "103/24")) las43 = self.addLink(chi_5, bhs_g2, igp_metric=3) las43[chi_5].addParams(ip6=(usa_ipv6 + "500::2/64"), ip4=(chi_ipv4 + "112/24")) las43[bhs_g2].addParams(ip6=(usa_ipv6 + "300::3/64"), ip4=(bhs_ipv4 + "113/24")) las44 = self.addLink(chi_5, ash_5, igp_metric=3) las44[chi_5].addParams(ip6=(usa_ipv6 + "500::3/64"), ip4=(chi_ipv4 + "113/24")) las44[ash_5].addParams(ip6=(usa_ipv6 + "700::3/64"), ip4=(ash_ipv4 + "113/24")) # Connecting US TO EU las15 = self.addLink(nwk_1, europe, igp_metric=30) # 30 las15[nwk_1].addParams(ip6=(usa_ipv6 + "000::4/64"), ip4=(nwk_ipv4 + "104/24")) las15[europe].addParams(ip6=(europe_ipv6 + "000::1/64"), ip4=(europe_ipv4 + "101/24")) las16 = self.addLink(nwk_5, europe, igp_metric=30) # 30 las16[nwk_5].addParams(ip6=(usa_ipv6 + "100::4/64"), ip4=(nwk_ipv4 + "114/24")) las16[europe].addParams(ip6=(europe_ipv6 + "000::2/64"), ip4=(europe_ipv4 + "102/24")) # Connection EU to AS las5 = self.addLink(europe, asia, igp_metric=40) # 40 las5[europe].addParams(ip6=(europe_ipv6 + "000::3/64"), ip4=(europe_ipv4 + "103/24")) las5[asia].addParams(ip6=(asia_ipv6 + "000::1/64"), ip4=(asia_ipv4 + "101/24")) # Connecting US to AS las51 = self.addLink(asia, chi_1, igp_metric=50) # 50 las51[chi_1].addParams(ip6=(usa_ipv6 + "400::4/64"), ip4=(chi_ipv4 + "104/24")) las51[asia].addParams(ip6=(asia_ipv6 + "000::2/64"), ip4=(asia_ipv4 + "102/24")) las52 = self.addLink(asia, chi_5, igp_metric=50) # 50 las52[chi_5].addParams(ip6=(usa_ipv6 + "500::4/64"), ip4=(chi_ipv4 + "114/24")) las52[asia].addParams(ip6=(asia_ipv6 + "000::3/64"), ip4=(asia_ipv4 + "103/24")) # Adding OVH AS as16276_routers = [ nwk_1, nwk_5, bhs_g1, bhs_g2, chi_1, chi_5, ash_1, ash_5, europe, asia ] # Adding OSPF6v3 and BGP to OVH Network for r in as16276_routers: r.addDaemon(OSPF6) self.addAS(16276, (nwk_1, nwk_5, bhs_g1, bhs_g2, chi_1, chi_5, ash_1, ash_5, europe, asia)) # Setting up OVH Network Route Reflectors set_rr(self, rr=nwk_1, peers=[ nwk_5, bhs_g1, bhs_g2, chi_1, chi_5, ash_1, ash_5, europe, asia ]) set_rr(self, rr=chi_1, peers=[ nwk_1, nwk_5, bhs_g1, bhs_g2, chi_5, ash_1, ash_5, europe, asia ]) ############################################################# # # # STUB # # # ############################################################# #Adressage IPv4 as16509_ipv4 = "162.61.1." as7843_ipv4 = "162.62.1." #Adressage IPv6 as16509_ipv6 = "2010:2100:0000:0" as7843_ipv6 = "2010:2200:0000:0" # Building AS16509 (AMAZON) as16509_ash_1_amazon = self.addHost("amazon_1") as16509_ash_5_amazon = self.addHost("amazon_2") #Routers + loopback as16509_r1 = self.addRouter( "as16509_r1", lo_addresses=[as16509_ipv6 + "000::/64", as16509_ipv4 + "100/24"]) as16509_r2 = self.addRouter( "as16509_r2", lo_addresses=[as16509_ipv6 + "100::/64", as16509_ipv4 + "110/24"]) # Linking AS16509 (AMAZON) to its router ma1 = self.addLink(as16509_ash_1_amazon, as16509_r1) #as16509_ash_1_amazon et as16509_ash_5_amazon ont des adresses ipv6 et ipv4 proche de ash1 et ash5 par choix ma1[as16509_ash_1_amazon].addParams(ip6=(usa_ipv6 + "610::1/64"), ip4=(ash_ipv4 + "150/24")) ma1[as16509_r1].addParams(ip6=(as16509_ipv6 + "000::1/64"), ip4=(as16509_ipv4 + "101/24")) ma2 = self.addLink(as16509_ash_5_amazon, as16509_r2) ma2[as16509_ash_5_amazon].addParams(ip6=(usa_ipv6 + "710::1/64"), ip4=(ash_ipv4 + "160/24")) ma2[as16509_r2].addParams(ip6=(as16509_ipv6 + "100::1/64"), ip4=(as16509_ipv4 + "111/24")) ma3 = self.addLink(as16509_r1, as16509_r2) ma3[as16509_r1].addParams(ip6=(as16509_ipv6 + "000::2/64"), ip4=(as16509_ipv4 + "102/24")) ma3[as16509_r2].addParams(ip6=(as16509_ipv6 + "100::2/64"), ip4=(as16509_ipv4 + "112/24")) as16509_routers = [as16509_r1, as16509_r2] # Adding OSPF6v3 and BGP to AS174 (Cogent) for r in as16509_routers: r.addDaemon(OSPF6) as16509_r1.addDaemon( BGP, address_families=(AF_INET6(networks=("2001:200:1::/48", )), ), routerid='1.2.1.1') as16509_r2.addDaemon( BGP, address_families=(AF_INET6(networks=("2001:200:2::/48", )), ), routerid='1.2.1.2') self.addAS(16509, (as16509_r1, as16509_r2)) # Building physical links between AS16509 (AMAZON) and OVH lam1 = self.addLink(as16509_r1, ash_1) lam1[as16509_r1].addParams(ip6=(as16509_ipv6 + "000::3/64"), ip4=(as16509_ipv4 + "103/24")) lam1[ash_1].addParams(ip6=(usa_ipv6 + "600::4/64"), ip4=(ash_ipv4 + "104/24")) lam2 = self.addLink(as16509_r1, ash_5) lam2[as16509_r1].addParams(ip6=(as16509_ipv6 + "000::4/64"), ip4=(as16509_ipv4 + "104/24")) lam2[ash_5].addParams(ip6=(usa_ipv6 + "700::4/64"), ip4=(ash_ipv4 + "114/24")) lam3 = self.addLink(as16509_r2, ash_1) lam3[as16509_r2].addParams(ip6=(as16509_ipv6 + "100::3/64"), ip4=(as16509_ipv4 + "113/24")) lam3[ash_1].addParams(ip6=(usa_ipv6 + "600::5/64"), ip4=(ash_ipv4 + "105/24")) lam4 = self.addLink(as16509_r2, ash_5) lam4[as16509_r2].addParams(ip6=(as16509_ipv6 + "100::4/64"), ip4=(as16509_ipv4 + "114/24")) lam4[ash_5].addParams(ip6=(usa_ipv6 + "700::5/64"), ip4=(ash_ipv4 + "115/24")) ebgp_session(self, as16509_r1, ash_1, link_type=SHARE) ebgp_session(self, as16509_r2, ash_1, link_type=SHARE) # Building as7843 (CHARTER) , routers and links as7843_chi_1_charter = self.addHost("charter_1") as7843_ash_1_charter = self.addHost("charter_2") #Routers + loopback as7843_r1 = self.addRouter( "as7843_r1", lo_addresses=[as7843_ipv6 + "000::/64", as7843_ipv4 + "100/24"]) as7843_r2 = self.addRouter( "as7843_r2", lo_addresses=[as7843_ipv6 + "100::/64", as7843_ipv4 + "110/24"]) # Linking as7843 (CHARTER) to its router mo1 = self.addLink(as7843_chi_1_charter, as7843_r1) #as7843_chi_1_charter et as7843_ash_1_charter ont des adresses proches respectivement de chi_1 et de ash_1 mo1[as7843_chi_1_charter].addParams(ip6=(usa_ipv6 + "410::1/64"), ip4=(chi_ipv4 + "150/24")) mo1[as7843_r1].addParams(ip6=(as7843_ipv6 + "000::1/64"), ip4=(as7843_ipv4 + "101/24")) mo2 = self.addLink(as7843_ash_1_charter, as7843_r1) mo2[as7843_ash_1_charter].addParams(ip6=(usa_ipv6 + "620::/64"), ip4=(ash_ipv4 + "170/24")) mo2[as7843_r1].addParams(ip6=(as7843_ipv6 + "000::2/64"), ip4=(as7843_ipv4 + "102/24")) mo3 = self.addLink(as7843_r1, as7843_r2) mo3[as7843_r1].addParams(ip6=(as7843_ipv6 + "000::3/64"), ip4=(as7843_ipv4 + "103/24")) mo3[as7843_r2].addParams(ip6=(as7843_ipv6 + "100::1/64"), ip4=(as7843_ipv4 + "111/24")) as7843_routers = [as7843_r1, as7843_r2] # Adding OSPF6v3 and BGP to AS174 (Cogent) for r in as7843_routers: r.addDaemon(OSPF6) as7843_r1.addDaemon( BGP, address_families=(AF_INET6(networks=("2001:300:1::/48", )), ), routerid='1.3.1.1') as7843_r2.addDaemon( BGP, address_families=(AF_INET6(networks=("2001:300:2::/48", )), ), routerid='1.3.1.2') self.addAS(7843, (as7843_r1, as7843_r2)) # Building physical links between as7843 (CHARTER) and OVH lach1 = self.addLink(as7843_r1, chi_1) lach1[as7843_r1].addParams(ip6=(as7843_ipv6 + "000::4/64"), ip4=(as7843_ipv4 + "104/24")) lach1[chi_1].addParams(ip6=(usa_ipv6 + "400::5/64"), ip4=(chi_ipv4 + "105/24")) lach2 = self.addLink(as7843_r1, ash_1) lach2[as7843_r1].addParams(ip6=(as7843_ipv6 + "000::5/64"), ip4=(as7843_ipv4 + "105/24")) lach2[ash_1].addParams(ip6=(usa_ipv6 + "600::6/64"), ip4=(ash_ipv4 + "106/24")) lach3 = self.addLink(as7843_r2, chi_1) lach3[as7843_r2].addParams(ip6=(as7843_ipv6 + "100::2/64"), ip4=(as7843_ipv4 + "112/24")) lach3[chi_1].addParams(ip6=(usa_ipv6 + "400::6/64"), ip4=(chi_ipv4 + "106/24")) lach4 = self.addLink(as7843_r2, ash_1) lach4[as7843_r2].addParams(ip6=(as7843_ipv6 + "100::3/64"), ip4=(as7843_ipv4 + "113/24")) lach4[ash_1].addParams(ip6=(usa_ipv6 + "600::7/64"), ip4=(ash_ipv4 + "107/24")) ebgp_session(self, as7843_r1, chi_1, link_type=SHARE) ebgp_session(self, as7843_r2, ash_1, link_type=SHARE) ############################################################# # # # TRANSIT # # # ############################################################# #Adressage IPv4 as1299_ipv4 = "162.63.1." as174_ipv4 = "162.64.1." as3356_ipv4 = "162.65.1." #Adressage IPv6 as1299_ipv6 = "2010:2300:0000:0" as174_ipv6 = "2010:2400:0000:0" as3356_ipv6 = "2010:2500:0000:0" # Building AS1299 (TElIA) , routers and links as1299_nwk_1_telia = self.addHost("telia_1") as1299_nwk_5_telia = self.addHost("telia_2") as1299_chi_5_telia = self.addHost("telia_3") as1299_ash_5_telia = self.addHost("telia_4") #Routers + loopback as1299_r1 = self.addRouter( "as1299_r1", lo_addresses=[as1299_ipv6 + "000::/64", as1299_ipv4 + "100/24"]) as1299_r2 = self.addRouter( "as1299_r2", lo_addresses=[as1299_ipv6 + "100::/64", as1299_ipv4 + "110/24"]) # Linking AS1299 (TElIA) to its router ta1 = self.addLink(as1299_nwk_1_telia, as1299_r1) ta1[as1299_nwk_1_telia].addParams(ip6=(usa_ipv6 + "010::/64"), ip4=(nwk_ipv4 + "150/24")) ta1[as1299_r1].addParams(ip6=(as1299_ipv6 + "000::1/64"), ip4=(as1299_ipv4 + "101/24")) ta2 = self.addLink(as1299_nwk_5_telia, as1299_r1) ta2[as1299_nwk_5_telia].addParams(ip6=(usa_ipv6 + "110::/64"), ip4=(nwk_ipv4 + "160/24")) ta2[as1299_r1].addParams(ip6=(as1299_ipv6 + "000::2/64"), ip4=(as1299_ipv4 + "102/24")) ta3 = self.addLink(as1299_chi_5_telia, as1299_r2) ta3[as1299_chi_5_telia].addParams(ip6=(usa_ipv6 + "510::/64"), ip4=(chi_ipv4 + "160/24")) ta3[as1299_r2].addParams(ip6=(as1299_ipv6 + "100::1/64"), ip4=(as1299_ipv4 + "111/24")) ta4 = self.addLink(as1299_ash_5_telia, as1299_r2) ta4[as1299_ash_5_telia].addParams(ip6=(usa_ipv6 + "720::1/64"), ip4=(ash_ipv4 + "180/24")) ta4[as1299_r2].addParams(ip6=(as1299_ipv6 + "100::2/64"), ip4=(as1299_ipv4 + "112/24")) ta5 = self.addLink(as1299_r1, as1299_r2) ta5[as1299_r1].addParams(ip6=(as1299_ipv6 + "000::3/64"), ip4=(as1299_ipv4 + "103/24")) ta5[as1299_r2].addParams(ip6=(as1299_ipv6 + "100::3/64"), ip4=(as1299_ipv4 + "113/24")) as1299_routers = [as1299_r1, as1299_r2] # Adding OSPF6v3 and BGP to AS174 (Cogent) for r in as1299_routers: r.addDaemon(OSPF6) as1299_r1.addDaemon( BGP, address_families=(AF_INET6(networks=("2001:400:1::/48", )), ), routerid='1.4.1.1') as1299_r2.addDaemon( BGP, address_families=(AF_INET6(networks=("2001:400:2::/48", )), ), routerid='1.4.1.2') self.addAS(1299, (as1299_r1, as1299_r2)) # Building physical links between AS1299 (TElIA) and OVH lok1 = self.addLink(as1299_r1, nwk_1) lok1[as1299_r1].addParams(ip6=(as1299_ipv6 + "000::4/64"), ip4=(as1299_ipv4 + "104/24")) lok1[nwk_1].addParams(ip6=(usa_ipv6 + "000::5/64"), ip4=(nwk_ipv4 + "105/24")) lok2 = self.addLink(as1299_r1, nwk_5) lok2[as1299_r1].addParams(ip6=(as1299_ipv6 + "000::5/64"), ip4=(as1299_ipv4 + "105/24")) lok2[nwk_5].addParams(ip6=(usa_ipv6 + "100::5/64"), ip4=(nwk_ipv4 + "115/24")) lok3 = self.addLink(as1299_r2, chi_5) lok3[as1299_r2].addParams(ip6=(as1299_ipv6 + "100::4/64"), ip4=(as1299_ipv4 + "114/24")) lok3[chi_5].addParams(ip6=(usa_ipv6 + "500::5/64"), ip4=(chi_ipv4 + "115/24")) lok4 = self.addLink(as1299_r2, ash_5) lok4[as1299_r2].addParams(ip6=(as1299_ipv6 + "100::5/64"), ip4=(as1299_ipv4 + "115/24")) lok4[ash_5].addParams(ip6=(usa_ipv6 + "700::6/64"), ip4=(ash_ipv4 + "116/24")) # Remarque : ebgp fonctionne avec 3 n'importe lequels mais # dès qu'on actve 4 sessions, problème dans les ping. Aucun échange eBGP. # host 1 ne sait pas contacter telia et inversement # Je commente un nwk_5 car il y a dejà une session eBGP avec nwk_1 ebgp_session(self, as1299_r1, nwk_1, link_type=SHARE) ebgp_session(self, as1299_r2, chi_5, link_type=SHARE) ebgp_session(self, as1299_r2, ash_5, link_type=SHARE) # Building AS174 (Cogent) , routers and links as174_nwk_1_cogent = self.addHost("cogent_1") as174_nwk_5_cogent = self.addHost("cogent_2") as174_chi_1_cogent = self.addHost("cogent_3") as174_chi_5_cogent = self.addHost("cogent_4") as174_ash_1_cogent = self.addHost("cogent_5") as174_ash_5_cogent = self.addHost("cogent_6") #Routers + loopback as174_r1 = self.addRouter( "as174_r1", lo_addresses=[as174_ipv6 + "000::/64", as174_ipv4 + "100/24"]) as174_r2 = self.addRouter( "as174_r2", lo_addresses=[as174_ipv6 + "100::/64", as174_ipv4 + "110/24"]) # Added links to1 = self.addLink(as174_nwk_1_cogent, as174_r1) to1[as174_nwk_1_cogent].addParams(ip6=(usa_ipv6 + "020::/64"), ip4=(nwk_ipv4 + "170/24")) to1[as174_r1].addParams(ip6=(as174_ipv6 + "000::1/64"), ip4=(as174_ipv4 + "101/24")) to2 = self.addLink(as174_nwk_5_cogent, as174_r1) to2[as174_nwk_5_cogent].addParams(ip6=(usa_ipv6 + "120::/64"), ip4=(nwk_ipv4 + "180/24")) to2[as174_r1].addParams(ip6=(as174_ipv6 + "000::2/64"), ip4=(as174_ipv4 + "102/24")) to3 = self.addLink(as174_chi_1_cogent, as174_r1) to3[as174_chi_1_cogent].addParams(ip6=(usa_ipv6 + "420::1/64"), ip4=(chi_ipv4 + "170/24")) to3[as174_r1].addParams(ip6=(as174_ipv6 + "000::3/64"), ip4=(as174_ipv4 + "103/24")) to4 = self.addLink(as174_chi_5_cogent, as174_r1) to4[as174_chi_5_cogent].addParams(ip6=(usa_ipv6 + "520::/64"), ip4=(chi_ipv4 + "180/24")) to4[as174_r1].addParams(ip6=(as174_ipv6 + "000::4/64"), ip4=(as174_ipv4 + "104/24")) to5 = self.addLink(as174_ash_1_cogent, as174_r2) to5[as174_ash_1_cogent].addParams(ip6=(usa_ipv6 + "630::/64"), ip4=(ash_ipv4 + "190/24")) to5[as174_r2].addParams(ip6=(as174_ipv6 + "100::1/64"), ip4=(as174_ipv4 + "111/24")) to6 = self.addLink(as174_ash_5_cogent, as174_r2) to6[as174_ash_5_cogent].addParams(ip6=(usa_ipv6 + "730::1/64"), ip4=(ash_ipv4 + "200/24")) to6[as174_r2].addParams(ip6=(as174_ipv6 + "100::2/64"), ip4=(as174_ipv4 + "112/24")) to7 = self.addLink(as174_r1, as174_r2) to7[as174_r1].addParams(ip6=(as174_ipv6 + "000::5/64"), ip4=(as174_ipv4 + "105/24")) to7[as174_r2].addParams(ip6=(as174_ipv6 + "100::3/64"), ip4=(as174_ipv4 + "113/24")) as174_routers = [as174_r1, as174_r2] # Adding OSPF6v3 and BGP to AS174 (Cogent) for r in as174_routers: r.addDaemon(OSPF6) as174_r1.addDaemon( BGP, address_families=(AF_INET6(networks=("2001:500:1::/48", )), ), routerid='1.5.1.1') as174_r2.addDaemon( BGP, address_families=(AF_INET6(networks=("2001:500:2::/48", )), ), routerid='1.5.1.2') self.addAS(174, (as174_r1, as174_r2)) lom1 = self.addLink(as174_r1, nwk_1) lom1[as174_r1].addParams(ip6=(as174_ipv6 + "000::6/64"), ip4=(as174_ipv4 + "106/24")) lom1[nwk_1].addParams(ip6=(usa_ipv6 + "000::6/64"), ip4=(nwk_ipv4 + "106/24")) lom2 = self.addLink(as174_r1, nwk_5) lom2[as174_r1].addParams(ip6=(as174_ipv6 + "000::7/64"), ip4=(as174_ipv4 + "107/24")) lom2[nwk_5].addParams(ip6=(usa_ipv6 + "100::6/64"), ip4=(nwk_ipv4 + "116/24")) lom3 = self.addLink(as174_r1, chi_1) lom3[as174_r1].addParams(ip6=(as174_ipv6 + "000::8/64"), ip4=(as174_ipv4 + "108/24")) lom3[chi_1].addParams(ip6=(usa_ipv6 + "400::7/64"), ip4=(chi_ipv4 + "107/24")) lom4 = self.addLink(as174_r1, chi_5) lom4[as174_r1].addParams(ip6=(as174_ipv6 + "000::9/64"), ip4=(as174_ipv4 + "109/24")) lom4[chi_5].addParams(ip6=(usa_ipv6 + "500::6/64"), ip4=(chi_ipv4 + "116/24")) lom5 = self.addLink(as174_r2, ash_1) lom5[as174_r2].addParams(ip6=(as174_ipv6 + "100::4/64"), ip4=(as174_ipv4 + "114/24")) lom5[ash_1].addParams(ip6=(usa_ipv6 + "600::8/64"), ip4=(ash_ipv4 + "108/24")) lom6 = self.addLink(as174_r2, ash_5) lom6[as174_r2].addParams(ip6=(as174_ipv6 + "100::5/64"), ip4=(as174_ipv4 + "115/24")) lom6[ash_5].addParams(ip6=(usa_ipv6 + "700::7/64"), ip4=(ash_ipv4 + "117/24")) # Added an eBGP session for each datacenter region for redundancy ebgp_session(self, as174_r1, nwk_1, link_type=SHARE) ebgp_session(self, as174_r1, chi_1, link_type=SHARE) ebgp_session(self, as174_r2, ash_1, link_type=SHARE) # Building AS3356 (Level3), routers and links as3356_nwk_1_level3 = self.addHost("level3_1") as3356_nwk_5_level3 = self.addHost("level3_2") as3356_chi_1_level3 = self.addHost("level3_3") as3356_chi_5_level3 = self.addHost("level3_4") #Routers + loopback as3356_r1 = self.addRouter( "as3356_r1", lo_addresses=[as3356_ipv6 + "000::/64", as3356_ipv4 + "100/24"]) as3356_r2 = self.addRouter( "as3356_r2", lo_addresses=[as3356_ipv6 + "100::/64", as3356_ipv4 + "110/24"]) # Added links ti1 = self.addLink(as3356_nwk_5_level3, as3356_r1) ti1[as3356_nwk_5_level3].addParams(ip6=(usa_ipv6 + "130::/64"), ip4=(nwk_ipv4 + "190/24")) ti1[as3356_r1].addParams(ip6=(as3356_ipv6 + "000::1/64"), ip4=(as3356_ipv4 + "101/24")) ti2 = self.addLink(as3356_nwk_1_level3, as3356_r1) ti2[as3356_nwk_1_level3].addParams(ip6=(usa_ipv6 + "030::/64"), ip4=(nwk_ipv4 + "200/24")) ti2[as3356_r1].addParams(ip6=(as3356_ipv6 + "000::2/64"), ip4=(as3356_ipv4 + "102/24")) ti3 = self.addLink(as3356_chi_1_level3, as3356_r2) ti3[as3356_chi_1_level3].addParams(ip6=(usa_ipv6 + "430::1/64"), ip4=(chi_ipv4 + "190/24")) ti3[as3356_r2].addParams(ip6=(as3356_ipv6 + "100::1/64"), ip4=(as3356_ipv4 + "111/24")) ti4 = self.addLink(as3356_chi_5_level3, as3356_r2) ti4[as3356_chi_5_level3].addParams(ip6=(usa_ipv6 + "530::/64"), ip4=(chi_ipv4 + "200/24")) ti4[as3356_r2].addParams(ip6=(as3356_ipv6 + "100::2/64"), ip4=(as3356_ipv4 + "112/24")) ti5 = self.addLink(as3356_r1, as3356_r2) ti5[as3356_r1].addParams(ip6=(as3356_ipv6 + "000::3/64"), ip4=(as3356_ipv4 + "103/24")) ti5[as3356_r2].addParams(ip6=(as3356_ipv6 + "100::3/64"), ip4=(as3356_ipv4 + "113/24")) as3356_routers = [as3356_r1, as3356_r2] # Adding OSPFv3 and BGP to AS174 (Cogent) for r in as3356_routers: r.addDaemon(OSPF6) as3356_r1.addDaemon( BGP, address_families=(AF_INET6(networks=("2001:600:1::/48", )), ), routerid='1.6.1.1') as3356_r2.addDaemon( BGP, address_families=(AF_INET6(networks=("2001:600:2::/48", )), ), routerid='1.6.1.2') self.addAS(3356, (as3356_r1, as3356_r2)) lou1 = self.addLink(as3356_r1, nwk_1) lou1[as3356_r1].addParams(ip6=(as3356_ipv6 + "000::4/64"), ip4=(as3356_ipv4 + "104/24")) lou1[nwk_1].addParams(ip6=(usa_ipv6 + "000::7/64"), ip4=(nwk_ipv4 + "107/24")) lou2 = self.addLink(as3356_r1, nwk_5) lou2[as3356_r1].addParams(ip6=(as3356_ipv6 + "000::5/64"), ip4=(as3356_ipv4 + "105/24")) lou2[nwk_5].addParams(ip6=(usa_ipv6 + "100::7/64"), ip4=(nwk_ipv4 + "117/24")) lou3 = self.addLink(as3356_r2, chi_1) lou3[as3356_r2].addParams(ip6=(as3356_ipv6 + "100::4/64"), ip4=(as3356_ipv4 + "114/24")) lou3[chi_1].addParams(ip6=(usa_ipv6 + "400::8/64"), ip4=(chi_ipv4 + "108/24")) lou4 = self.addLink(as3356_r2, chi_5) lou4[as3356_r2].addParams(ip6=(as3356_ipv6 + "100::5/64"), ip4=(as3356_ipv4 + "115/24")) lou4[chi_5].addParams(ip6=(usa_ipv6 + "500::7/64"), ip4=(chi_ipv4 + "117/24")) # Added an eBGP session for each datacenter region for redundancy ebgp_session(self, as3356_r1, nwk_1, link_type=SHARE) ebgp_session(self, as3356_r2, chi_1, link_type=SHARE) all_al = AccessList('all', ('any', )) # Access list # SET MED nwk_1.get_config(BGP).set_med(50, to_peer=as174_r1, matching=(all_al, )) chi_5.get_config(BGP).set_med(100, to_peer=as174_r1, matching=(all_al, )) chi_1.get_config(BGP).set_med(100, to_peer=as174_r1, matching=(all_al, )) # SET BGP COMMUNITY as16276_routers = [ nwk_1, nwk_5, bhs_g1, bhs_g2, chi_1, chi_5, ash_1, ash_5 ] for s in as7843_routers: # charter routers europe.get_config(BGP).set_community(4, to_peer=s, matching=(all_al, )) asia.get_config(BGP).set_community(5, to_peer=s, matching=(all_al, )) for r in as16276_routers: s.get_config(BGP).set_community(21, to_peer=r, matching=(all_al, )) for s in as16509_routers: # amazon routers europe.get_config(BGP).set_community(4, to_peer=s, matching=(all_al, )) asia.get_config(BGP).set_community(5, to_peer=s, matching=(all_al, )) for r in as16276_routers: s.get_config(BGP).set_community(22, to_peer=r, matching=(all_al, )) for s in as3356_routers: # level3 routers europe.get_config(BGP).set_community(4, to_peer=s, matching=(all_al, )) asia.get_config(BGP).set_community(5, to_peer=s, matching=(all_al, )) for r in as16276_routers: s.get_config(BGP).set_community(11, to_peer=r, matching=(all_al, )) for s in as174_routers: # cogent routers europe.get_config(BGP).set_community(4, to_peer=s, matching=(all_al, )) asia.get_config(BGP).set_community(5, to_peer=s, matching=(all_al, )) for r in as16276_routers: s.get_config(BGP).set_community(12, to_peer=r, matching=(all_al, )) for s in as1299_routers: # telia routers europe.get_config(BGP).set_community(4, to_peer=s, matching=(all_al, )) asia.get_config(BGP).set_community(5, to_peer=s, matching=(all_al, )) for r in as16276_routers: s.get_config(BGP).set_community(13, to_peer=r, matching=(all_al, )) for s in as16276_routers: # OVH north america routers s.get_config(BGP).set_community(3, to_peer=europe, matching=(all_al, )) s.get_config(BGP).set_community(3, to_peer=asia, matching=(all_al, )) for r in as16509_routers: # amazon routers s.get_config(BGP).set_community(3, to_peer=r, matching=(all_al, )) for r in as7843_routers: # charter routers s.get_config(BGP).set_community(3, to_peer=r, matching=(all_al, )) for r in as1299_routers: # telia routers s.get_config(BGP).set_community(3, to_peer=r, matching=(all_al, )) for r in as174_routers: # cogent routers s.get_config(BGP).set_community(3, to_peer=r, matching=(all_al, )) for r in as3356_routers: # level3 routers s.get_config(BGP).set_community(3, to_peer=r, matching=(all_al, )) # SET CDN cdn_europe_host1 = self.addRouter( "cdn_host1", lo_addresses=["10.0.3.2/24", "2001:3c::2/64"]) cdn_europe_host1.addDaemon(BGP) cdn_europe_host1.addDaemon(OSPF6) cdn_europe_link1 = self.addLink(cdn_europe_host1, europe) cdn_europe_link1[europe].addParams(ip6=("10.0.3.4/24", ") 2ip4=(01:3c::4/64")) cdn_asia_host1 = self.addRouter( "cdn_host3", lo_addresses=["10.0.3.2/24", "2001:3c::2/64"]) cdn_asia_host1.addDaemon(BGP) cdn_asia_host1.addDaemon(OSPF6) cdn_asia_link1 = self.addLink(cdn_asia_host1, asia) cdn_asia_link1[asia].addParams(ip6=("10.0.3.3/24", ") 2ip4=(01:3c::3/64")) cdn_nwk_1_host1 = self.addRouter( "cdn_host5", lo_addresses=["10.0.3.2/24", "2001:3c::2/64"]) cdn_nwk_1_host1.addDaemon(BGP) cdn_nwk_1_host1.addDaemon(OSPF6) cdn_nwk_1_link1 = self.addLink(cdn_nwk_1_host1, nwk_1) cdn_nwk_1_link1[nwk_1].addParams(ip6=("10.0.3.1/24", ") 2ip4=(01:3c::1/64")) super().build(*args, **kwargs)