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.

EtapaO que executarLeitura que significa esperaLeitura que significa débito
Arranque, antes de qualquer túnelsystemd-analyze critical-chainuma unidade que fica segundos antes de o túnel arrancarnão aplicável, ainda não se transfere nada
Aperto de mãojournalctl -u openvpn-server@server -bum intervalo longo antes de a sequência de inicialização terminarnão aplicável, o túnel não está levantado
Transferência estabelecidass -tin ao lado de sar -n DEV 1um processo bloqueado com filas de socket vaziasfilas 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 -r

Ajuste 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 5

A 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.

Artigos relacionados