
Suite de protocoles de routage basée sur Rust implémentant BGP, OSPF, IS-IS, RIP et VRRP avec une configuration basée sur YANG, automatisation gNMI/gRPC, et fuzzing intégré pour les réseaux à grande échelle et axés sur l'automatisation.
Holo est une suite de protocoles de routage conçue pour prendre en charge les réseaux à grande échelle et pilotés par l'automatisation.
Pour une description de ce qu'est un protocole de routage, veuillez consulter cette page Wikipédia.
Vous pouvez essayer Holo dans votre navigateur, sans rien installer, sur Holo Lab.
L'objectif principal de Holo est de créer une base de code fiable, facile à maintenir et extensible. Avec la complexité croissante des protocoles de routage et de leurs extensions, il est crucial de disposer d'implémentations de protocoles de routage bâties sur des fondations solides. À cette fin, la base de code de Holo privilégie la simplicité, la modularité et une documentation approfondie. Grâce à la rigueur du compilateur Rust et à de nombreux tests unitaires, la plupart des régressions devraient être détectées tôt dans le cycle de développement des nouvelles fonctionnalités. Pour plus de détails, veuillez consulter la page Architecture.
Holo a été développé spécifiquement pour les réseaux à grande échelle pilotés par l'automatisation, qui nécessitent une configuration et une supervision programmables à l'aide de données structurées et modélisées. Holo implémente nativement les modules YANG standards de l'IETF et prend en charge plusieurs interfaces de gestion, notamment gRPC et gNMI natifs. De plus, Holo propose une CLI autonome qui génère dynamiquement les commandes à partir des modules YANG et communique avec le démon Holo via gRPC.
Les modifications apportées à la configuration sont traitées sous forme de transactions, garantissant que soit toutes les modifications sont appliquées, soit aucune. Cette fonctionnalité facilite grandement l'automatisation du réseau, car elle élimine le besoin de récupération d'erreurs dans les applications de gestion. Holo prend également en charge les transactions à l'échelle du réseau impliquant plusieurs équipements réseau. Les capacités d'automatisation réseau supplémentaires incluent les commits confirmés et la prise en charge du retour arrière de configuration.
Du fait qu'il est écrit dans un langage sûr vis-à-vis de la mémoire, Holo est immunisé contre une grande variété de bogues liés à la mémoire et de vulnérabilités de sécurité. Outre les garanties de sûreté offertes par Rust, le démon Holo abandonne également ses privilèges au démarrage. Pour certaines opérations, comme la liaison de sockets, les capabilities Linux sont utilisées pour obtenir la permission minimale requise pendant le moins de temps possible.
Holo offre également une protection robuste contre le vecteur d'attaque le plus courant dans les piles de protocoles de routage : les attaques par déni de service (DoS) via l'injection de paquets malveillants. Les paquets entrants sont décodés dans des tâches asynchrones isolées et supervisées, ce qui permet aux implémentations de protocoles de se remettre proprement des panics, par exemple en ignorant les paquets malformés ou en fermant uniquement le flux TCP affecté, sans compromettre la stabilité de l'ensemble du démon. De plus, grâce à la conception modulaire de Holo et à sa prise en charge intégrée du fuzzing guidé par la couverture, la plupart des bogues d'analyse devraient être détectés et corrigés pendant le développement.
Certains protocoles, tels qu'OSPF et RIP, ont différentes versions largement déployées, généralement une pour IPv4 et une autre pour IPv6. Holo tire parti des génériques de Rust pour disposer d'implémentations de protocoles indépendantes de la version, où la majeure partie du code est partagée par les différentes versions du protocole. Cette approche réduit le coût de maintenance de ces protocoles et facilite la livraison de nouvelles fonctionnalités bénéficiant à toutes les versions du protocole.
Holo fait un usage intensif des opérations asynchrones et s'appuie sur le runtime Tokio pour planifier les tâches et les exécuter sur un pool de threads. Afin d'obtenir de meilleures performances, les requêtes d'E/S et les algorithmes gourmands en CPU sont délégués à des tâches distinctes, maximisant l'utilisation de tous les cœurs de CPU disponibles. La prise en charge de code indépendant du runtime est prévue pour l'avenir, une fois que les abstractions nécessaires seront standardisées par l'équipe du langage Rust.
Holo génère des messages de journal contenant des données structurées, qui peuvent être présentées dans divers formats tels que JSON, texte, etc. La journalisation étant effectuée via la façade tracing, divers abonnés tracing peuvent être utilisés pour répondre à différents besoins des utilisateurs. Par exemple, la journalisation peut être dirigée vers un fichier, journald, un collecteur OpenTelemetry centralisé, ou toute combinaison de ces options avec des niveaux de journalisation potentiellement variables.
Holo fournit une fonctionnalité d'enregistrement et de relecture, permettant de reproduire facilement tout bogue signalé par un utilisateur. Le démon Holo peut être configuré pour enregistrer le cycle de vie complet d'une instance de protocole dans un fichier. Ce fichier peut ensuite être rejoué sur une autre machine, reproduisant la même séquence d'événements. Bien qu'une session d'enregistrement puisse durer des heures ou des jours, le processus de relecture ne devrait prendre que quelques secondes. Cela est possible grâce à l'architecture modulaire de Holo, où toutes les opérations liées au temps et aux E/S sont effectuées dans des tâches distinctes et abstraites sous forme de messages d'événements.
Pour des instructions détaillées sur l'installation, veuillez consulter le fichier INSTALL.md.
Holo fonctionne sous Linux. La base de code est largement indépendante de la plateforme, et les parties qui interagissent avec le système d'exploitation, telles que les E/S réseau, la gestion des interfaces et l'installation des routes, sont isolées en quelques endroits, de sorte que Holo peut être porté sur d'autres plateformes avec peu d'effort. Il peut également être compilé en WebAssembly, principalement pour exécuter des réseaux virtuels dans le navigateur.
Le moyen le plus rapide d'essayer Holo est Holo Lab, qui exécute des topologies réseau de routeurs Holo directement dans le navigateur.