
Suíte de protocolos de roteamento baseada em Rust implementando BGP, OSPF, IS-IS, RIP e VRRP com configuração modelada por YANG, automação gNMI/gRPC e fuzzing integrado para redes de alta escala e orientadas por automação.
Holo é um conjunto de protocolos de roteamento projetado para suportar redes de alta escala e orientadas à automação.
Para uma descrição do que é um protocolo de roteamento, consulte esta página da Wikipédia.
O principal objetivo do Holo é criar uma base de código confiável, fácil de manter e extensível. Com a crescente complexidade dos protocolos de roteamento e suas extensões, é crucial ter implementações de protocolos de roteamento construídas sobre uma base robusta. Para isso, a base de código do Holo prioriza simplicidade, modularidade e documentação completa. Graças ao rigor do compilador Rust e aos extensos testes unitários, espera-se que a maioria das regressões seja detectada no início do ciclo de desenvolvimento de novos recursos. Para mais detalhes, consulte a página Arquitetura.
O Holo foi desenvolvido especificamente para redes de alta escala e orientadas à automação que exigem configuração e monitoramento programáveis usando dados estruturados e modelados. O Holo implementa nativamente módulos YANG padrão da IETF e oferece suporte a várias interfaces de gerenciamento, incluindo gRPC e gNMI nativos. Além disso, o Holo possui uma CLI independente que renderiza dinamicamente comandos a partir de módulos YANG e se comunica com o daemon Holo através de gRPC.
As alterações feitas na configuração são processadas como transações, garantindo que todas as alterações sejam aplicadas ou nenhuma delas. Esse recurso é um facilitador significativo da automação de rede, pois elimina a necessidade de recuperação de erros em aplicativos de gerenciamento. O Holo também oferece suporte a transações em toda a rede envolvendo vários dispositivos de rede. Recursos adicionais de automação de rede incluem commits confirmados e suporte a rollback de configuração.
Por ser escrito em uma linguagem com segurança de memória, o Holo é imune a uma ampla variedade de bugs relacionados à memória e vulnerabilidades de segurança. Além das garantias de segurança fornecidas pelo Rust, o daemon Holo também reduz privilégios na inicialização. Para certas operações, como vinculação de sockets, as capabilities do Linux são usadas para obter a permissão mínima necessária pelo menor tempo possível.
O Holo também fornece proteção robusta contra o vetor de ataque mais comum em stacks de protocolos de roteamento: ataques de negação de serviço (DoS) via entrada de pacotes maliciosos. Pacotes recebidos são decodificados em tarefas assíncronas isoladas e supervisionadas, permitindo que as implementações de protocolo se recuperem graciosamente de panics, como ignorando pacotes malformados ou fechando apenas o stream TCP afetado, sem comprometer a estabilidade de todo o daemon. Além disso, graças ao design modular do Holo e ao suporte nativo para fuzzing guiado por cobertura, espera-se que a maioria dos bugs de parsing seja detectada e tratada durante o desenvolvimento.
Alguns protocolos, como OSPF e RIP, possuem diferentes versões amplamente implantadas, tipicamente uma para IPv4 e outra para IPv6. O Holo aproveita os genéricos do Rust para ter implementações de protocolo agnósticas à versão, onde a maior parte do código é compartilhada pelas diferentes versões do protocolo. Essa abordagem reduz o custo de manutenção desses protocolos e facilita o lançamento de novos recursos que beneficiam todas as versões do protocolo.
O Holo faz uso extensivo de operações assíncronas e depende do runtime Tokio para agendar tarefas e executá-las em um pool de threads. Para obter melhor desempenho, tanto requisições de I/O quanto algoritmos intensivos em CPU são delegados a tarefas separadas, maximizando a utilização de todos os núcleos de CPU disponíveis. O suporte para código independente de runtime está planejado para o futuro, assim que as abstrações necessárias forem padronizadas pela equipe da linguagem Rust.
O Holo gera mensagens de log que contêm dados estruturados, que podem ser apresentados em vários formatos, como JSON, texto, etc. Como o logging é realizado através da fachada tracing, diversos subscribers do tracing podem ser utilizados para atender a diferentes requisitos do usuário. Por exemplo, o log pode ser direcionado para um arquivo, journald, um coletor OpenTelemetry centralizado, ou qualquer combinação dessas opções com níveis de log potencialmente variados.
O Holo fornece funcionalidade de gravação e reprodução, permitindo a fácil reprodução de qualquer bug reportado pelo usuário. O daemon Holo pode ser configurado para gravar o ciclo de vida completo de uma instância de protocolo em um arquivo. Esse arquivo pode então ser reproduzido em outra máquina, reproduzindo a mesma sequência de eventos. Enquanto uma sessão de gravação pode durar horas ou dias, o processo de reprodução deve levar apenas alguns segundos. Isso é viável graças à arquitetura modular do Holo, onde todas as operações relacionadas ao tempo e de I/O são executadas em tarefas separadas e abstraídas como mensagens de evento.
Para instruções detalhadas sobre instalação, consulte o arquivo INSTALL.md.
Atualmente, o Holo é compatível apenas com sistemas operacionais Linux. O suporte a WebAssembly está planejado para o futuro.
A maneira mais fácil de começar a usar o Holo é usando contêineres Docker pré-construídos em combinação com o software containerlab. Você pode encontrar uma variedade de topologias de rede pré-configuradas neste link. Essas topologias podem ser implantadas com um único comando, permitindo testar o Holo em várias configurações de rede, incluindo testes de interoperabilidade com outras implementações.
Além disso, o Holo pode ser usado onde uma pilha de roteamento for necessária, como em roteadores de software, desde que o conjunto de recursos esteja alinhado com suas necessidades específicas.
O Holo suporta os seguintes padrões da Internet: