Melhorias no WireGuard da Fly.io
- A Fly.io converte contêineres em VMs e os executa em hardware ao redor do mundo aproveitando o poder do Firecracker.
- Usa muito o WireGuard, que agora passou a fazer parte da API para clientes.
- Sempre que o CLI
flyctl é executado, ele cria uma pilha TCP/IP e se comunica diretamente com as Fly Machines usando um endereço IPv6 exclusivo.
- Essa abordagem tem vantagens e desvantagens, e houve algumas melhorias.
Situação anterior
- Servidores de "gateway" espalhados pelo mundo aceitavam conexões WireGuard e faziam a ligação com a rede privada apropriada.
- Cada execução do
flyctl criava ou se conectava a um processo agente em segundo plano.
- O agente criava uma nova configuração de peer WireGuard na API GraphQL.
- A API enviava a configuração do peer ao gateway apropriado por meio do sistema de mensageria NATS.
- No gateway, o serviço
wggwd recebia a configuração, armazenava em um banco de dados SQLite e a adicionava ao kernel.
- A API respondia à requisição GraphQL entregando a configuração, e o
flyctl se conectava ao peer WireGuard.
- O NATS é rápido, mas não garante a entrega, e não limpava peers antigos que permaneciam nos gateways.
Um jeito melhor
- Armazenar peers WireGuard não exige um banco de dados complexo.
- O sistema foi alterado para que o gateway busque a configuração na API sempre que necessário.
- Os peers podem ser adicionados ao kernel apenas quando o cliente quiser se conectar e removidos quando não forem mais necessários.
Tornando possíveis peers JIT do WireGuard
- A interface de configuração do WireGuard no kernel Linux usa Netlink.
- É possível identificar e interceptar pacotes de solicitação de conexão WireGuard com filtro BPF e packet socket.
- O WireGuard não tem conceitos de "cliente" e "servidor"; é um protocolo ponto a ponto.
- Quando o
flyctl envia um pacote UDP ao gateway, isso é um handshake initiation.
- É possível capturar conexões de entrada usando um filtro BPF.
- Como ele é baseado no framework de protocolo Noise, é preciso descriptografar para identificar a solicitação.
- É possível criar um feed de eventos para obter a chave pública de qualquer usuário que tente se conectar ao gateway.
- Sempre que um novo peer é visto, suas informações são buscadas e instaladas por meio de uma requisição à API HTTP interna.
Lançando apps em minutos
- Na Fly.io, é possível fazer deploy de apps rapidamente e obter seu próprio peer JIT WireGuard.
Olhando os gráficos
- Após operar esse sistema por algumas semanas, o número de peers WireGuard obsoletos restantes nos gateways caiu de forma significativa.
- Os gateways mantêm menos estado e a configuração dos peers ficou mais rápida.
- Um gráfico do Grafana mostra os resultados bem-sucedidos no dia da transição.
Opinião do GN⁺
- As melhorias da Fly.io no WireGuard são um bom exemplo de como aumentar significativamente o desempenho e a estabilidade da rede.
- Essa abordagem pode ser especialmente útil para reforçar o gerenciamento de tráfego de rede e a segurança em serviços baseados em nuvem.
- Outros projetos com funcionalidades parecidas incluem Tailscale e ZeroTier, que também oferecem alternativas de VPN para usuários individuais e corporativos.
- Ao adotar WireGuard, é preciso considerar configuração de rede, políticas de segurança e compatibilidade.
- Os benefícios dessa tecnologia incluem alto desempenho e configuração simples, mas a integração com infraestrutura existente e a operação podem trazer desafios.
1 comentários
Opiniões no Hacker News