Waarom je Docker VPN-poortmapping OpenVPN nooit bereikt
Hostpoort, containerpoort en transport zijn drie afzonderlijke beslissingen. Volg één UDP-poging door elke grens voordat je certificaten aanraakt.
Je container kan op UDP 1195 luisteren terwijl de host 1194 publiceert, en dat is juist zolang de mapping dat zegt. De nummers vormen een vertaaltabel: de client kiest de hostpoort, Docker herschrijft de bestemming naar de containerpoort, en OpenVPN antwoordt op de poort die zijn eigen configuratie noemt. Een mismatch in een van die schakels levert een stille fout op die op een firewall lijkt. Certificaten en cijfers staan stroomafwaarts en kunnen dat niet repareren.
Volg één pakket van client tot proces voordat je iets aan de authenticatie verandert.
Drie nummers, één verbinding
De drie nummers zijn de externe bestemming die de client gebruikt, de gepubliceerde mapping op de host en de luisteraar in de container. Ze hoeven niet gelijk te zijn, maar moeten een keten vormen. Gelijke nummers zijn een speciaal geval dat toevallig het gewoonste is, daarom is een mismatch makkelijk één keer te schrijven en later moeilijk te zien.
Schrijf de keten op één regel voordat je gaat debuggen: clientadres en -poort, hostmapping, containerluisteraar, transport. Een fout in de keten verschijnt als een nummer dat twee keer met verschillende waarden voorkomt.
| Location | Example |
|---|---|
| Remote client destination | Host address, UDP 1194 |
| Published mapping | Host UDP 1194 to container UDP 1195 |
| Container listener | OpenVPN on UDP 1195 |
Wat de korte syntaxis werkelijk zegt
In de korte vorm is de linkerkant de hostpoort en de rechterkant de containerpoort, en een schuine-streep-achtervoegsel kiest het transport. Laat je het achtervoegsel weg, dan behandelt Docker de mapping als TCP, dus een UDP-luisteraar achter een mapping zonder protocol is een luisteraar die niemand kan bereiken. Die standaard is gedocumenteerd en verrast nog steeds mensen die de nummers kloppend maakten en het klaar noemden.
De lange vorm legt het bindadres en het protocol expliciet vast, wat de extra regels waard is voor alles wat op een netwerk is gericht. Lees de gepubliceerde mapping terug in plaats van het bestand te vertrouwen dat hem heeft gemaakt.
ports:
- 1194:1195/udpWaar het pakket kan stoppen
Een verzoek kan vóór Docker, in Docker of bij de luisteraar worden weggegooid. Vóór Docker kan een cloudfirewall of een router staan die zelf doorstuurt, en dat apparaat heeft de hostpoort en het juiste transport nodig. Binnen Docker stuurt een mapping naar de verkeerde containerpoort door naar een gesloten socket.
Dan de luisteraar: de OpenVPN-configuratie noemt een poort en een protocol, en een client die binnen de container op een andere aankomt, bereikt niets. TCP testen van een UDP-dienst bewijst in geen van deze fasen iets, dus gebruik het transport dat de client gaat gebruiken.
Bindadressen bepalen bereikbaarheid
Een gepubliceerde mapping die aan loopback is gebonden, is alleen vanaf de host bereikbaar, terwijl een mapping aan alle interfaces bereikbaar is waar de firewall het toestaat. Die twee zien er identiek uit in een Compose-bestand dat het adres weglaat, en de Docker-standaard is de brede.
Bepaal welke blootstelling de uitrol bedoelt en schrijf die dan expliciet op. Een interne test die via loopback verbindt en een externe client die niet kan verbinden, kunnen beide nauwkeurige beschrijvingen van dezelfde container zijn.
Lees de draaiende toestand
Inspecteer de effectieve mapping van de draaiende container en de luisteraar in zijn netwerknaamruimte. Een Compose-bestand kan zijn bewerkt nadat de container startte, image-metadata kan een poort declareren zonder die te publiceren, en een tweede container kan de hostpoort al bezetten. Een poort in een image declareren is niet hetzelfde als publiceren, en geen van beide is hetzelfde als luisteren.
Drie verschillende toestanden, drie verschillende commando's, en alleen de laatste betreft OpenVPN.
Als de mapping klopt
Zodra het pakket OpenVPN bereikt, is zijn log de plek om over TLS en authenticatie te lezen. Certificaten opnieuw genereren om een pakket te repareren dat nooit aankwam, is verspilde arbeid die een tweede variabele toevoegt. Houd de mappingnotitie naast het clientprofiel zodat de volgende persoon één regel leest in plaats van alle drie de nummers opnieuw te ontdekken. Eén pakketopname aan de hostkant beslist welke van de drie schakels fout is, en dat kost minder dan een certificaatvernieuwing.
Publicatie via een bridge is het geval dat hier wordt beschreven. Hostnetwerken en gerouteerde containeradressen slaan de vertaling over, dus dezelfde nummers betekenen daar iets anders.