Por que a túa asignación de portos VPN de Docker nunca chega a OpenVPN
O porto do host, o do contedor e o transporte son tres decisións distintas. Segue un intento UDP por cada fronteira antes de tocar os certificados.
O teu contedor pode escoitar en UDP 1195 mentres o host publica 1194, e iso é correcto sempre que a asignación o diga. Os números forman unha táboa de tradución: o cliente marca o porto do host, Docker reescribe o destino ao porto do contedor e OpenVPN responde no porto que indica a súa propia configuración. Un desaxuste en calquera deses elos produce un fallo silencioso que parece un cortafogos. Os certificados e os cifrados están despois e non poden reparalo.
Segue un paquete do cliente ao proceso antes de cambiar nada da autenticación.
Tres números, unha conexión
Os tres números son o destino remoto que usa o cliente, a asignación publicada no host e o oínte dentro do contedor. Non teñen que ser iguais, pero deben encadearse. Os números iguais son un caso especial que resulta ser o habitual, por iso un desaxuste é fácil de escribir unha vez e difícil de ver despois.
Escribe a cadea nunha liña antes de depurar: enderezo e porto do cliente, asignación do host, oínte do contedor, transporte. Un defecto na cadea amósase como un número que aparece dúas veces con valores distintos.
| Location | Example |
|---|---|
| Remote client destination | Host address, UDP 1194 |
| Published mapping | Host UDP 1194 to container UDP 1195 |
| Container listener | OpenVPN on UDP 1195 |
Que di realmente a sintaxe curta
Na forma curta o lado esquerdo é o porto do host e o dereito o porto do contedor, e un sufixo con barra inclinada escolle o transporte. Se omites o sufixo, Docker trata a asignación como TCP, así que un oínte UDP detrás dunha asignación sen protocolo é un oínte ao que ninguén pode chegar. Ese valor por defecto está documentado e aínda sorprende a quen cadrou os números e deu o asunto por rematado.
A forma longa fixa explicitamente o enderezo de enlace e o protocolo, o que vale as liñas extra en calquera cousa exposta a unha rede. Volve ler a asignación publicada en lugar de confiar no ficheiro que a produciu.
ports:
- 1194:1195/udpOnde se pode deter o paquete
Unha petición pode descartarse antes de Docker, en Docker ou no oínte. Diante de Docker pode haber un cortafogos de nube ou un router que faga o seu propio reenvío, e ese dispositivo necesita o porto orientado ao host e o transporte correcto. Dentro de Docker, unha asignación ao porto de contedor equivocado reenvía a un socket pechado.
Despois o oínte: a configuración de OpenVPN nomea un porto e un protocolo, e un cliente que chega a outro dentro do contedor non chega a nada. Probar un servizo UDP con TCP non demostra nada en ningunha destas etapas, así que usa o transporte que usará o cliente.
Os enderezos de enlace deciden o alcance
Unha asignación publicada ligada a loopback só é accesible desde o host, mentres que unha ligada a todas as interfaces é accesible onde o cortafogos o permita. As dúas parecen idénticas nun ficheiro Compose que omite o enderezo, e o valor por defecto de Docker é o amplo.
Decide que exposición pretende o despregue e despois escríbea explicitamente. Unha proba interna que conecta por loopback e un cliente remoto que non pode conectar poden ser ambas descricións exactas do mesmo contedor.
Le o estado en execución
Inspecciona a asignación efectiva do contedor en execución e o oínte no seu espazo de nomes de rede. Un ficheiro Compose pode ter sido editado despois de arrincar o contedor, os metadatos da imaxe poden declarar un porto sen publicalo, e un segundo contedor pode ocupar xa o porto do host. Declarar un porto nunha imaxe non é publicalo, e ningunha das dúas cousas é o mesmo que escoitar.
Tres estados distintos, tres ordes distintas, e só a última implica OpenVPN.
Cando a asignación é correcta
Unha vez que o paquete chega a OpenVPN, o seu rexistro é o lugar onde ler sobre TLS e autenticación. Rexenerar certificados para arranxar un paquete que nunca chegou é traballo perdido que engade unha segunda variable. Mantén a nota da asignación xunto ao perfil do cliente para que a seguinte persoa lea unha liña en lugar de redescubrir os tres números. Unha captura de paquetes no lado do host resolve cal dos tres elos falla, e custa menos que rexenerar un certificado.
A publicación por ponte é o caso descrito aquí. A rede do host e os enderezos de contedor encamiñados saltan a tradución, así que os mesmos números significan outra cousa neses deseños.