MPLS LDP vs SR-MPLS

Le voila ce fameux Segment Routing !

Rappelons nous les limites qu'impose LDP :

  1. Natif v4
  2. Pas de Trafic Engineering
  3. Ajout d'un protocole supplémenentaire à MPLS pour attribution label
  4. Un label par FEC
  5. Toujours le plus court chemin en se basant sur l'IGP
  6. Session UDP

Pour faire tourner un core MPLS LDP, il faut implémenter ISIS/BGP/LDP/MPLS... Trop de protocoles tue les protocoles !

Pour répondre à ces problématiques, on a inventé le Segment Routing (SR). Ce protocole répond (grosso modo) à tous les problèmes de LDP 😄

L'architecture utilisée sera celle ci :

Un peu plus grande que dans l'épisode précédent. Je voulais juste faire un petit arrêt sur l'EVPN/VXLAN avec les routes types 5 pour vous montrer que le protocole était plus qu'un simple L2 over L4.

Et petite spécificité aussi, on fera tourner le backbone dans un full core IPv6 ! Et oui, dans un full IPv6 ! ENFIN

IGP

Comme dans l'épisode précèdent, l'IGP sera de l'ISIS :

Routeur Loopback Interco Interco 2 Interco 3 Interco 4 Interco 5 Interco 6
PE1 2001::/128 2001:cafe::/127
P1 2001::1/128 2001:cafe::1/127 2001:cafe:1::1/127 2001:cafe:4::1/127
P2 2001::2/128 2001:cafe:1::/127 2001:cafe:2::/127
P3 2001::3/128 2001:cafe:4::/127 2001:cafe:6::1/127
P4 2001::4/128 2001:cafe:2::1/127 2001:cafe:6::/127 2001:cafe:3::/127
PE2 2001::5/128 2001:cafe:3::1/127

En espérant que le tableau soit compréhensible pour tout le monde... En soit, le seul truc intéressant c'est les IPv6 des loopback 😄

La conf de l'ISIS est juste là :

PE1#sh run | s isis
router isis BACKBONE
   net 49.0001.2700.0000.0000.00
   is-type level-2
   log-adjacency-changes
   advertise passive-only
   !
   address-family ipv6 unicast

Compliqué de représenter les digits des IPv6 dans le net. J'ai donc opté pour l'équivalence de 100.127.0.X.
On annonce que les IPv6 des Loopback ! Bah oui, quel est l'intérêt que PE1 sache l'interco de P4-P3 ?

interface Loopback1
   ipv6 address 2001::/128
   isis enable BACKBONE
   isis passive
PE1#sh isis neighbors

Instance  VRF      System Id        Type Interface          SNPA              State Hold time   Circuit Id
BACKBONE  default  P1               L2   Ethernet2          P2P               UP    26          18  


PE1#sh ipv6 route
 C        2001::/128 [0/0]
           via Loopback1, directly connected
 I L2     2001::1/128 [115/20]
           via fe80::5200:ff:feaf:d3f6, Ethernet2
 I L2     2001::2/128 [115/30]
           via fe80::5200:ff:feaf:d3f6, Ethernet2
 I L2     2001::3/128 [115/30]
           via fe80::5200:ff:feaf:d3f6, Ethernet2
 I L2     2001::4/128 [115/40]
           via fe80::5200:ff:feaf:d3f6, Ethernet2
 I L2     2001::5/128 [115/50]
           via fe80::5200:ff:feaf:d3f6, Ethernet2
 C        2001:cafe::/128 [0/0]
           via Ethernet2, directly connected
 C        2001:cafe::/127 [0/0]
           via Ethernet2, directly connected

L'ISIS monte bien et les routes sont bien propagées partout dans le backbone.

L'IGP ? Done. Next

Segment Routing

Je parie que vous vous dîtes que le protocole est compliqué à implémenter... Mais absolument pas !

Par contre un peu de vocabulaire 😄

Un segment représente une liste d'instruction suivie par le paquet IP pour qu'il sache par où aller et comment ils parcourent le chemin.

Et ces segments sont composés de :

  1. Prefix Segment : identifie le préfixe de destination (un label)
  2. Node Segment : identifie un routeur SR (un label)
  3. Adjaceny Segment : identifie une interco entre deux routeurs SR

Ce sont tous des Segment ID (SID).

Enfaite, il faut voir le SR comme la suite logique du SDN. On décompose chaque fonctions réseau et on l'identifie.

Le routeur PE1 connaîtra donc le Node Segment de PE2 dans une architecture Segment Routing ! A contrario du LDP où il n'aurait jamais eu la connaissance 😄 Ainsi, le paquet va pouvoir directement être acheminé directement vers le routeur de destination.

Le Segment Routing reste du MPLS : les routeurs peuvent add, pop et swap des labels.

Bon, un peu de conf quand même, et vous allez voir, c'est méga beaucoup trop simple !

La configuration du SR se fait dans l'IGP ISIS : (et on active MPLS sur le routeur)

PE1#sh run | s mpls
mpls ip
router isis BACKBONE
   segment-routing mpls
      router-id 100.127.0.0
      no shutdown

Ensuite, dans la configuration de la loopback :

PE1#sh run int lo1
interface Loopback1
   ipv6 address 2001::/128
   node-segment ipv6 index 0

C'est là qu'on vient préciser le node segment ! Attention, l'index doit toujours être différent. En effet, les labels SR commencent à partir de 900000:

PE1#sh mpls label ranges
Start     End       Size      Usage
------------------------------------------------
0         15        16        reserved
16        99999     99984     static mpls
100000    116383    16384     bgp (dynamic)
116384    132767    16384     isis (dynamic)
132768    149151    16384     bgp (dynamic)
149152    362143    212992    free (dynamic)
362144    899999    537856    unassigned
900000    965535    65536     bgp-sr
900000    965535    65536     isis-sr
965536    1031071   65536     srlb
1031072   1032095   1024      l2evpn shared ethernet-segment
1032096   1036287   4192      unassigned
1036288   1048575   12288     l2evpn

Ainsi, si l'index est 0 alors le node segment aura pour valeur 900000. Allez, on applique la configuration sur l'ensemble des nodes :

PE1#sh isis segment-routing tunnel
  Index     Endpoint        Next Hop/Tunnel Index       Interface    Labels
--------- --------------- --------------------------- -------------- ----------
  1         2001::1/128     fe80::5200:ff:feaf:d3f6     Ethernet2    [ 3 ]
  2         2001::2/128     fe80::5200:ff:feaf:d3f6     Ethernet2    [ 900002 ]
  3         2001::3/128     fe80::5200:ff:feaf:d3f6     Ethernet2    [ 900003 ]
  4         2001::4/128     fe80::5200:ff:feaf:d3f6     Ethernet2    [ 900004 ]
  5         2001::5/128     fe80::5200:ff:feaf:d3f6     Ethernet2    [ 900005 ]


PE1#sh isis segment-routing prefix-segments

System ID: PE1                  Instance: 'BACKBONE'
SR supported Data-plane: MPLS                   SR Router ID: 100.127.0.0

Node: 6      Proxy-Node: 0      Prefix: 0       Total Segments: 6

Flag Descriptions: R: Re-advertised, N: Node Segment, P: no-PHP
                   E: Explicit-NULL, V: Value, L: Local
Segment status codes: * - Self originated Prefix, L1 - level 1, L2 - level 2, ! - SR-unreachable,
                      # - Some IS-IS next-hops are SR-unreachable
   Prefix                      SID Type       Flags                        System ID       Level Protection  Algorithm
   ------------------------- ----- ---------- ---------------------------- --------------- ----- ----------- -------------
*  2001::/128                    0 Node       R:0 N:1 P:0 E:0 V:0 L:0      PE1             L2    unprotected SPF
   2001::1/128                   1 Node       R:0 N:1 P:0 E:0 V:0 L:0      P1              L2    unprotected SPF
   2001::2/128                   2 Node       R:0 N:1 P:0 E:0 V:0 L:0      P2              L2    unprotected SPF
   2001::3/128                   3 Node       R:0 N:1 P:0 E:0 V:0 L:0      P3              L2    unprotected SPF
   2001::4/128                   4 Node       R:0 N:1 P:0 E:0 V:0 L:0      P4              L2    unprotected SPF
   2001::5/128                   5 Node       R:0 N:1 P:0 E:0 V:0 L:0      PE2             L2    unprotected SPF

Pourquoi la loopback de P1 a un label de 3 ?

On ne change pas les bonnes habitudes de MPLS ! Avant dernier saut = label implicit nul !

Une autre commande :

PE1#sh mpls segment-routing bindings
2001::/128
   Local binding:  Label: imp-null
   Remote binding: Peer ID: P1, Label: 900000
2001::1/128
   Local binding:  Label: 900001
   Remote binding: Peer ID: P1, Label: imp-null
2001::2/128
   Local binding:  Label: 900002
   Remote binding: Peer ID: P1, Label: 900002
2001::3/128
   Local binding:  Label: 900003
   Remote binding: Peer ID: P1, Label: 900003
2001::4/128
   Local binding:  Label: 900004
   Remote binding: Peer ID: P1, Label: 900004
2001::5/128
   Local binding:  Label: 900005
   Remote binding: Peer ID: P1, Label: 900005

Pour les adjaceny, on s'appuye sur les link local :

PE1#sh isis segment-routing adjacency-segments

System ID: PE1                  Instance: BACKBONE
SR supported Data-plane: MPLS                   SR Router ID: 100.127.0.0
Adj-SID allocation mode: SR-adjacencies
Adj-SID allocation pool: Base: 116384     Size: 16384
Adjacency Segment Count: 1
Flag Descriptions: F: IPv6 address family, B: Backup, V: Value
                   L: Local, S: Set

Segment Status codes: L1 - Level-1 adjacency, L2 - Level-2 adjacency, P2P - Point-to-Point adjacency, LAN - Broadcast adjacency
                      ! - SR-unreachable, # - Some IS-IS next-hops are SR-unreachable

Locally Originated Adjacency Segments
         Adj IP Address Local Intf    SID SID Source               Flags   Type
----------------------- ---------- ------ ---------- ------------------- ------
fe80::5200:ff:feaf:d3f6        Et2 116390    Dynamic F:1 B:0 V:1 L:1 S:0 P2P L2

 Protection
-----------
unprotected 

PE1 n'apprendra jamais les adjency des routeurs SR. Est ce une bonne pratique ? Je ne sais pas ! Je découvre aussi SR donc à voir. C'est le but de labber !!!!

Pas encore de Prefix Segment. Ca arrive bientôt 😃 (dans la configuration des VPN dans le BGP)

Ca donne quoi dans wireshark ?

Le label est bien distribué dans un échange ISIS ! Houra, on a réussi à dégager LDP !

BGP

router bgp 65000
   router-id 100.127.0.0
   no bgp default ipv4-unicast
   bgp default ipv6-unicast
   neighbor 2001::5 remote-as 65000
   neighbor 2001::5 next-hop-self
   neighbor 2001::5 update-source Loopback1
   neighbor 2001::5 description PE1-IPv6
   neighbor 2001::5 send-community standard extended
   !
   address-family ipv4
      neighbor 2001::5 activate
      neighbor 2001::5 next-hop address-family ipv6 originate
      redistribute connected
   !
   address-family ipv6
      neighbor 2001::5 activate
      redistribute connected
   !
   address-family vpn-ipv4
      neighbor 2001::5 activate
   !
   address-family vpn-ipv6
      neighbor 2001::5 activate

Y'a quoi de compliqué ?

Tout d'abord on peer avec PE2 avec la bonne AS, on oublie le next-hop-self (bonne pratique pour l'iBGP étant donné que le next-hop ne change pas, bon OK dans notre cas il est inutile car 2 routeurs) et on oublie pas l'update source Lo1 et les envoies des communautés.

Pour l'adresse family ipv4, il faut faire un peu plus de conf (t'abuses chef, une ligne de plus. Sah ?). En effet, il faut préciser que le next hop soit une IPv6, sinon il kiffe pas trop trop le process BGP 😄

Ensuite, pour les autres, comme d'hab. On active le neighbor.

Mais que vois je ?

PE1 Bgp: %BGP-3-DROP_TXUPDATE: Dropped updates for peer 2001::5 (VRF default AS 65000) because a local Nexthop was not configured for AFI/SAFI IPv4/MplsVpn

Et oui ! VPNv4 n'accepte pas les next hop IPv6 sur Arista (en dessous la documentation officielle d'Arista) ☹️☹️

Ouvrir la photo
PE1#sh bgp summary
BGP summary information for VRF default
Router identifier 100.127.0.0, local AS number 65000
Neighbor          AS Session State AFI/SAFI                AFI/SAFI State   NLRI Rcd   NLRI Acc
-------- ----------- ------------- ----------------------- -------------- ---------- ----------
2001::5        65000 Established   IPv4 Unicast            Negotiated              1          1
2001::5        65000 Established   IPv4 MplsVpn            Negotiated              0          0
2001::5        65000 Established   IPv6 Unicast            Negotiated              4          4
2001::5        65000 Established   IPv6 MplsVpn            Negotiated              2          2 

Les peers BGP montent bien ! Même VPNv4. J'ai bien les NLRI (Network Layer Reachability Information) dans les échanges BGP mais les routes ne s'installent pas dans la table de routage. On était si près du but !

Pour vous monter, on crée une VRF NARUTO :

PE1#sh run | s NARUTO
  router bgp 65000
   vrf NARUTO
      rd 65000:65000
      route-target import vpn-ipv4 65000:65000
      route-target import vpn-ipv6 65000:65000
      route-target export vpn-ipv4 65000:65000
      route-target export vpn-ipv6 65000:65000
      redistribute connected 

Ci dessous les exemples (je n'ai pas mis les screens des IPs sur les interfaces, vous êtes suffisamment grand pour comprendre)

IPv4 GRT :

PE1#sh ip route
 C        109.205.66.127/32 [0/0]
           via Loopback5, directly connected
 B I      109.205.66.128/32 [200/0]
           via 2001::5/128, IS-IS SR tunnel index 4
              via fe80::5200:ff:feaf:d3f6, Ethernet2, label 900005

  
PE1#ping 109.205.66.128
PING 109.205.66.128 (109.205.66.128) 72(100) bytes of data.
80 bytes from 109.205.66.128: icmp_seq=1 ttl=62 time=9.71 ms
80 bytes from 109.205.66.128: icmp_seq=2 ttl=62 time=7.66 ms
80 bytes from 109.205.66.128: icmp_seq=3 ttl=62 time=6.70 ms
80 bytes from 109.205.66.128: icmp_seq=4 ttl=62 time=6.93 ms
80 bytes from 109.205.66.128: icmp_seq=5 ttl=62 time=6.88 ms

--- 109.205.66.128 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 38ms
rtt min/avg/max/mdev = 6.703/7.576/9.712/1.116 ms, ipg/ewma 9.456/8.593 ms

IPv6 GRT :

PE1#sh ipv6 route
 B I      2001:c0ca:c01a::1/128 [200/0]
           via 2001::5/128, IS-IS SR tunnel index 4
              via fe80::5200:ff:feaf:d3f6, Ethernet2, label 900005

  
PE1#ping ipv6 2001:c0ca:c01a::1
PING 2001:c0ca:c01a::1(2001:c0ca:c01a::1) 52 data bytes
60 bytes from 2001:c0ca:c01a::1: icmp_seq=1 ttl=62 time=8.54 ms
60 bytes from 2001:c0ca:c01a::1: icmp_seq=2 ttl=62 time=8.31 ms
60 bytes from 2001:c0ca:c01a::1: icmp_seq=3 ttl=62 time=6.89 ms
60 bytes from 2001:c0ca:c01a::1: icmp_seq=4 ttl=62 time=7.21 ms
60 bytes from 2001:c0ca:c01a::1: icmp_seq=5 ttl=62 time=7.56 ms

--- 2001:c0ca:c01a::1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 36ms
rtt min/avg/max/mdev = 6.886/7.700/8.535/0.632 ms, ipg/ewma 8.959/8.091 ms

VPNv4 (snif) :

PE1#sh ip route vrf NARUTO
 C        100.100.100.0/32 is directly connected, Loopback10
 C        192.168.100.0/24 is directly connected, Ethernet7.1000
 C        192.168.200.0/24 is directly connected, Ethernet7.2000

VPNv6 :

PE1#sh ipv6 route vrf NARUTO
 C        2001:cafe::/128 [0/0]
           via Loopback10, directly connected
 B I      2001:cafe::1/128 [200/0]
           via 2001::5/128, IS-IS SR tunnel index 4, label 100000
              via fe80::5200:ff:feaf:d3f6, Ethernet2, label 900005
 C        2001:dead::/64 [0/0]
           via Ethernet7.1000, directly connected
 B I      2001:dead:1::/64 [200/0]
           via 2001::5/128, IS-IS SR tunnel index 4, label 100000
              via fe80::5200:ff:feaf:d3f6, Ethernet2, label 900005

  
PE1#ping vrf NARUTO ipv6 2001:dead:1::
PING 2001:dead:1::(2001:dead:1::) 52 data bytes
60 bytes from 2001:dead:1::: icmp_seq=1 ttl=64 time=10.1 ms
60 bytes from 2001:dead:1::: icmp_seq=2 ttl=64 time=8.07 ms
60 bytes from 2001:dead:1::: icmp_seq=3 ttl=64 time=8.25 ms
60 bytes from 2001:dead:1::: icmp_seq=4 ttl=64 time=7.49 ms
60 bytes from 2001:dead:1::: icmp_seq=5 ttl=64 time=8.04 ms

--- 2001:dead:1:: ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 40ms
rtt min/avg/max/mdev = 7.491/8.397/10.135/0.905 ms, ipg/ewma 9.966/9.230 ms 

Comment est décidé le prefix segment ?

PE1#sh mpls lfib route bgp
MPLS forwarding table (Label [metric] Vias) - 2 routes
MPLS next-hop resolution allow default route: False
Via Type Codes:
          M - MPLS via, P - Pseudowire via,
          I - IP lookup via, V - VLAN via,
          VA - EVPN VLAN aware via, ES - EVPN ethernet segment via,
          VF - EVPN VLAN flood via, AF - EVPN VLAN aware flood via,
          NG - Nexthop group via
Source Codes:
          G - gRIBI, S - Static MPLS route,
          B2 - BGP L2 EVPN, B3 - BGP L3 VPN,
          R - RSVP, LP - LDP pseudowire,
          L - LDP, M - MLDP,
          I>BL - IS-IS SR to BGP LU, IP - IS-IS SR prefix segment,
          IA - IS-IS SR adjacency segment, I>L - IS-IS SR to LDP,
          L>I - LDP to IS-IS SR, BL - BGP LU,
          BL>L - BGP LU to LDP, L>BL - LDP to BGP LU,
          ST - SR TE policy, SMP - SR P2MP,
          BL>I - BGP LU to IS-IS SR, DE - Debug LFIB

 B3    100000   [0]
                via I, ipv4, vrf NARUTO
 B3    100001   [0]
                via I, ipv6, vrf NARUTO

Dans wireshark, on voit bien les labels !

Bon allez un petit ping quand même ?

Pourquoi on voit que des reply ? (je suis sur l'interface eth1 de P2)

A cause (ou grâce) au multipath de l'ISIS. Et oui, encore un avantage de Segment Routing !

Bon OK dans notre cas, ca fait du routage asymétrique lol mais c'est pour monter tqt (j'avais déjà anticipé ça tqt tqt chef).

Les labels sont posés avant l'entête IPv6 :

Le premier label correspond au node segment de PE1 et le deuxième à celui de la VRF !

Les reply arrivent sur un autre segment dans le backbone :

Sur le chemin du retour, le label est de 10000 car :

PE2#sh mpls lfib route bgp
MPLS forwarding table (Label [metric] Vias) - 2 routes
MPLS next-hop resolution allow default route: False
Via Type Codes:
          M - MPLS via, P - Pseudowire via,
          I - IP lookup via, V - VLAN via,
          VA - EVPN VLAN aware via, ES - EVPN ethernet segment via,
          VF - EVPN VLAN flood via, AF - EVPN VLAN aware flood via,
          NG - Nexthop group via
Source Codes:
          G - gRIBI, S - Static MPLS route,
          B2 - BGP L2 EVPN, B3 - BGP L3 VPN,
          R - RSVP, LP - LDP pseudowire,
          L - LDP, M - MLDP,
          I>BL - IS-IS SR to BGP LU, IP - IS-IS SR prefix segment,
          IA - IS-IS SR adjacency segment, I>L - IS-IS SR to LDP,
          L>I - LDP to IS-IS SR, BL - BGP LU,
          BL>L - BGP LU to LDP, L>BL - LDP to BGP LU,
          ST - SR TE policy, SMP - SR P2MP,
          BL>I - BGP LU to IS-IS SR, DE - Debug LFIB

 B3    100000   [0]
                via I, ipv6, vrf NARUTO
 B3    100001   [0]
                via I, ipv4, vrf NARUTO

Le label de la VRF NARUTO pour l'IPv6 est de 100000 !

Conclusion

Notre mission est presque finie : un backbone full core IPv6.

On a presque réussi à trouver une alternative de LDP mais il manque encore un truc : les échanges des routes IPv4 des L3VPN à travers le peering BGP v6.

Attention ! Il n'y aurait eu aucun problème si peering v4 pour annoncer des routes IPv6 dans des L3VPN !

Une autre problématique est : comment faire des L2VPN ?

Encore du VPLS ? Oh bah nan chef ? T'as oublié un truc là ?

Bah oui l'EVPN !

Cette extension BGP trop stylée qui permet de faire du L2 et du L3.

Et oui ! On va faire de l'EVPN dans le prochain épisode et spoiler : ca résout le problème des échanges de routes IPv4 des L3VPN. Bah oui, on utilise plus vpnv4 lol !

Avant de finir : je n'exploite pas toutes les capacités de segment routing et j'en suis bien conscient. D'ailleurs, je n'aurai très probablement jamais l'opportunité de pousser le protocole à 100%. Il faudrait avoir un grand backbone qui s'étend sur plusieurs milliers de km voir sur des pays entiers ! Chose que je n'aurai jamais de ma vie de pauvre administrateur réseau hahaha 😃😃😃

Je termine sur un mot de fin : Ces terroristes sionistes ont bombardé une école transformé en refuge. Des humains ont péri brulé vif . Un gamin était en train de pleurer toutes les larmes de son corps dans la vidéo. Qui pourrait lui en avoir s'il rejoint les rangs du Hamas plus tard ?

La définition d'un génocide d'après Larousse :

  • Crime contre l'humanité tendant à la destruction totale ou partielle d'un groupe national, ethnique, racial ou religieux ; sont qualifiés de génocide les atteintes volontaires à la vie, à l'intégrité physique ou psychique, la soumission à des conditions d'existence mettant en péril la vie du groupe, les entraves aux naissances et les transferts forcés d'enfants qui visent à un tel but.

Les terroristes sionistes ont aussi attaqué les casques bleus positionnés au Liban.

It is not a war but a genocide.