======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 "[[informatique:fortinet:bgp#Contrôle avancé des annonces|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 : get router info bgp neighbors 10.55.200.94 received-route get router info bgp neighbors 10.55.200.94 advertised-routes