
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 Wikipedia.
Você pode experimentar o Holo no seu navegador, sem instalar nada, no Holo Lab.
O principal objetivo do Holo é criar uma base de código confiável, fácil de manter e extensível. Com a complexidade cada vez maior 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 precocemente no ciclo de desenvolvimento de novos recursos. Para mais detalhes, consulte a página de 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 suporta múltiplas interfaces de gerenciamento, incluindo gRPC nativo e gNMI. Além disso, o Holo possui uma CLI autônoma que renderiza dinamicamente comandos a partir de módulos YANG e se comunica com o daemon do 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 grande facilitador da automação de redes, pois elimina a necessidade de recuperação de erros em aplicações de gerenciamento. O Holo também suporta transações em toda a rede envolvendo múltiplos 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 do 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 oferece proteção robusta contra o vetor de ataque mais comum em pilhas de protocolos de roteamento: ataques de negação de serviço (DoS) via entrada maliciosa de pacotes. Os 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 fluxo TCP afetado, sem comprometer a estabilidade de todo o daemon. Além disso, graças ao design modular do Holo e ao suporte integrado para fuzzing guiado por cobertura, espera-se que a maioria dos bugs de parsing seja detectada e corrigida durante o desenvolvimento.
Alguns protocolos, como OSPF e RIP, têm versões diferentes amplamente implantadas, tipicamente uma para IPv4 e outra para IPv6. O Holo aproveita os genéricos do Rust para ter implementações de protocolos agnósticas de versão, onde a maior parte do código é compartilhada pelas diferentes versões de protocolo. Essa abordagem reduz o custo de manutenção desses protocolos e facilita a entrega de novos recursos que beneficiam todas as versões de 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 agnóstico 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 assinantes de tracing podem ser utilizados para atender a diferentes requisitos do usuário. Por exemplo, o logging pode ser direcionado para um arquivo, journald, um coletor OpenTelemetry centralizado, ou qualquer combinação dessas opções com níveis de logging potencialmente variados.
O Holo fornece funcionalidade de gravação e reprodução, permitindo a fácil reprodução de qualquer bug relatado pelo usuário. O daemon do 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. Embora uma sessão de gravação possa 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 a tempo e I/O são realizadas em tarefas separadas e abstraídas como mensagens de eventos.
Para instruções detalhadas sobre instalação, consulte o arquivo INSTALL.md.
O Holo roda em Linux. A base de código é amplamente independente de plataforma, e as partes que interagem com o sistema operacional, como I/O de rede, gerenciamento de interfaces e instalação de rotas, estão isoladas em poucos lugares, de modo que o Holo pode ser portado para outras plataformas com pouco esforço. Ele também pode ser compilado para WebAssembly, principalmente para executar redes virtuais no navegador.
A maneira mais rápida de experimentar o Holo é o Holo Lab, que executa topologias de rede de roteadores Holo diretamente no navegador.
Para uma configuração completa, use 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ários cenários de rede, incluindo testes de interoperabilidade com outras implementações.
Além disso, o Holo pode ser integrado a qualquer plataforma que exija uma pilha de roteamento, incluindo roteadores de hardware, sistemas operacionais de rede de código aberto e roteadores de software, desde que o conjunto de recursos esteja alinhado com suas necessidades específicas.