Beispiel #1
0
    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)
Beispiel #2
0
    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
Beispiel #3
0
    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)
Beispiel #4
0
    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)
Beispiel #5
0
 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)
Beispiel #6
0
    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)
Beispiel #7
0
    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)
Beispiel #8
0
    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)
Beispiel #10
0
    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)
Beispiel #11
0
    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)
Beispiel #12
0
    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)
Beispiel #13
0
    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)
Beispiel #14
0
    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)
Beispiel #15
0
    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)
Beispiel #16
0
    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)
Beispiel #17
0
    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)
Beispiel #18
0
    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)
Beispiel #19
0
    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)
Beispiel #20
0
    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)