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 :

# 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 :

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