Por que muitas conexões de aplicativos compartilham uma única sessão OpenVPN
Uma conversa UDP externa transporta cada fluxo interno que as rotas lhe enviam. As portas e protocolos internos sobrevivem; apenas a tupla externa permanece fixa.
Imagine um navegador carregando uma página HTTPS enquanto um cliente SSH alcança outro servidor e um resolvedor responde a uma consulta, tudo através de uma única sessão OpenVPN. Na interface física você vê uma conversa; dentro do túnel vê três. Ambas as visões estão corretas, e saber por quê é a diferença entre uma captura útil e uma confusa. Siga um fluxo interno do soquete até o cabo e o empilhamento deixa de ser abstrato.
Uma conversa externa, muitos fluxos internos
Cada aplicativo abre seu próprio soquete, e o núcleo lhe atribui uma tupla de cinco elementos: endereço de origem, porta de origem, endereço de destino, porta de destino e protocolo. Essas tuplas existem antes de qualquer túnel entrar em cena. Depois o roteamento decide que todas saem pelo dispositivo de túnel, então o pacote entregue ao OpenVPN ainda carrega os cabeçalhos originais dentro de si. O OpenVPN criptografa esse pacote interno e envolve o resultado em uma única conversa UDP ou TCP externa com o par. A conversa externa é, portanto, uma, enquanto os fluxos dentro dela são tantos quantos os aplicativos abriram.
Nada colapsa. As tuplas internas sobrevivem de ponta a ponta, e é por isso que o lado remoto ainda distingue os três fluxos.
A porta que permanece fixa
O que permanece constante é a tupla externa: seu endereço, a porta local que o cliente vinculou, o endereço do par e a porta de serviço configurada. É essa tupla que um firewall ou um NAT no caminho precisa permitir, e é ela que uma captura no enlace ascendente mostrará. É também a que muda após uma reconexão ou troca de rede, porque o cliente pode vincular outra porta local. Um túnel não implica uma porta de origem fixa para sempre.
As portas internas são o que importa aos pontos finais. Um fluxo HTTPS mantém a porta de destino 443 dentro do túnel, ainda que o transporte externo fique na porta configurada pelo operador. Os pontos finais do aplicativo nunca sabem da externa.
O que a desencapsulação muda no extremo remoto
No par, a camada externa é removida, e o pacote interno é o que resta. A partir daí, o encaminhamento e a política de acesso aplicam-se ao destino e ao protocolo internos. O servidor web ainda recebe uma conexão HTTPS, o daemon SSH ainda recebe SSH, e o resolvedor ainda recebe uma consulta.
Por isso uma regra que permite o transporte externo não é a mesma regra que permitir um serviço interno. A primeira descreve um caminho; a segunda descreve uma autorização.
Um TCP externo significa um só fluxo, não uma só conexão
Quando o transporte externo é UDP, o destino de cada fluxo interno é independente: um datagrama perdido afeta uma transferência até sua própria retransmissão. Quando o transporte externo é TCP, todos os fluxos internos compartilham um único fluxo de bytes confiável.
Esse fluxo compartilhado é a parte que as pessoas perdem. A recuperação acontece uma vez, para tudo, então um único segmento perdido atrasa o tráfego de cada aplicativo multiplexado dentro. Ainda são muitas conexões nos pontos finais e uma conexão no cabo, e é no cabo que vive o efeito de cabeça de fila. O número de portas à escuta não lhe diz nada sobre isso, e é por isso que contar portas é uma má forma de raciocinar sobre o desempenho do túnel.
Descreva sua própria configuração com precisão
Nomeie o tráfego interno selecionado e o transporte externo específico que o carrega, em vez de dizer que a máquina envia tudo por uma só porta. Serviços locais, um segundo túnel e a outra família de endereços criam fluxos que nunca entram nesta conversa. Uma captura no enlace ascendente mostra a tupla externa; uma captura dentro do túnel mostra as internas.
Pegue ambas e coloque os carimbos de tempo lado a lado. Se precisar provar qual aplicativo gerou qual fluxo interno, a tabela de soquetes no host é o melhor instrumento, porque mapeia portas diretamente para processos. Depois anote a tupla externa que observou e o momento em que a observou, porque a captura seguinte após uma reconexão pode legitimamente mostrar números diferentes.