Table of Contents
BGP
Configuration minimale
le minimum pour que ça marche
On suppose que notre Forti est connecté sur son port1 à un routeur, avec qui il doit monter une session BGP. Pour les besoins de notre test on va créer une interface de loopback lo0
(IP=10.0.0.1/32) que l'on annoncera dans le BGP et qui nous servira de router-id.
Paramètres :
- AS local = 65000
- IP interco local = 192.168.0.1/24
- AS distant = 65001
- IP interco distante (peer) = 192.168.0.2/24
# création des interfaces config system interface edit "port1" set vdom "root" set ip 192.168.0.1 255.255.255.0 set allowaccess ping set type physical set alias "vers routeur BGP" next edit "lo0" set vdom "root" set ip 10.0.0.1 255.255.255.255 set allowaccess ping set type loopback end end
On suppose que le routeur d'en face est correctement configuré avec la bonne IP, qu'il est UP et qu'on le PING (execute ping 192.168.0.2
).
Configuration BGP à proprement parlé :
config router bgp set as 65000 config neighbor edit "192.168.0.2" set remote-as 65001 next end # on déclare ici les réseaux qu'on annonce dans le BGP config network edit 1 set prefix 10.0.0.1 255.255.255.255 next end set router-id 10.0.0.1 end
Le router-id est un identifiant qui prend la même forme d'une adresse IP sans en être une, qu'il est conseillé de configurer sur l'équipement afin d'être sûr de ne pas avoir de doublon. C'est pour cela qu'on utilise l'IP de notre loopback.
Mot de passe MD5
Sécurité minimalisme, ça ne mange pas de pain de l'utiliser (à configurer sur les 2 peers pour que le BGP monte) ; ici on mettra le mot de passe “secreT” :
config router bgp set as 2200 config neighbor edit "192.168.0.2" set password "secreT" end
Redistribution de routes
Actuellement on redistribue déjà notre loopback lo0 (10.0.0.1/32) dans le BGP, via la directive config network
dans la section BGP. On peut également redistribuer automatiquement les routes présentent dans notre table de routage, en fonction de leur origine : connected, statique, ospf, etc
config router bgp set as 2200 # redistribuer toutes nos routes connected config redistribute "connected" set status enable end # redistribuer également toutes nos routes statiques config redistribute "static" set status enable end
Contrôler les préfixes in/out
Par sécurité on peut filtrer les annonces entrantes/sortantes du BGP avec des route-map. Par exemple pour être sûr que notre peer 192.168.0.2 ne nous annonce que des préfixes dans la plage 192.168.0.0/16 :
# on créer une liste de préfixes (~ACL) config router prefix-list edit "pref_BGP-in" config rule edit 1 set prefix 192.168.0.0 255.255.0.0 unset ge unset le end edit 2 set action deny set prefix any unset ge unset le end end # on l'applique sur notre voisin config router bgp set as 65000 config neighbor edit "192.168.0.2" set remote-as 65001 set prefix-list-in "pref_BGP-in" end
Les options ge
et le
servent à préciser le masque minimum et maximum pour que la liste matche. Par défaut le masque doit être strictement égal à celui spécifié pour matcher, ici un /16. Cela signifie que si le voisin nous annonce 192.168.0.0/24, notre routeur refusera la route.
On peut faire de même pour contrôler nos annonces vers ce voisin, en définissant de la même façon une prefix-list-out
.
Ce résultat aurait pu être identique avec l'utilisation d'une access-list
de filtrage + distribute-list-in/out
ou route-map-in/out
; mais cette solution consomme plus de ressources et ne devrait être réservée que pour des actions plus spécifiques (voir “Contrôle avancé des annonces” dans la suite).
Contrôle avancé des annonces
Pour contrôler le routage quand on a 2 liens WANs, on s'appuie sur les spécificités du BGP : on va utiliser les community strings (communautés étendues) pour tagguer les préfixes que l'on annoncent, que nos voisins utiliseront pour prioriser certains préfixes ; et utiliser l'attribut weight (poids) pour contrôler la préférence des routes apprises depuis ces derniers :
- envoi de la communauté 65001:100 à notre voisin “backup”, et 65001:200 à notre voisin “nominal” (les tags 100 et 200 sont arbitraires, et une policy doit être configurée explicitement sur chaque voisin, pour appliquer une action de priorisation -ou non- du préfixe (via une local pref par exemple).
- affectation du poids (weight) 100 aux routes apprises par le voisin backup, et 200 par le nominal.
NB: nos 2 voisins sont dans le même AS, 65001.
# Création d'une ACL qui matche tout le trafic: config router access-list edit "acl_all-traf" set comments "Match all traffic" config rule edit 1 set prefix 0.0.0.0 0.0.0.0 set exact-match disable next end # Création des 4 routemap ("in" et "out" pour chaque voisin) config router route-map edit "rm_BGP-bck-out" set comments "Commu lien backup" config rule edit 1 set match-ip-address "acl_all-traf" set set-community "65001:100" next end next edit "rm_BGP-nom-out" set comments "Commu lien nominal" config rule edit 1 set match-ip-address "acl_all-traf" set set-community "65001:200" next end next edit "rm_BGP-bck-in" set comments "Gestion BGP lien backup" config rule edit 1 set match-ip-address "acl_all-traf" set set-weight 100 next end next edit "rm_BGP-nom-in" set comments "Gestion BGP lien nominal" config rule edit 1 set match-ip-address "acl_all-traf" set set-weight 200 next end end # On place ces routemap sur chaque voisin, en "in" pour le weight et en "out" pour le tag de commu : config router bgp set as 65000 config neighbor edit "192.168.0.2" set remote-as 65001 set description "voisin lien backup" set route-map-in "rm_BGP-bck-in" set route-map-out "rm_BGP-bck-out" end edit "192.168.0.3" set remote-as 65001 set description "voisin lien nominal" set route-map-in "rm_BGP-nom-in" set route-map-out "rm_BGP-nom-out" end end end
Pour prendre en compte ces modifications, il faut faire un execute router restart
qui va relancer tout le routage (attention, ça va couper !).
A chaque modification de la configuration BGP, il faut également la reprendre en compte avec :
# recharger toute la configuration BGP (relancer le process BGP) execute router clear bgp all # soft reset (limite la portée de l'update aux annonces in) execute router clear bgp ip soft in # MAJ uniquement les annonces d'un peer execute router clear bgp ip in 192.168.0.3
Vérifications
Pour chaque voisin, contrôler ce qu'on lui envoie et ce qu'on reçoit (NB : ces commandes ne sont accessibles qu'en passant la commande set soft-reconfiguration enable
sur chaque peer) :
config router bgp config neighbor edit "192.168.0.2" set soft-reconfiguration enable next edit "192.168.0.3" set soft-reconfiguration enable end end end ! get router info bgp neighbors 192.168.0.3 adv get router info bgp neighbors 192.168.0.3 received-routes
get router info bgp community-info Address Refcnt Community [0x404237b8ff] (12) 65001:100 [0x40423788af] (3) 65001:200 get router info bgp community 65001:100 get router info bgp route-map "rm_BGP-nom-out"
Vérifications
Diagnostique et configuration du process BGP
get router bgp get router info bgp summary
Voir le status des protocoles de routage dynamiques
get router info protocols # [..] résultat de la commande limité au BGP Routing Protocol is "bgp 65425" IGP synchronization is disabled Automatic route summarization is disabled Default local-preference applied to incoming route is 100 Redistributing: Neighbor(s): Address AddressFamily FiltIn FiltOut DistIn DistOut RouteMapIn RouteMapOut Weight 10.55.200.94 unicast
Afficher les réseaux BGP annoncés et reçus par le routeur :
get router info bgp network BGP table version is 8, local router ID is 10.204.255.2 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, S Stale Origin codes: i - IGP, e - EGP, ? - incomplete Network Next Hop Metric LocPrf Weight Path *> 10.31.0.24/29 10.55.200.94 0 0 64200 65041 i *> 10.55.200.92/31 10.55.200.94 0 0 64200 ? *> 10.55.200.94/31 0.0.0.0 100 32768 i *> 10.55.200.254/31 10.55.200.94 0 0 64200 ? *> 10.143.0.24/29 10.55.200.94 0 0 64200 65041 i *> 10.143.6.8/29 10.55.200.94 0 0 64200 65547 i *> 10.143.8.8/29 0.0.0.0 100 32768 i *> 10.204.241.1/32 10.55.200.94 0 0 64200 65041 i *> 10.204.255.1/32 10.55.200.94 0 0 64200 65041 i *> 10.204.255.2/32 0.0.0.0 100 32768 i *> 10.204.255.3/32 10.55.200.94 0 0 64200 65547 i
Afficher les routes BGP présentes dans la table de routage
get router info routing-table bgp B 10.31.0.24/29 [20/0] via 10.55.200.94, port23, 6d23h40m B 10.55.200.92/31 [20/0] via 10.55.200.94, port23, 6d23h40m B 10.55.200.254/31 [20/0] via 10.55.200.94, port23, 1d22h05m B 10.143.6.8/29 [20/0] via 10.55.200.94, port23, 1d01h14m B 10.204.241.1/32 [20/0] via 10.55.200.94, port23, 6d23h40m B 10.204.255.1/32 [20/0] via 10.55.200.94, port23, 6d23h40m B 10.204.255.3/32 [20/0] via 10.55.200.94, port23, 1d22h05m
# Afficher les peers BGP get router info bgp neighbors # sniffer les packets BGP sur une interface diagnose sniffer packet any "tcp and port 179" 4 0 l
Debug
# mettre en place un debug du processus BGP diagnose ip router bgp all enable # voir les update sortantes diagnose ip router bgp updates out en # (activer le debug) diagnose debug enable
Tips
Remove private AS
Pour supprimer les numéros d'AS privés du champs AS-path :
config router bgp config neighbor edit "10.0.1.2" set remove-private-as enable set remove-private-as6 enable end
soft-reconfiguration
Si le routeur n'est pas surchargé en terme de mémoire, on peut activer l'option soft-reconfiguration
par neighbor, qui apporte plus d'informations pour les diagnostiques :
config router bgp config neighbor edit 10.55.202.92 set soft-reconfiguration enable end
On a ensuite accès à des commandes plus fines, comme les routes reçues ou envoyées à un voisin spécifique :
# afficher les routes annoncées par un voisin get router info bgp neighbors 10.55.202.92 received-route # afficher les routes apprises (en tenant compte des éventuels filtrages) d'un voisin get router info bgp neighbors 10.55.202.92 routes ! # afficher les routes annoncées à un voisin get router info bgp neighbors 10.55.202.92 advertised-routes