viernes, 28 de marzo de 2014

Configuración BGP para MPLS

La tabla inet.3 sólo se utiliza en una situación: cuando es el next-hop de una ruta BGP. Por tanto para que sea de utilidad hay que:
  • Establecer un full mesh iBGP entre todos los routers PE y P.
  • Usar las direcciones de loopback como origen de la sesión, destino (la loopback del vecino) y con next-hop self.
  • Anunciar el enlace con el CE (en este caso. Normalmente sería una red interna del cliente redistribuida. Mas sobre esto más adelante).
Una vez hecho esto, todo el tráfico que llegue a un PE con destino la red anunciada por el otro PE se enrutará a través de MPLS.
Estrictamente hablando no es necesario configurar BGP en los P, con que exista en los PE es suficiente ya que son los únicos que necesitan saber llegar al otro extremo, los P se limitan a intercambiar etiquetas, pero puede ser útil que también participen por dos razones:
  • Si también son o pueden ser en un futuro, PEs. En este caso, incluso si es en un futuro, merece la pena tener configurado el iBGP –recordemos que tiene que ser un full mesh entre todos los equipos para ahorrarnos configuraciones posteriores.
  • Para facilitar la depuración.
Este segundo caso no afecta a los clientes o usuarios pero si a los ingenieros de soporte. Observemos el traceroute desde un CE a una IP del CE del otro extremo en dos situaciones distintas. En la primera los P también tienen configurado iBGP:
root@R1> traceroute 10.10.10.1 routing-instance hostB    
traceroute to 10.10.10.1 (10.10.10.1), 30 hops max, 40 byte packets
 1  10.20.10.2 (10.20.10.2)  0.822 ms  0.729 ms  0.491 ms
 2  10.60.10.2 (10.60.10.2)  1.110 ms  1.023 ms  0.886 ms
     MPLS Label=1000001 CoS=0 TTL=1 S=1
 3  10.70.10.2 (10.70.10.2)  1.363 ms  1.445 ms  1.273 ms
     MPLS Label=1000002 CoS=0 TTL=1 S=1
 4  10.80.10.1 (10.80.10.1)  2.524 ms  2.102 ms  2.064 ms
     MPLS Label=1000003 CoS=0 TTL=1 S=1
 5  10.30.10.1 (10.30.10.1)  2.286 ms  3.548 ms  2.486 ms
 6  10.10.10.1 (10.10.10.1)  3.076 ms  3.417 ms  2.475 ms
Puede verse cada uno de los saltos, como en un traceroute normal, y en el caso de los nodos que reciben el paquete MPLS (R5, R6, R4), la etiqueta MPLS con la que lo recibe.
La segunda situación es cuando los P no tienen iBGP configurado, sólo los PE:
root@R1> traceroute 10.10.10.1 routing-instance hostB    
traceroute to 10.10.10.1 (10.10.10.1), 30 hops max, 40 byte packets
 1  10.20.10.2 (10.20.10.2)  0.862 ms  0.771 ms  0.551 ms
 2  * * *
 3  * * *
 4  * * *
 5  10.30.10.1 (10.30.10.1)  3.471 ms  2.451 ms  2.331 ms
 6  10.10.10.1 (10.10.10.1)  2.625 ms  2.895 ms  2.741 ms
Se puede ver que sólo se muestran los saltos de PE y CE. Los C aparecen como inalcanzables.
En realidad el paquete llega a ellos encapsulado en MPLS y se encamina bien a su destino, el problema es que para poder enviar la información devuelta al traceroute (en realidad lo que hace el programa es enviar un paquete al destino correcto pero con el TTL reducido para que cada nodo intermedio devuelva un mensaje de error y así poder obtener su IP) los nodos P extraen el paquete IP de dentro del MPLS e intentan devolver el mensaje de error al origen.
Observemos que sucede con las rutas a los CE si no tenemos iBGP configurado en los nodos P:

root@R5> show route 10.10.10.0 

root@R5>
En cambio si tenemos configurado iBGP:

root@R5> show route 10.10.10.0 

inet.0: 14 destinations, 14 routes (14 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

10.10.10.0/24      *[BGP/170] 00:00:21, localpref 100, from 10.0.0.2
                      AS path: I
                    > to 10.70.10.2 via em0.7
Un detalle importante es que el camino desde los P al CE no va por MPLS (a menos que el P sea también PE). Por tanto la respuesta con el mensaje de error para traceroute irá en IP.
Configuración
Las configuraciones BGP son las siguientes
R2
interfaces {
    lo0 {                               
        unit 0 {
            family inet {
                address 10.0.0.2/32;
            }
        }
    }
}
routing-options {
    router-id 10.0.0.2;
    autonomous-system 65000;
}
protocols {
    bgp {                               
        family inet {
            unicast;
        }
        group core {
            type internal;
            local-address 10.0.0.2;
            export [ next-hop-self exporta-enlace ];
            neighbor 10.0.0.3;
            neighbor 10.0.0.4;
            neighbor 10.0.0.5;
            neighbor 10.0.0.6;
        }
    }
}
policy-options {
    prefix-list enlace {
        10.10.10.0/24;                  
    }
    policy-statement exporta-enlace {
        from {
            protocol direct;
            prefix-list enlace;
        }
        then accept;
    }
    policy-statement next-hop-self {
        then {
            next-hop self;
        }
    }
}
Se puede ver que en routing-options se configura el router-id como la dirección de loopback y el número del AS, que tiene que ser el mismo para todos los PE y P.
En policy-options se configura una policy next-hop-self que como su nombre indica fuerza al router a enviar todas las rutas colocándose a el mismo como next hop.
Además en el caso de estos PE se crea una policy exporta-enlace que envía por iBGP la red del enlace con el CE. En una situación real suele ser una red redistribuida de forma dinámica por el cliente.
La configuración en los P es muy similar pero no se exporta ningún prefijo. En el otro PE la configuración es muy similar a este.
R4
interfaces {
    lo0 {
        unit 0 {
            family inet {
                address 10.0.0.4/32;
            }
        }
    }
}
routing-options {
    router-id 10.0.0.4;
    autonomous-system 65000;
}
protocols {
    bgp {
        family inet {
            unicast;
        }
        group core {
            type internal;
            local-address 10.0.0.4;
            export next-hop-self;
            neighbor 10.0.0.2;
            neighbor 10.0.0.3;
            neighbor 10.0.0.5;
            neighbor 10.0.0.6;
        }
    }                                   
}
policy-options {
    policy-statement next-hop-self {
        then {
            next-hop self;
        }
    }
}
R6
interfaces {
    lo0 {
        unit 0 {
            family inet {
                address 10.0.0.6/32;
            }
        }                               
    }
}
routing-options {
    router-id 10.0.0.6;
    autonomous-system 65000;
}
protocols {
    bgp {
        family inet {
            unicast;
        }
        group core {
            type internal;
            local-address 10.0.0.6;
            export next-hop-self;
            neighbor 10.0.0.2;
            neighbor 10.0.0.3;
            neighbor 10.0.0.4;
            neighbor 10.0.0.5;
        }
    }
policy-options {                        
    policy-statement next-hop-self {
        then {
            next-hop self;
        }
    }
}
R5
interfaces {
    lo0 {
        unit 0 {
            family inet {
                address 10.0.0.5/32;
            }
        }
    }
}
routing-options {
    router-id 10.0.0.5;
    autonomous-system 65000;
}
protocols {
    bgp {
        family inet {
            unicast;
        }
        group core {
            type internal;
            local-address 10.0.0.5;
            export next-hop-self;
            neighbor 10.0.0.2;          
            neighbor 10.0.0.3;
            neighbor 10.0.0.4;
            neighbor 10.0.0.6;
        }
    }
}
policy-options {
    policy-statement next-hop-self {
        then {
            next-hop self;
        }
    }
}
R3
interfaces {
    lo0 {
        unit 0 {
            family inet {
                address 10.0.0.3/32;
            }
        }
    }
}
routing-options {
    router-id 10.0.0.3;
    autonomous-system 65000;
}
protocols {
    bgp {
        family inet {
            unicast;
        }
        group core {
            type internal;
            local-address 10.0.0.3;
            export [ next-hop-self exporta-enlace ];
            neighbor 10.0.0.4;
            neighbor 10.0.0.5;
            neighbor 10.0.0.6;
            neighbor 10.0.0.2;
        }
    }
    }
}                                       
policy-options {
    prefix-list enlace {
        10.20.10.0/24;
    }
    policy-statement exporta-enlace {
        from {
            protocol direct;
            prefix-list enlace;
        }
        then accept;
    }
    policy-statement next-hop-self {
        then {
            next-hop self;
        }
    }


}

miércoles, 26 de marzo de 2014

Verificación de LSP

Después de la entrada anterior que explica como crear un camino LSP estático, hay que comprobar que efectivamente está creado.
Se puede ver que el camino está creado examinando la tabla de rutas de cada equipo. 
  • En los emisores (ingress) la tabla a consultar es inet.3, que es la que asocia el prefijo de destino (la loopback del nodo remoto) con la etiqueta a usar en la encapsulación.
  • En los receiver no se puede ver el camino ya que al usar PHP el paquete ya les llega desencapsulado.
  • En los P sólo se hace una conmutación de etiquetas y la tabla que almacena esta información es mpls.0
A continuación se muestran las dos tablas para todos los equipos R2-R4-R6-R5-R3
root@R2> show route table inet.3    

inet.3: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

10.0.0.3/32        *[MPLS/6/1] 03:48:39, metric 0
                    > to 10.30.10.2 via em1.4, Push 1000011

root@R2> show route table mpls.0    

mpls.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

0                  *[MPLS/0] 03:48:59, metric 1
                      Receive
1                  *[MPLS/0] 03:48:59, metric 1
                      Receive
2                  *[MPLS/0] 03:48:59, metric 1
                      Receive

root@R4> show route table inet.3 

root@R4> show route table mpls.0 

mpls.0: 6 destinations, 6 routes (6 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

0                  *[MPLS/0] 03:37:05, metric 1
                      Receive
1                  *[MPLS/0] 03:37:05, metric 1
                      Receive
2                  *[MPLS/0] 03:37:05, metric 1
                      Receive
1000003            *[MPLS/6] 01:27:14, metric 1
                    > to 10.30.10.1 via em1.4, Pop      
1000003(S=0)       *[MPLS/6] 01:27:14, metric 1
                    > to 10.30.10.1 via em1.4, Pop      
1000011            *[MPLS/6] 01:27:14, metric 1
                    > to 10.80.10.2 via em3.8, Swap 1000012

root@R6> show route table inet.3 

root@R6> show route table mpls.0 

mpls.0: 5 destinations, 5 routes (5 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

0                  *[MPLS/0] 03:29:58, metric 1
                      Receive
1                  *[MPLS/0] 03:29:58, metric 1
                      Receive
2                  *[MPLS/0] 03:29:58, metric 1
                      Receive
1000002            *[MPLS/6] 01:16:11, metric 1
                    > to 10.80.10.1 via em1.8, Swap 1000003
1000012            *[MPLS/6] 01:16:11, metric 1
                    > to 10.70.10.1 via em0.7, Swap 1000013

root@R5> show route table inet.3 

root@R5> show route table mpls.0 

mpls.0: 6 destinations, 6 routes (6 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

0                  *[MPLS/0] 03:35:04, metric 1
                      Receive
1                  *[MPLS/0] 03:35:04, metric 1
                      Receive
2                  *[MPLS/0] 03:35:04, metric 1
                      Receive
1000001            *[MPLS/6] 01:13:18, metric 1
                    > to 10.70.10.2 via em0.7, Swap 1000002
1000013            *[MPLS/6] 01:13:18, metric 1
                    > to 10.60.10.1 via em1.6, Pop      
1000013(S=0)       *[MPLS/6] 01:13:18, metric 1
                    > to 10.60.10.1 via em1.6, Pop   

root@RE3> show route table inet.3 

inet.3: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

10.0.0.2/32        *[MPLS/6/1] 01:44:37, metric 0
                    > to 10.60.10.2 via em3.6, Push 1000001

root@RE3> show route table mpls.0 

mpls.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

0                  *[MPLS/0] 03:45:43, metric 1
                      Receive
1                  *[MPLS/0] 03:45:43, metric 1
                      Receive
2                  *[MPLS/0] 03:45:43, metric 1
                      Receive

El problema es que la tabla de rutas inet.3 no se usa normalmente para el routing y si examinamos la ruta al extremo opuesto se prefiere la obtenida por OSPF que está en la tabla inet.0:

root@R2> show route 10.0.0.3                         

inet.0: 16 destinations, 16 routes (16 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

10.0.0.3/32        *[OSPF/10] 01:27:43, metric 4
                    > to 10.30.10.2 via em1.4

inet.3: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

10.0.0.3/32        *[MPLS/6/1] 04:07:17, metric 0
                    > to 10.30.10.2 via em1.4, Push 1000011

Rutas globales sobre MPLS con LSP estáticos

Idea: Intercambiar rutas entre dos PE usando un core de P MPLS. Es decir, sin usar VPN (i.e. VRF) lograr que un enlace en un PE (R2 en el esquema siguiente) se vea por iBGP en el otro PE (R3) y viceversa. De esta forma dos CE conectados a RE2 y RE3 podrían hacerse ping a través de la red MPLS.  
Los caminos los voy a construir estáticos, es decir sin usar ningún protocolo dinámico de distribución de etiquetas MPLS (LDP o RSVP). Los caminos estáticos no son útiles en la realidad, pero en este caso sirven para aprender el funcionamiento básico de MPLS.
Esquema
El esquema de red que uso es el siguiente (con los nombres de las interfaces):
NewImage
  • R1 hace de CE con dos routing-instance de tipo virtual router: HostA y HostB. De esta forma puedo hacer Ping de la IP de em0 (10.10.10.1) a la de em1 (10.20.10.2) sin que vaya internamente por el mismo router.
  • R2 y R3 hacen de PE.
  • R4,R5 y R6 hacen de P. 
  • Como protocolo IGP (para distribución de IP de enlaces y de loopbacks) entre los P y los PE uso OSPF, un sólo area 0. 
  • Se configuran todos los enlaces, pero el enlace entre R3 y R4 (a traves de em0) no se va a configurar para MPLS. Por tanto el path LSP será: R3-R5-R6-R4-R2 y en sentido contrario (los LSP son unidireccionales y por tanto hay que construir dos): R2-R4-R6-R5-R3.
  • Las etiquetas en sentido R3 hacia R2 serán 1000001 1000002 1000003 y 3 (implicit null)
  • Las etiquetas en sentido R2 hacia R3 serán 1000011 1000012 1000013 y 3
Configuración CEs
La configuración de R1 haciendo de CE es la siguiente. En amarillo la parte especifica que actúa de CE1 y en verde la parte que actúa de CE2:
system {
    host-name R1;
    root-authentication {
        encrypted-password "$1$oPJYnaoh$ZyJ/ieC.lgVLoAoA3.zPD."; ## SECRET-DATA
    }
    services {
        telnet;
    }
    syslog {
        user * {
            any emergency;
        }
        file messages {
            any notice;
            authorization info;
        }
        file interactive-commands {
            interactive-commands any;
        }
    }
}
interfaces {                            
    em0 {
        vlan-tagging;
        unit 1 {
            vlan-id 1001;
            family inet {
                address 10.10.10.1/24;
            }
        }
    }
    em1 {
        vlan-tagging;
        unit 3 {
            vlan-id 3;
            family inet {
                address 10.20.10.1/24;
            }
        }
    }
}
routing-instances {
    hostA {
        instance-type virtual-router;
        interface em0.1;                
        routing-options {
            static {
                route 10.20.10.0/24 next-hop 10.10.10.2;
            }
        }
    }
    hostB {
        instance-type virtual-router;
        interface em1.3;
        routing-options {
            static {
                route 10.10.10.0/24 next-hop 10.20.10.2;
            }
        }
    }
}
Configuración PEs
A continuación se incluye la configuración de los dos equipos que hacen de PE: R2 y R3:
system {
    host-name R2;
    root-authentication {
        encrypted-password "$1$Jw.0VZSP$sxkITUBlphlWJTq3pdRTP."; ## SECRET-DATA
    }
    syslog {
        user * {
            any emergency;
        }
        file messages {
            any notice;
            authorization info;
        }
        file interactive-commands {
            interactive-commands any;
        }
    }
}
interfaces {
    em0 {
        vlan-tagging;
        unit 1 {                        
            vlan-id 1001;
            family inet {
                address 10.10.10.2/24;
            }
        }
        unit 2 {
            vlan-id 1002;
            family inet {
                address 10.10.20.2/24;
            }
        }
    }
    em1 {
        vlan-tagging;
        unit 4 {
            vlan-id 4;
            family inet {
                address 10.30.10.1/24;
            }
            family mpls;
        }
    }
    lo0 {                               
        unit 0 {
            family inet {
                address 10.0.0.2/32;
            }
        }
    }
}
routing-options {
    router-id 10.0.0.2;
    autonomous-system 65000;
}
protocols {
    mpls {
        static-label-switched-path vuelta {
            ingress {
                next-hop 10.30.10.2;
                to 10.0.0.3;
                push 1000011;
            }
        }                               
        interface em1.4;
    }
    bgp {
        family inet {
            unicast;
        }
        group core {
            type internal;
            local-address 10.0.0.2;
            export [ next-hop-self exporta-enlace ];
            neighbor 10.0.0.3;
            neighbor 10.0.0.4;
            neighbor 10.0.0.5;
            neighbor 10.0.0.6;
        }
    }
    ospf {
        area 0.0.0.0 {
            interface lo0.0;
            interface em1.4;
        }
    }
}                                       
policy-options {
    prefix-list enlace {
        10.10.10.0/24;
    }
    policy-statement exporta-enlace {
        from {
            protocol direct;
            prefix-list enlace;
        }
        then accept;
    }
    policy-statement next-hop-self {
        then {
            next-hop self;
        }
    }
}
En R2 se puede ver que en el protocolo MPLS se configura el inicio (ingress) del LSP estático asignando al tráfico destinado a 10.0.0.3 (loopback de R3) la etiqueta 1000011.
system {
    host-name R3;
    root-authentication {
        encrypted-password "$1$OoS84Uxm$GWMoPyU1oZjfAmj3i4n1O0"; ## SECRET-DATA
    }
    syslog {
        user * {
            any emergency;
        }
        file messages {
            any notice;
            authorization info;
        }
        file interactive-commands {
            interactive-commands any;
        }
    }
}
interfaces {
    em0 {
        vlan-tagging;
        unit 5 {
            vlan-id 5;                  
            family inet {
                address 10.50.10.1/24;
            }
        }
    }
    em1 {
        vlan-tagging;
        unit 3 {
            vlan-id 3;
            family inet {
                address 10.20.10.2/24;
            }
        }
    }
    em3 {
        vlan-tagging;
        unit 6 {
            vlan-id 6;
            family inet {
                address 10.60.10.1/24;
            }
            family mpls;
        }                               
    }
    lo0 {
        unit 0 {
            family inet {
                address 10.0.0.3/32;
            }
        }
    }
}
routing-options {
    router-id 10.0.0.3;
    autonomous-system 65000;
}
protocols {
    mpls {
        static-label-switched-path ida {
            ingress {
                next-hop 10.60.10.2;
                to 10.0.0.2;
                push 1000001;
            }
        }
        interface em3.6;                
    }
    bgp {
        family inet {
            unicast;
        }
        group core {
            type internal;
            local-address 10.0.0.3;
            export [ next-hop-self exporta-enlace ];
            neighbor 10.0.0.4;
            neighbor 10.0.0.5;
            neighbor 10.0.0.6;
            neighbor 10.0.0.2;
        }
    }
    ospf {
        area 0.0.0.0 {
            interface em3.6;
            interface lo0.0;
        }
    }
}
policy-options {                        
    prefix-list enlace {
        10.20.10.0/24;
    }
    policy-statement exporta-enlace {
        from {
            protocol direct;
            prefix-list enlace;
        }
        then accept;
    }
    policy-statement next-hop-self {
        then {
            next-hop self;
        }
    }
}
En R3 se puede ver que en el protocolo MPLS se configura el inicio (ingress) del LSP estático asignando al tráfico destinado a 10.0.0.2 (loopback de R2) la etiqueta 1000001.
Configuración Ps
A continuación se muestra las configuraciones de los P intermedios: R4, R5 y R6. El punto interesante es ver su configuración MPLS con los dos LSP de tránsito estáticos en ambos sentidos.
R4:
system {
    host-name R4;
    root-authentication {
        encrypted-password "$1$JKwti2ON$snLuu43gBIzZH.vyxRyzD/"; ## SECRET-DATA
    }
    syslog {
        user * {
            any emergency;
        }
        file messages {
            any notice;
            authorization info;
        }
        file interactive-commands {
            interactive-commands any;
        }
    }
}
interfaces {
    em0 {
        vlan-tagging;
        unit 5 {                        
            vlan-id 5;
            family inet {
                address 10.50.10.2/24;
            }
        }
    }
    em1 {
        vlan-tagging;
        unit 4 {
            vlan-id 4;
            family inet {
                address 10.30.10.2/24;
            }
            family mpls;
        }
    }
    em3 {
        vlan-tagging;
        unit 8 {
            vlan-id 8;
            family inet {
                address 10.80.10.1/24;
            }                           
            family mpls;
        }
    }
    lo0 {
        unit 0 {
            family inet {
                address 10.0.0.4/32;
            }
        }
    }
}
routing-options {
    router-id 10.0.0.4;
    autonomous-system 65000;
}
protocols {
    mpls {
        static-label-switched-path vuelta {
            transit 1000011 {
                next-hop 10.80.10.2;
                swap 1000012;
            }
        }                               
        static-label-switched-path ida {
            transit 1000003 {
                next-hop 10.30.10.1;
                pop;
            }
        }
        interface em3.8;
        interface em1.4;
    }
    bgp {
        family inet {
            unicast;
        }
        group core {
            type internal;
            inactive: traceoptions {
                file debug-bgp;
                flag all;
            }
            local-address 10.0.0.4;
            export next-hop-self;
            neighbor 10.0.0.2;
            neighbor 10.0.0.3;          
            neighbor 10.0.0.5;
            neighbor 10.0.0.6;
        }
    }
    ospf {
        area 0.0.0.0 {
            interface em3.8;
            interface lo0.0;
            interface em1.4;
        }
    }
}
policy-options {
    policy-statement next-hop-self {
        then {
            next-hop self;
        }
    }
}
R5:
system {
    host-name R5;
    root-authentication {
        encrypted-password "$1$4rV9KNix$PEJ57sdvRJaDYO68Q3fwY/"; ## SECRET-DATA
    }
    login {
        user admin {
            uid 2001;
            class super-user;
            authentication {
                encrypted-password "$1$bOmy6GLa$/OVBkd3768bHuSfXXb1/K1"; ## SECRET-DATA
            }
        }
    }
    services {
        ftp;
        ssh;
    }
    syslog {
        user * {
            any emergency;              
        }
        file messages {
            any notice;
            authorization info;
        }
        file interactive-commands {
            interactive-commands any;
        }
    }
}
interfaces {
    em0 {
        vlan-tagging;
        unit 7 {
            vlan-id 7;
            family inet {
                address 10.70.10.1/24;
            }
            family mpls;
        }
    }
    em1 {
        vlan-tagging;
        unit 6 {
            vlan-id 6;
            family inet {
                address 10.60.10.2/24;
            }
            family mpls;
        }
    }
    lo0 {
        unit 0 {
            family inet {
                address 10.0.0.5/32;
            }
        }
    }
}
routing-options {
    router-id 10.0.0.5;
    autonomous-system 65000;
}
protocols {
    mpls {
        static-label-switched-path ida {
            transit 1000001 {
                next-hop 10.70.10.2;
                swap 1000002;
            }
        }
        static-label-switched-path vuelta {
            transit 1000013 {
                next-hop 10.60.10.1;
                pop;
            }
        }
        interface em1.6;
        interface em0.7;
    }
    bgp {
        traceoptions {                  
            file debugbgp size 10000000 files 10;
            flag open;
            flag all;
        }
        family inet {
            unicast;
        }
        group core {
            type internal;
            local-address 10.0.0.5;
            export next-hop-self;
            neighbor 10.0.0.2;
            neighbor 10.0.0.3;
            neighbor 10.0.0.4;
            neighbor 10.0.0.6;
        }
    }
    ospf {
        area 0.0.0.0 {
            interface em1.6;
            interface em0.7;
            interface lo0.0;
        }
    }
}
policy-options {                        
    policy-statement next-hop-self {
        then {
            next-hop self;
        }                               
    }
}
R6:
system {
    host-name R6;
    root-authentication {
        encrypted-password "$1$JQvXoNBw$J745YCkT0YjAGM5nbTQQD0"; ## SECRET-DATA
    }
    syslog {
        user * {
            any emergency;
        }
        file messages {
            any notice;
            authorization info;
        }
        file interactive-commands {
            interactive-commands any;
        }
    }
}
interfaces {
    em0 {
        vlan-tagging;
        unit 7 {                        
            vlan-id 7;
            family inet {
                address 10.70.10.2/24;
            }
            family mpls;
        }
    }
    em1 {
        vlan-tagging;
        unit 8 {
            vlan-id 8;
            family inet {
                address 10.80.10.2/24;
            }
            family mpls;
        }
    }
    lo0 {
        unit 0 {
            family inet {
                address 10.0.0.6/32;
            }
        }                               
    }
}
routing-options {
    router-id 10.0.0.6;
    autonomous-system 65000;
}
protocols {
    mpls {
        static-label-switched-path ida {
            transit 1000002 {
                next-hop 10.80.10.1;
                swap 1000003;
            }
        }
        static-label-switched-path vuelta {
            transit 1000012 {
                next-hop 10.70.10.1;
                swap 1000013;
            }
        }                               
        interface em1.8;
        interface em0.7;
    }
    bgp {
        family inet {
            unicast;
        }
        group core {
            type internal;
            local-address 10.0.0.6;
            export next-hop-self;
            neighbor 10.0.0.2;          
            neighbor 10.0.0.3;
            neighbor 10.0.0.4;
            neighbor 10.0.0.5;
        }
    }
    ospf {
        area 0.0.0.0 {
            interface em0.7;
            interface em1.8;
            interface lo0.0;
        }
    }
}
policy-options {
    policy-statement next-hop-self {
        then {
            next-hop self;              
        }
    }
}
LSP de R2 a R3
El LSP estático de R2 a R3 se construye añadiendo el protocolo MPLS a las interfaces que se usan y con la instrucción static-label-switched-path dentro del protocolo MPLS. A continuación se muestra la configuración correspondiente en los cinco routers. Se observa que en R3 no se define conmutación de etiqueta estática ya que al usar PHP, en R5 se quita la etiqueta del paquete que llega como IP a R3.
interfaces {
    em1 {
        vlan-tagging;
        unit 4 {
            family mpls;
        }
    }
...
protocols {
    mpls {
        static-label-switched-path vuelta {
            ingress {
                next-hop 10.30.10.2;
                to 10.0.0.3;
                push 1000011;
            }
        }
        interface em1.4;
    }

interfaces {
    em0 {
        vlan-tagging;
        unit 5 {                        
            vlan-id 5;
            family inet {
                address 10.50.10.2/24;
            }
        }
    }
    em1 {
        vlan-tagging;
        unit 4 {
            vlan-id 4;
            family mpls;
        }
    }
    em3 {
        vlan-tagging;
        unit 8 {
            vlan-id 8;
            family mpls;                
        }                               
    }
...
protocols {                             
    mpls {                              
        static-label-switched-path vuelta {
            transit 1000011 {           
                next-hop 10.80.10.2;    
                swap 1000012;           
            }                           
        }                               
        interface em3.8;                
        interface em1.4;                
    }                                   

interfaces {
    em0 {
        vlan-tagging;
        unit 7 {                        
            vlan-id 7;
            family mpls;
        }
    }
    em1 {
        vlan-tagging;
        unit 8 {
            vlan-id 8;
            family mpls;
        }
    }
}
...
protocols {                             
    mpls {                              
        static-label-switched-path vuelta {
            transit 1000012 {           
                next-hop 10.70.10.1;    
                swap 1000013;           
            }                           
        }                               
        interface em1.8;                
        interface em0.7;                
    }                                   

interfaces {
    em0 {
        vlan-tagging;
        unit 7 {
            vlan-id 7;
            family mpls;
        }
    }
    em1 {
        vlan-tagging;                   
        unit 6 {
            vlan-id 6;
            family mpls;
        }
    }
}
...
protocols {
    mpls {
        static-label-switched-path vuelta {
            transit 1000013 {
                next-hop 10.60.10.1;
                pop;
            }
        }
        interface em1.6;
        interface em0.7;
    }

interfaces {
    em3 {
        vlan-tagging;
        unit 6 {
            vlan-id 6;
            family mpls;                
        }
    }
}
...
protocols {
    mpls {
        interface em3.6;                
    }                                   

LSP de R3 a R2
La construcción de este LSP, llamado ida, es muy similar al anterior y la configuración de los interfaces es la misma, por lo que aquí sólo se muestra la creación del LSP estático asumiendo que los interfaces están configurados. En este caso se empieza desde R3:
protocols {
    mpls {
        static-label-switched-path ida {
            ingress {
                next-hop 10.60.10.2;
                to 10.0.0.2;
                push 1000001;
            }
        }  

protocols {
    mpls {
        static-label-switched-path ida {
            transit 1000001 {
                next-hop 10.70.10.2;
                swap 1000002;
            }
        }

protocols {                             
    mpls {                              
        static-label-switched-path ida {
            transit 1000002 {           
                next-hop 10.80.10.1;    
                swap 1000003;           
            }                           
        }



protocols {                             
    mpls {                              
        static-label-switched-path ida {
            transit 1000003 {           
                next-hop 10.30.10.1;    
                pop;                    
            }                           
        }