Por que o mapeamento de portas VPN do Docker nunca chega ao OpenVPN
A porta do host, a porta do contêiner e o transporte são três decisões separadas. Siga uma tentativa UDP por cada fronteira antes de tocar nos certificados.
O seu contêiner pode escutar em UDP 1195 enquanto o host publica 1194, e isso está correcto desde que o mapeamento o diga. Os números formam uma tabela de tradução: o cliente marca a porta do host, o Docker reescreve o destino para a porta do contêiner, e o OpenVPN responde na porta que a sua própria configuração indica. Uma divergência em qualquer um desses elos produz uma falha silenciosa que parece uma firewall. Os certificados e as cifras ficam a jusante e não a conseguem reparar.
Siga um pacote do cliente ao processo antes de mudar qualquer coisa na autenticação.
Três números, uma ligação
Os três números são o destino remoto usado pelo cliente, o mapeamento publicado no host e o ouvinte dentro do contêiner. Não têm de ser iguais, mas têm de formar uma cadeia. Números iguais são um caso especial que calha ser o mais comum, por isso uma divergência é fácil de escrever uma vez e difícil de ver depois.
Escreva a cadeia numa linha antes de depurar: endereço e porta do cliente, mapeamento do host, ouvinte do contêiner, transporte. Um defeito na cadeia aparece como um número que surge duas vezes com valores diferentes.
| Location | Example |
|---|---|
| Remote client destination | Host address, UDP 1194 |
| Published mapping | Host UDP 1194 to container UDP 1195 |
| Container listener | OpenVPN on UDP 1195 |
O que a sintaxe curta diz realmente
Na forma curta, o lado esquerdo é a porta do host e o direito é a porta do contêiner, e um sufixo com barra escolhe o transporte. Se omitir o sufixo, o Docker trata o mapeamento como TCP, pelo que um ouvinte UDP atrás de um mapeamento sem protocolo é um ouvinte a que ninguém chega. Esse valor predefinido está documentado e ainda surpreende quem acertou nos números e deu o assunto por encerrado.
A forma longa fixa explicitamente o endereço de ligação e o protocolo, o que vale as linhas extra em tudo o que está voltado para uma rede. Volte a ler o mapeamento publicado em vez de confiar no ficheiro que o produziu.
ports:
- 1194:1195/udpOnde o pacote pode parar
Um pedido pode ser descartado antes do Docker, no Docker ou no ouvinte. À frente do Docker pode haver uma firewall de nuvem ou um router a fazer o seu próprio encaminhamento, e esse equipamento precisa da porta virada ao host e do transporte certo. Dentro do Docker, um mapeamento para a porta de contêiner errada encaminha para um socket fechado.
Depois o ouvinte: a configuração do OpenVPN indica uma porta e um protocolo, e um cliente que chegue a outra dentro do contêiner não alcança nada. Testar um serviço UDP com TCP não prova nada em nenhuma destas fases, por isso use o transporte que o cliente vai usar.
Os endereços de ligação decidem o alcance
Um mapeamento publicado ligado a loopback só é acessível a partir do host, enquanto um ligado a todas as interfaces é acessível onde a firewall o permitir. Os dois parecem idênticos num ficheiro Compose que omite o endereço, e o valor predefinido do Docker é o mais amplo.
Decida que exposição a implantação pretende e depois escreva-a de forma explícita. Um teste interno que liga por loopback e um cliente remoto que não consegue ligar podem ser ambos descrições exactas do mesmo contêiner.
Leia o estado em execução
Inspecione o mapeamento efectivo do contêiner em execução e o ouvinte no seu espaço de nomes de rede. Um ficheiro Compose pode ter sido editado depois de o contêiner arrancar, os metadados da imagem podem declarar uma porta sem a publicar, e um segundo contêiner pode já ocupar a porta do host. Declarar uma porta numa imagem não é publicá-la, e nenhuma das duas coisas é o mesmo que escutar.
Três estados diferentes, três comandos diferentes, e só o último envolve o OpenVPN.
Quando o mapeamento está correcto
Assim que o pacote chega ao OpenVPN, o respetivo registo é o local onde ler sobre TLS e autenticação. Regenerar certificados para corrigir um pacote que nunca chegou é trabalho perdido que acrescenta uma segunda variável. Mantenha a nota do mapeamento junto ao perfil do cliente para que a próxima pessoa leia uma linha em vez de redescobrir os três números. Uma captura de pacotes do lado do host decide qual dos três elos está errado, e custa menos do que uma regeneração de certificado.
A publicação por ponte é o caso aqui descrito. A rede do host e os endereços de contêiner encaminhados dispensam a tradução, por isso os mesmos números significam outra coisa nesses desenhos.