Frr
Free Range Routing ou FRR est une bifurcation de Quagga. Il implémente donc, tout en suivant la même logique, divers protocoles de routages dynamiques et de gestion réseau dont :
- BGP
- OSPF
- RIP / RIPNG
- IS-IS
- PIM
- LDP
- BFD
- Babel
- PBR
- OpenFabric
- VRRP
- EIGRP
- NHRP
Fidèle a ses origines, le logiciels s’appuie sur un démon central nommé <syntaxhighlight lang="bash" inline>zebra</syntaxhighlight> (du nom du premier logiciel à l'origine de toutes les bifurcations dont Quagga, Cumulus Quagga et FRR) qui s'interface entre le système d'exploitation et les démons de routages. Chaque protocole est implémenté dans un démon spécifique situé dans <syntaxhighlight lang="bash" inline>/usr/lib/frr/</syntaxhighlight> qu'il convient d'activer manuellement via le fichier de configuration <syntaxhighlight lang="bash" inline>/etc/frr/daemons</syntaxhighlight>.
Leur socket de communication interne sont décrits ici.
Installation
FRR a remplacé Quagga dans Debian Stable depuis la version 11 de cette dernière. Il est donc présent dans les dépôts officiels
apt install --no-install-recommends frr
Configuration
Il n'est plus nécessaire d'utiliser un fichier de configuration par démon. Cette philosophie, jugée peu efficace par les développeurs, a laissée place à un unique fichier (<syntaxhighlight lang="bash" inline>/etc/frr/frr.conf</syntaxhighlight>) comme sur Cisco IOS dont il reprend la syntaxe.
Tout d'abord, il faut activer les démons de routage pour les protocoles souhaités en passant à <syntaxhighlight lang="bash" inline>yes</syntaxhighlight> les clés correspondantes dans <syntaxhighlight lang="bash" inline>/etc/frr/daemons</syntaxhighlight>.
Vous pouvez utiliser la commande suivante pour le faire sans éditeur de texte
DEMON="bgpd" sed -i "s/${DEMON}=no/${DEMON}=yes/" /etc/frr/daemons
Redémarrer le service pour prendre en compte la modification
systemctl restart frr.service
Vous constaterez avec un <syntaxhighlight lang="bash" inline>ss -ltn</syntaxhighlight> que les sockets des démons choisis ont étés créés (plus celui de <syntaxhighlight lang="bash" inline>zebra</syntaxhighlight>, indispensable au fonctionnement de la solution). Les sockets ouvrants les ports des protocoles se créeront à la configuration de chacun d'eux.
Afin de configurer ces protocoles, FRR propose deux solutions. Il est alors possible d'éditer directement le fichier de configuration principal comme avec n'importe quel programme ou alors d'utiliser le shell de connexion <syntaxhighlight lang="bash" inline>vtysh</syntaxhighlight>. Dans le premier cas, une vérification syntaxique pourra être effectuée avec la commande <syntaxhighlight lang="bash" inline>vtysh -C</syntaxhighlight>, dans le second, le shell informe de toute erreur en temps réel et propose une auto-completion (ne pas oublier un <syntaxhighlight lang="bash" inline>wr</syntaxhighlight> pour écrire les modification en dur). Dans les deux cas, le programme se réfèrera à <syntaxhighlight lang="bash" inline>/etc/frr/frr.conf</syntaxhighlight> pour fonctionner.
BGP
Dans la mesure où FRR reprend la syntaxe de Cisco IOS, cette section ne sera pas détaillée. Il y a cependant un delta de taille à prendre compte : le programme suit la RFC 8212 à la lettre et impose d'appliquer une politique d'importation et d'exportation à l'annonce des routes, sans quoi aucune action n'est exécuté par le démon. Dans la mesure où aucun exemple n'est fournis pour programmer ces fameuses politiques dans la documentation officielle (comme c'est malheureusement systématiquement le cas avec les documentations officielles...) et où cette notion ne pose strictement aucun problème sur IOS depuis 30 ans, nous allons simplement désactiver cette merde inutile afin de pouvoir utiliser notre programme (la meilleurs des sécurité étant d'éteindre définitivement la machine - rappel aux développeurs qui font chier les administrateurs...) avec la commande <syntaxhighlight lang="bash" inline>no bgp ebgp-requires-policy</syntaxhighlight> (nécessite un redémarrage du service).
Voici une configuration complète : <syntaxhighlight lang="bash"> ip router-id 10.0.0.1 ! router bgp 64999
no bgp ebgp-requires-policy neighbor 10.0.0.2 remote-as 65000 ! address-family ipv4 unicast network 10.0.0.0/30 network 172.16.0.0/30 exit-address-family
exit ! end </syntaxhighlight>