Le voila ce fameux Segment Routing !
Rappelons nous les limites qu'impose LDP :
- Natif v4
- Pas de Trafic Engineering
- Ajout d'un protocole supplémenentaire à MPLS pour attribution label
- Un label par FEC
- Toujours le plus court chemin en se basant sur l'IGP
- 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 :
- Prefix Segment : identifie le préfixe de destination (un label)
- Node Segment : identifie un routeur SR (un label)
- 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) ☹️☹️

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.