Um VPN fica sem entropia? O que entropy_avail realmente mostra
Uma parada no arranque e um túnel estabelecido lento são falhas diferentes. Leia a etapa, o significado real do contador e a fila antes de culpar a aleatoriedade.
Ficar sem aleatoriedade do kernel é uma explicação atraente para um VPN lento, e quase sempre a errada para o sintoma que as pessoas relatam. Um host que espera saída aleatória para num determinado momento, normalmente no início do arranque ou durante o tratamento de chaves. Um túnel que se liga depressa e depois transfere devagar está, em vez disso, a descrever o débito. Separe essas duas observações antes de instalar um daemon para corrigir um número que ainda não acabou de ler.
Porque é que o mito sobrevive
Os dois problemas são reais e de longe parecem iguais. As paradas de arranque numa máquina virtual acabada de iniciar acontecem mesmo, e um túnel estabelecido lento é igualmente real. O erro é supor que o segundo é causado pelo primeiro porque a criptografia aparece em algum ponto das duas histórias. Nada na palavra cifragem implica que cada byte transferido consuma um byte novo de ruído ambiental.
Não é assim que estes geradores funcionam. Uma biblioteca criptográfica mantém um gerador com semente e retira saída dele, ressemeando segundo a sua própria política, pelo que o momento caro é a sementeira e não a transferência estável.
O que um gerador faz por pacote
No OpenSSL 3 a hierarquia de geradores predefinida é construída com instâncias DRBG que semeiam e ressemeiam conforme a configuração e o estado. No OpenVPN 2.6 o caminho de dados AEAD deriva o nonce do número de sequência do pacote combinado com um valor implícito por sessão, enquanto o caminho CBC mais antigo retira um IV pseudoaleatório por pacote. Nenhum dos padrões sustenta a regra de que mover um gigabyte consuma um gigabyte de ruído novo do kernel. Ambos sustentam a ideia de que a geração de chaves e os apertos de mão são onde a sementeira importa.
O caso CBC merece ser nomeado porque parece o mito e não é: o seu IV por pacote vem do gerador da biblioteca segundo o calendário de ressementeira da própria biblioteca, nunca de uma chamada ao kernel por pacote. Quando alguém cita um custo de entropia por byte, pergunte que versão de biblioteca e que caminho de código mediram.
Onde a espera realmente se vê
Coloque marcas temporais à volta das etapas, não da sessão: arranque, autenticação, troca de chave e transferência. Uma espera antes de o túnel ficar utilizável é uma queixa diferente de uma taxa constante baixa, e só uma das duas aponta para a aleatoriedade. No Linux um pedido normal de getrandom() pode bloquear até a fonte aleatória do kernel estar inicializada, e é por isso que a versão no arranque deste problema é real em máquinas virtuais e placas embebidas que têm pouco com que alimentar o pool no início.
| Etapa | O que executar | Leitura que significa espera | Leitura que significa débito |
|---|---|---|---|
| Arranque, antes de qualquer túnel | systemd-analyze critical-chain | uma unidade que fica segundos antes de o túnel arrancar | não aplicável, ainda não se transfere nada |
| Aperto de mão | journalctl -u openvpn-server@server -b | um intervalo longo antes de a sequência de inicialização terminar | não aplicável, o túnel não está levantado |
| Transferência estabelecida | ss -tin ao lado de sar -n DEV 1 | um processo bloqueado com filas de socket vazias | filas cheias, retransmissões e um único thread ocupado |
Dois comandos baratos pertencem ao início dessa recolha, e resolvem as perguntas fáceis antes de a tabela ser sequer necessária. O contador que leem é contabilidade de entropia e não um medidor de largura de banda, e uma única captura não pode mostrar que um processo está bloqueado, quanto esperou ou que interface chamam as funções da sua biblioteca. Uma amostra tirada após a recuperação perde normalmente a parada por completo, por isso guarde a versão do kernel ao lado da leitura.
cat /proc/sys/kernel/random/entropy_avail
uname -rAjuste a correção à leitura
Se o kernel espera mesmo pela inicialização, olhe para o caminho de sementeira suportado pela plataforma e não para o túnel. Pode dar-se a uma máquina virtual um dispositivo aleatório fornecido pelo anfitrião, como virtio-rng, e a preparação da imagem importa porque uma semente copiada sem alterações para muitos convidados não é uma inicialização independente. Se uma biblioteca relatar falhas de sementeira após o arranque, inspecione a fonte configurada e o comportamento do fornecedor em vez de alterar definições do kernel.
ss -tin dst 203.0.113.7
sar -n DEV 1 5A documentação do gerador OpenSSL descreve como essa hierarquia obtém entrada e quando ocorre a ressementeira, o que é uma afirmação muito mais estreita do que o mito e que só vale para essa implementação. Um daemon de entropia não é uma reparação universal de velocidade, e instalá-lo para fazer subir um contador altera um pressuposto de segurança sem demonstrar um atraso. Para o débito, siga o caminho de dados: um thread saturado, retransmissões, perda externa e quedas de fila exigem cada um uma correção diferente, e os tamanhos de buffer tratam do buffering de sockets com as suas próprias provas de fila.