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.

LocationExample
Remote client destinationHost address, UDP 1194
Published mappingHost UDP 1194 to container UDP 1195
Container listenerOpenVPN 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/udp

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

Artigos relacionados