Une route directement connectée possède une distance de 0 et donc la plus grande priorité.
Impossible de faire mieux ? Pas pour nous ! Voici trois astuces tactiques pour qu’un routeur puisse n’utiliser son interface connectée qu’en cas de backup – astuces 100% garanties sans tunneling, scripting, translation d’adresse ou magie noire !
Pourquoi éviter ce routage implicite ?
Notre use case est le remplacement d’un routeur par un firewall, pour arriver à la topologie suivante (topologie Christophe™) :
En nominal, le flux en provenance du LAN passe par le FW, le lien rocade, le CE puis le MPLS opérateur. En backup, on utilise un lien IPSec établi par le FW vers le DC client. Le routage direct par le CE opérateur est utilisé en dernier recours (sur perte du firewall ou coupure de sa patte LAN), grâce à une dérogation donnée par l’équipe sécurité.
La difficulté de cette architecture consiste à rendre le chemin de flux nominal symétrique pour s’assurer que le Firewall autorise correctement le trafic. Ou en d’autres termes, à court-circuiter, pour les flux MPLS vers LAN, la route implicite du LAN sur le CE opérateur.
Il n’est bien sûr pas question de demander à l’opérateur de créer un tunnel entre le PE MPLS et le Firewall, et nous allons donc seulement lui demander de configurer le CE opérateur pour rendre le flux symétrique avec l’adressage et le peering BGP suivant :
A supposer que le CE est un routeur d’un équipementier courant (Cisco, Juniper, …), je vous propose 3 méthodes pour que les routes en provenance du PE à destination du LAN soit routées sur la rocade plutôt que par l’interface LAN du routeur, sans recours à des procédés externes tels que translation d’adresse, tracking ou scripting (EEM).
Les plus courageux peuvent arrêter la lecture de cet article ici et prendre cet exercice comme devoir de vacances. Bien sûr, tout procédé auquel je n’ai pas pensé est le bienvenu dans les commentaires.
Spoiler : les procédés utilisés
Je vois 3 moyens de battre une interface connected :
- Le subnetting
- La virtualisation
- Le passage par le niveau 2
Procédé 1 : Le subnetting
Avant de comparer la distance entre plusieurs routes, IP recherche la route avec le masque le plus fin. Ainsi, créer 2 routes en /25 vers la rocade permet d’être plus précis que la route /24 directly connected.
Toutefois cette astuce, seule, n’est pas suffisante, car nous ne savons pas détecter simplement la perte de la panne LAN du firewall. Il faut aller un peu plus loin et utiliser l’entrée BGP émise par le Firewall correspondant à cette route LAN.
Cette fonction existe dans BGP sous le nom de BGP Conditional Advertisement chez Cisco comme chez Juniper. On prendra également la précaution de tagger les routes plus spécifiques avec la communauté BGP no-advertise pour que ces 2 routes fines restent locales au CE.
Procédé 2 : La virtualisation
Pour raisonner comme monsieur de la Palice, un bon moyen de résoudre notre problème de route directly connected est de sortir l’interface de la table de routage. Par exemple, en créant une VRF dans laquelle on place l’interface LAN et en la connectant via une rocade interface (interface VASI ou interface de service) à la table de routage globale.
On arrive à l’architecture suivante :
Il suffit que la route provenant de la VRF soit émise avec une local preference minimale pour que la configuration soit conforme à nos requirements.
Procédé 3 : Utilisation du niveau 2
On peut également résoudre un problème de niveau N par les niveaux inférieurs. Ici, vu que nous nous sommes interdit une modification physique, seul le niveau 2 peut nous être utile.
Pour utiliser le niveau 2, il faut ramener le PE, le CE et le FW sur un même LAN, comme dans le schéma ci-dessous :
Ainsi, le PE peut envoyer directement les trames vers le FW, sans qu’elles ne soient interceptées par le CE.
Notons que le CE ne va pas modifier le next-hop sur les routes redistribuées en eBGP, car il sait que le Firewall et le PE appartiennent au même subnet et doivent pouvoir communiquer directement entre eux. Cette fonction est connue sous le nom third party next-hop processing. Corollaire: Si on vous a dit que eBGP modifiait systématiquement le next-hop, c’est faux (enfin, ce n’est vrai que dans 99% des cas).
Ainsi, il reste seulement à faire une configuration de type Integrated Routing and Bridging (IRB) sur le CE, configuration naturelle sur un switch de niveau 3 mais plus laborieuse sur un routeur de type IOS-XE.
Les configurations Cisco
Voici pour chaque procédé, les configurations de notre LAB Cisco.
Notre maquette se limite au cas nominal, et la connexion IPSec au-dessus d’Internet n’est pas mise en œuvre.
Configuration fixe du PE
interface Loopback172
description -- TEST --
ip address 172.20.20.20 255.255.255.255
interface GigabitEthernet2.24
description -- To CE --
encapsulation dot1Q 24
ip address 172.20.0.14 255.255.255.240
!
router bgp 10
network 172.20.20.20 mask 255.255.255.255
neighbor 172.20.0.1 remote-as 65000
Configuration de base du “Firewall”
Notre Firewall est simulé un autre routeur Cisco, ce qui ne doit pas géner car nous voulons seulement tester le comportement du CE.
Sa configuration de base est :
interface GigabitEthernet2
description -- Rocade --
ip address 10.10.10.0 255.255.255.254
interface GigabitEthernet3.100
description -- LAN --
encapsulation dot1Q 100
ip address 192.168.100.1 255.255.255.0
standby 0 ip 192.168.100.254
standby 0 priority 150
standby 0 preempt
router bgp 65000
bgp log-neighbor-changes
network 192.168.100.0
neighbor 10.10.10.1 remote-as 65000
Configuration de base du CE
Cette configuration de base fonctionne, à l’exception que le routage retour est direct alors que les flux doivent emprunter la rocade.
interface GigabitEthernet2
description -- Rocade --
ip address 10.10.10.1 255.255.255.254
interface GigabitEthernet3.100
description -- LAN --
encapsulation dot1Q 100
ip address 192.168.100.2 255.255.255.0
standby 0 ip 192.168.100.254
interface GigabitEthernet4.24
description -- To PE --
encapsulation dot1Q 24
ip address 172.20.0.1 255.255.255.240
router bgp 65000
bgp log-neighbor-changes
neighbor 10.10.10.0 remote-as 65000
neighbor 10.10.10.0 next-hop-self
neighbor 172.20.0.14 remote-as 10
Le ping depuis notre host de test
Depuis notre station en 192.168.100.10, nous pinguons notre loopback de test sur le PE en enregistrant les chemins aller et retour pour vérifier la symétrie. Ici nous n’avons pas encore appliqué les configurations envisagées, donc nous vérifions l’asymétrie :
Comme attendu, le CE envoie les paquets directement vers le host sans repasser par le Firewall :
alp-ep-10:~# ping -R 172.20.20.20
PING 172.20.20.20 (172.20.20.20) 56(124) bytes of data.
64 bytes from 172.20.20.20: icmp_seq=3 ttl=254 time=1.06 ms
NOP
RR: 192.168.100.10
10.10.10.0
172.20.0.1
172.20.20.20 --> Loopback de test sur le PE
192.168.100.2 --> Adresse LAN du CE
192.168.100.10 --> le Host de test
Subnetting via BGP conditionnal advertisment
Ce procédé est purement local au CE.
Configuration CE
router bgp 65000
bgp log-neighbor-changes
bgp inject-map SplitLAN exist-map LAN_FROM_FW
network 192.168.100.0 route-map ->BACKUP
neighbor 10.10.10.0 remote-as 65000
neighbor 10.10.10.0 next-hop-self
neighbor 172.20.0.14 remote-as 10
ip prefix-list LAN seq 5 permit 192.168.100.0/24
ip prefix-list ORIGINATED_BY_FW seq 5 permit 10.10.10.0/32
ip prefix-list SplitLAN seq 10 permit 192.168.100.0/25
ip prefix-list SplitLAN seq 20 permit 192.168.100.128/25
route-map SplitLAN permit 10
set ip address prefix-list SplitLAN
set community no-advertise
route-map LAN_FROM_FW permit 10
match ip address prefix-list LAN
match ip route-source prefix-list ORIGINATED_BY_FW
route-map ->BACKUP permit 10
set local-preference 50
set weight 0
Le show bgp depuis le CE
Ping depuis le host de test
alp-ep-10:~# ping -R 172.20.20.20
64 bytes from 172.20.20.20: icmp_seq=324 ttl=253 time=1.31 ms
NOP
RR: 192.168.100.10
10.10.10.0
172.20.0.1
172.20.20.20
10.10.10.1 --> Adresse de la rocade sur CE
192.168.100.1 --> LAN du Firewall
192.168.100.10
VRF et interface VASI
A nouveau ce procédé ne nécessite qu’une configuration locale au CE :
Configuration CE
vrf definition LAN
rd 65000:1
address-family ipv4
exit-address-family
!
interface GigabitEthernet2
description -- Rocade --
ip address 10.10.10.1 255.255.255.254
interface GigabitEthernet3.100
description -- LAN --
encapsulation dot1Q 100
vrf forwarding LAN
ip address 192.168.100.2 255.255.255.0
standby 0 ip 192.168.100.254
interface vasileft20
description -- CE GRT->LAN --
ip address 10.10.20.1 255.255.255.254
no keepalive
!
interface vasiright20
description -- CE LAN->GRT --
vrf forwarding LAN
ip address 10.10.20.0 255.255.255.254
no keepalive
router bgp 65000
bgp log-neighbor-changes
neighbor 10.10.10.0 remote-as 65000
neighbor 10.10.10.0 next-hop-self
neighbor 10.10.20.0 remote-as 65000
neighbor 10.10.20.0 next-hop-self
neighbor 172.20.0.14 remote-as 10
!
address-family ipv4 vrf LAN
bgp router-id 10.10.20.0
network 192.168.100.0 route-map ->BACKUP
neighbor 10.10.20.1 remote-as 65000
neighbor 10.10.20.1 activate
exit-address-family
route-map ->BACKUP permit 10
set local-preference 50
Le show bgp sur le CE
Dans la table de routage par défaut, le show bgp montre bien les routes reçues via la rocade et via la VRF LAN : tout se passe vraiment comme si les routes LAN provenaient d’un 3ème routeur :
Ping depuis host de test, puis après coupure LAN FW
Ici nous voyons les interfaces VASI dans le chemin de backup, conformément au schéma logique à 2 routeurs.
alp-ep-10:~# ping -R 172.20.20.20
PING 172.20.20.20 (172.20.20.20) 56(124) bytes of data.
64 bytes from 172.20.20.20: icmp_seq=2 ttl=253 time=1.26 ms
NOP
RR: 192.168.100.10
10.10.10.0
172.20.0.1
172.20.20.20
10.10.10.1 --> Adresse de la rocade sur CE
192.168.100.1 --> LAN du Firewall
192.168.100.10
64 bytes from 172.20.20.20: icmp_seq=3 ttl=253 time=0.981 ms
NOP (same route)
64 bytes from 172.20.20.20: icmp_seq=4 ttl=253 time=1.37 ms
NOP (same route)
64 bytes from 172.20.20.20: icmp_seq=5 ttl=253 time=1.32 ms
NOP (same route)
From 192.168.100.10 icmp_seq=10 Destination Host Unreachable
From 192.168.100.10 icmp_seq=11 Destination Host Unreachable
From 192.168.100.10 icmp_seq=12 Destination Host Unreachable
64 bytes from 172.20.20.20: icmp_seq=13 ttl=253 time=2707 ms
NOP
RR: 192.168.100.10
10.10.20.0
172.20.0.1
172.20.20.20
10.10.20.1
192.168.100.2
192.168.100.10
64 bytes from 172.20.20.20: icmp_seq=15 ttl=253 time=682 ms
NOP (same route)
IRB et third party next-hop processing
Cette solution modifie l’adressage de la rocade. Il faut légèrement mettre à jour la configuration du Firewall, puis pour être didactique, nous découpons la configuration du CE en 2 parties :
- La configuration IRB plutôt lourde
- La configuration BGP beaucoup plus digeste
Modification Firewall
interface GigabitEthernet2
ip address 172.20.0.2 255.255.255.240
router bgp 65000
no neighbor 10.10.10.1
neighbor 172.20.0.1 remote-as 65000
Configuration CE: IRB
interface GigabitEthernet2
no ip address
description – Rocade --
service instance 24 ethernet
encapsulation untagged
no interface GigabitEthernet4.24
interface GigabitEthernet4
description -- WAN to PE --
service instance 24 ethernet
description -- To PE --
encapsulation dot1q 24
rewrite ingress tag pop 1 symmetric
exit
bridge-domain 24
member GigabitEthernet2 service-instance 24
member GigabitEthernet4 service-instance 24
interface BDI24
description -- common subnet for FW, CE and PE --
ip address 172.20.0.1 255.255.255.240
no shutdown
Configuration CE: BGP
router bgp 65000
bgp log-neighbor-changes
network 192.168.100.0 route-map ->BACKUP
neighbor 172.20.0.2 remote-as 65000
neighbor 172.20.0.14 remote-as 10
route-map ->BACKUP permit 10
set local-preference 50
set weight 0
Show bgp depuis le PE
Le PE route bien les paquets directement vers le Firewall. La route de backup vers le CE n’apparaît pas car le CE n’annonce que la meilleure route, celle annoncée par le Firewall.
Ping depuis host de test
alp-ep-10:~# ping -R 172.20.20.20
PING 172.20.20.20 (172.20.20.20) 56(124) bytes of data.
64 bytes from 172.20.20.20: icmp_seq=1 ttl=254 time=0.885 ms
NOP
RR: 192.168.100.10
172.20.0.2
172.20.20.20
192.168.100.1 --> LAN du Firewall
192.168.100.10