Warum dein Docker-VPN-Portmapping OpenVPN nie erreicht
Host-Port, Container-Port und Transport sind drei getrennte Entscheidungen. Verfolge einen UDP-Versuch über jede Grenze, bevor du Zertifikate anfasst.
Dein Container kann auf UDP 1195 lauschen, während der Host 1194 veröffentlicht, und das ist richtig, solange das Mapping es so sagt. Die Nummern bilden eine Übersetzungstabelle: Der Client wählt den Host-Port, Docker schreibt das Ziel auf den Container-Port um, und OpenVPN antwortet auf dem Port, den seine eigene Konfiguration nennt. Eine Abweichung an einer dieser Stellen erzeugt einen stillen Fehler, der wie eine Firewall aussieht. Zertifikate und Verschlüsselungsverfahren liegen dahinter und können ihn nicht reparieren.
Verfolge ein Paket vom Client bis zum Prozess, bevor du etwas an der Authentifizierung änderst.
Drei Nummern, eine Verbindung
Die drei Nummern sind das entfernte Ziel, das der Client nutzt, das veröffentlichte Mapping auf dem Host und der Listener im Container. Sie müssen nicht gleich sein, aber sie müssen eine Kette bilden. Gleiche Nummern sind ein Sonderfall, der zufällig der häufigste ist; deshalb ist eine Abweichung schnell einmal geschrieben und später schwer zu sehen.
Schreibe die Kette vor dem Debuggen als eine Zeile auf: Client-Adresse und -Port, Host-Mapping, Container-Listener, Transport. Ein Defekt in der Kette zeigt sich als eine Nummer, die zweimal mit unterschiedlichen Werten auftaucht.
| Location | Example |
|---|---|
| Remote client destination | Host address, UDP 1194 |
| Published mapping | Host UDP 1194 to container UDP 1195 |
| Container listener | OpenVPN on UDP 1195 |
Was die Kurzform wirklich sagt
In der Kurzform ist die linke Seite der Host-Port und die rechte der Container-Port, und ein Schrägstrich-Suffix wählt den Transport. Lässt man das Suffix weg, behandelt Docker das Mapping als TCP, sodass ein UDP-Listener hinter einem Mapping ohne Protokoll ein Listener ist, den niemand erreicht. Dieser Standard ist dokumentiert und überrascht noch immer Leute, die die Nummern passend gemacht und die Sache für erledigt erklärt haben.
Die Langform legt Bindeadresse und Protokoll ausdrücklich fest, was die zusätzlichen Zeilen bei allem wert ist, das einem Netzwerk zugewandt ist. Lies das veröffentlichte Mapping zurück, statt der Datei zu vertrauen, die es erzeugt hat.
ports:
- 1194:1195/udpWo das Paket stoppen kann
Eine Anfrage kann vor Docker, in Docker oder am Listener verworfen werden. Vor Docker kann eine Cloud-Firewall oder ein Router mit eigener Weiterleitung stehen, und dieses Gerät braucht den hostseitigen Port und den richtigen Transport. Innerhalb von Docker leitet ein Mapping auf den falschen Container-Port an einen geschlossenen Socket weiter.
Dann der Listener: Die OpenVPN-Konfiguration nennt einen Port und ein Protokoll, und ein Client, der im Container auf einem anderen ankommt, erreicht nichts. TCP-Tests eines UDP-Dienstes beweisen auf keiner dieser Stufen etwas, also nutze den Transport, den der Client verwenden wird.
Bindeadressen entscheiden die Erreichbarkeit
Ein veröffentlichtes Mapping an Loopback ist nur vom Host aus erreichbar, während eines an allen Schnittstellen erreichbar ist, wo die Firewall es zulässt. In einer Compose-Datei ohne Adresse sehen beide gleich aus, und der Docker-Standard ist der breite.
Entscheide, welche Exposition die Bereitstellung beabsichtigt, und schreibe sie dann ausdrücklich. Ein interner Test über Loopback und ein entfernter Client, der sich nicht verbinden kann, können beide zutreffende Beschreibungen desselben Containers sein.
Lies den laufenden Zustand
Prüfe das effektive Mapping des laufenden Containers und den Listener in seinem Netzwerk-Namespace. Eine Compose-Datei kann nach dem Start des Containers bearbeitet worden sein, Image-Metadaten können einen Port deklarieren, ohne ihn zu veröffentlichen, und ein zweiter Container kann den Host-Port bereits halten. Einen Port im Image zu deklarieren ist nicht dasselbe wie ihn zu veröffentlichen, und beides ist nicht dasselbe wie lauschen.
Drei verschiedene Zustände, drei verschiedene Befehle, und nur der letzte betrifft OpenVPN.
Wenn das Mapping stimmt
Sobald das Paket OpenVPN erreicht, ist sein Protokoll der Ort, an dem man über TLS und Authentifizierung liest. Zertifikate neu zu erzeugen, um ein Paket zu reparieren, das nie ankam, ist verschwendete Arbeit, die eine zweite Variable einführt. Halte die Mapping-Notiz neben dem Client-Profil, damit die nächste Person eine Zeile liest, statt alle drei Nummern neu zu entdecken. Eine Paketaufzeichnung auf der Host-Seite klärt, welche der drei Stellen falsch ist, und kostet weniger als eine Zertifikatserneuerung.
Die hier beschriebene Veröffentlichung ist die über eine Bridge. Host-Netzwerk und geroutete Container-Adressen überspringen die Übersetzung, sodass dieselben Nummern in diesen Entwürfen etwas anderes bedeuten.