
Suite di protocolli di routing basata su Rust che implementa BGP, OSPF, IS-IS, RIP e VRRP con configurazione modellata con YANG, automazione gNMI/gRPC e fuzzing integrato per reti ad alta scala guidate dall'automazione.
Holo è una suite di protocolli di routing progettata per supportare reti ad alta scala e guidate dall'automazione.
Per una descrizione di cosa sia un protocollo di routing, si prega di fare riferimento a questa pagina Wikipedia.
L'obiettivo principale di Holo è creare un codice affidabile, facile da mantenere ed estensibile. Con la crescente complessità dei protocolli di routing e delle loro estensioni, è fondamentale disporre di implementazioni di protocolli di routing costruite su una base solida. A tal fine, la codebase di Holo dà priorità a semplicità, modularità e documentazione approfondita. Grazie alla rigidità del compilatore Rust e agli estesi test unitari, ci si aspetta che la maggior parte delle regressioni venga individuata all'inizio del ciclo di sviluppo delle nuove funzionalità. Per maggiori dettagli, si prega di fare riferimento alla pagina Architettura.
Holo è stato sviluppato specificamente per reti ad alta scala e guidate dall'automazione che richiedono configurazione e monitoraggio programmabili utilizzando dati strutturati e modellati. Holo implementa nativamente i moduli YANG standard dell'IETF e supporta molteplici interfacce di gestione, inclusi gRPC e gNMI nativi. Inoltre, Holo offre una CLI standalone che genera dinamicamente comandi dai moduli YANG e comunica con il demone Holo tramite gRPC.
Le modifiche apportate alla configurazione vengono elaborate come transazioni, garantendo che tutte le modifiche vengano applicate o nessuna. Questa funzionalità è un significativo facilitatore dell'automazione di rete poiché elimina la necessità di recupero degli errori nelle applicazioni di gestione. Holo supporta anche transazioni a livello di rete che coinvolgono più dispositivi di rete. Ulteriori capacità di automazione di rete includono commit confermati e supporto per il rollback della configurazione.
Grazie all'essere scritto in un linguaggio memory-safe, Holo è immune a un'ampia varietà di bug relativi alla memoria e vulnerabilità di sicurezza. Oltre alle garanzie di sicurezza fornite da Rust, il demone Holo riduce anche i privilegi all'avvio. Per alcune operazioni, come il binding dei socket, vengono utilizzate le capabilities di Linux per ottenere il permesso minimo richiesto per il minor tempo possibile.
Holo fornisce anche una protezione robusta contro il vettore di attacco più comune negli stack di protocolli di routing: attacchi denial-of-service (DoS) tramite input di pacchetti malevoli. I pacchetti in entrata vengono decodificati in task asincroni isolati e supervisionati, consentendo alle implementazioni dei protocolli di recuperare con garbo da panico, ad esempio ignorando pacchetti malformati o chiudendo solo il flusso TCP interessato, senza compromettere la stabilità dell'intero demone. Inoltre, grazie al design modulare di Holo e al supporto integrato per il fuzzing guidato dalla copertura, si prevede che la maggior parte dei bug di parsing venga rilevata e risolta durante lo sviluppo.
Alcuni protocolli, come OSPF e RIP, hanno versioni diverse ampiamente distribuite, tipicamente una per IPv4 e un'altra per IPv6. Holo sfrutta i generics di Rust per avere implementazioni di protocolli indipendenti dalla versione, dove la maggior parte del codice è condivisa dalle diverse versioni del protocollo. Questo approccio riduce il costo di manutenzione di questi protocolli e facilita il rilascio di nuove funzionalità che avvantaggiano tutte le versioni del protocollo.
Holo fa ampio uso di operazioni asincrone e si basa sul runtime Tokio per pianificare i task ed eseguirli su un pool di thread. Per ottenere prestazioni migliori, sia le richieste I/O che gli algoritmi CPU-intensive vengono delegati a task separati, massimizzando l'utilizzo di tutti i core CPU disponibili. Il supporto per codice runtime-agnostic è previsto per il futuro, una volta che le astrazioni necessarie saranno standardizzate dal team del linguaggio Rust.
Holo genera messaggi di log che contengono dati strutturati, che possono essere presentati in vari formati come JSON, testo, ecc. Poiché il logging viene effettuato tramite la facciata tracing, è possibile utilizzare diversi subscriber tracing per soddisfare diversi requisiti utente. Ad esempio, il logging può essere diretto a un file, journald, un collector OpenTelemetry centralizzato, o qualsiasi combinazione di queste opzioni con livelli di logging potenzialmente variabili.
Holo fornisce funzionalità di registrazione e riproduzione, consentendo una facile riproduzione di qualsiasi bug segnalato dall'utente. Il demone Holo può essere configurato per registrare l'intero ciclo di vita di un'istanza di protocollo su un file. Questo file può poi essere riprodotto su un'altra macchina, riproducendo la stessa sequenza di eventi. Mentre una sessione di registrazione può durare ore o giorni, il processo di riproduzione dovrebbe richiedere solo pochi secondi. Ciò è possibile grazie all'architettura modulare di Holo, dove tutte le operazioni relative al tempo e I/O vengono eseguite in task separati e astratte come messaggi di evento.
Per istruzioni dettagliate sull'installazione, si prega di fare riferimento al file INSTALL.md.
Al momento, Holo è compatibile solo con sistemi operativi Linux. Il supporto per WebAssembly è previsto per il futuro.
Il modo più semplice per iniziare a usare Holo è utilizzare container Docker pre-costruiti in combinazione con il software containerlab. Puoi trovare una varietà di topologie di rete pre-configurate a questo link. Queste topologie possono essere distribuite con un singolo comando, permettendoti di testare Holo in varie configurazioni di rete, inclusi test di interoperabilità con altre implementazioni. Inoltre, Holo può essere utilizzato ovunque sia richiesto uno stack di routing, ad esempio in router software, a condizione che l'insieme di funzionalità sia allineato alle tue esigenze specifiche.
Holo supporta i seguenti standard Internet:
I risultati dei test di conformità eseguiti con Ixia IxANVL RFC Compliance Tester sono disponibili qui.
Questo progetto è finanziato tramite NGI Zero Core, un fondo istituito da NLnet con il supporto finanziario del programma Next Generation Internet della Commissione Europea. Scopri di più sulla pagina del progetto NLnet.
Questo progetto è concesso in licenza secondo la [licenza MIT].
Accogliamo con favore qualsiasi contributo, dai bug report alle Pull Request. Si prega di fare riferimento alla nostra Project Wishlist per idee su dove contribuire.
Salvo diversa indicazione esplicita, qualsiasi contributo inviato intenzionalmente per l'inclusione in Holo da parte tua, sarà concesso in licenza come MIT, senza ulteriori termini o condizioni.
| Modulo | Configurazione | Stato | RPCs | Notifiche | Totale |
|---|
| ietf-bfd-ip-mh@2022-09-22 | 100.00% | 100.00% | - | 100.00% | 100.00% |
| ietf-bfd-ip-sh@2022-09-22 | 100.00% | 100.00% | - | 100.00% | 100.00% |
| ietf-bfd@2022-09-22 | 100.00% | 100.00% | - | - | 100.00% |
| ietf-bgp-policy@2023-07-05 | 100.00% | - | - | - | 100.00% |
| ietf-bgp@2023-07-05 | 32.38% | 85.95% | - | - | 60.40% |
| ietf-bier@2023-09-12 | 100.00% | - | - | 0.00% | 72.50% |
| ietf-if-extensions@2023-01-26 | 100.00% | 0.00% | - | - | 50.00% |
| ietf-if-vlan-encapsulation@2023-01-26 | 42.86% | - | - | - | 42.86% |
| ietf-igmp-mld@2019-11-01 | 84.62% | 100.00% | - | - | 95.83% |
| ietf-interfaces@2018-02-20 | 100.00% | 0.00% | - | - | 22.22% |
| ietf-ip@2018-02-22 | 52.17% | 0.00% | - | - | 40.00% |
| ietf-ipv4-unicast-routing@2018-03-13 | 100.00% | 100.00% | - | - | 100.00% |
| ietf-ipv6-unicast-routing@2018-03-13 | 40.62% | 100.00% | - | - | 45.71% |
| ietf-isis-flex-algo@2026-06-26 | 0.00% | 100.00% | - | 0.00% | 74.00% |
| ietf-isis-link-attr@2026-06-26 | 81.82% | 78.43% | - | - | 78.76% |
| ietf-isis-msd@2024-09-02 | - | 100.00% | - | - | 100.00% |
| ietf-isis-sr-mpls@2025-12-09 | 15.38% | 57.27% | - | - | 52.85% |
| ietf-isis@2022-10-19 | 93.62% | 80.09% | 100.00% | 100.00% | 86.77% |
| ietf-key-chain@2017-06-15 | 100.00% | 100.00% | - | - | 100.00% |
| ietf-mpls-ldp@2022-03-14 | 86.96% | 92.31% | 100.00% | 100.00% | 92.38% |
| ietf-mpls@2020-12-18 | 0.00% | 57.14% | - | - | 35.29% |
| ietf-ospf-anycast-flag@2026-05-19 | 100.00% | - | - | - | 100.00% |
| ietf-ospf-sr-mpls@2025-12-09 | 21.43% | 51.36% | - | - | 49.82% |
| ietf-ospf@2022-10-19 | 95.70% | 85.04% | 100.00% | 58.06% | 83.89% |
| ietf-ospfv3-extended-lsa@2024-06-07 | 50.00% | 85.28% | - | - | 84.85% |
| ietf-rip@2020-02-20 | 27.91% | 93.33% | 100.00% | - | 55.41% |
| ietf-routing-policy@2021-10-11 | 100.00% | 0.00% | - | - | 98.11% |
| ietf-routing@2018-03-13 | 100.00% | 85.71% | - | - | 92.31% |
| ietf-segment-routing-mpls@2021-05-26 | 62.50% | 0.00% | - | 23.53% | 32.76% |
| ietf-segment-routing@2021-05-26 | 100.00% | - | - | - | 100.00% |
| ietf-system@2014-08-06 | 26.67% | 60.00% | 0.00% | - | 38.24% |
| ietf-vrrp@2018-03-13 | 53.19% | 80.00% | - | 66.67% | 66.35% |