Warum privilegierter Modus mehr gewährt, als ein VPN braucht
Ein privilegierter Container gewährt Geräte und Fähigkeiten, die mit Tunneling nichts zu tun haben. Finden Sie die eine Voraussetzung hinter dem Fehler, bevor Sie ihn als Schalter benutzen.
Der Container wollte seinen Tunnel nicht öffnen, also kam das privilegierte Flag hinein, und jetzt funktioniert es. Diese Reihenfolge belegt nur, dass mindestens eine Berechtigung fehlte, und sie sagt nichts darüber, welche. Der privilegierte Modus gewährt eine Menge an Fähigkeiten und Gerätezugriff, die weit umfassender ist, als eine Tunnelschnittstelle braucht.
Was das Flag tatsächlich ändert
Ein privilegierter Container erhält weitreichende Fähigkeiten und Zugriff auf Geräte des Hosts, was eine viel größere Gewährung ist, als der Netzwerkpfad verlangt. Die genaue Menge wird von der Laufzeitumgebung dokumentiert und nicht durch Überlieferung festgelegt, und die Docker-Dokumentation zum Ausführen von Containern beschreibt die verfügbaren Privilegienoptionen. Einmal lesen genügt, um zu sehen, dass Tunneling ein kleiner Teil des Ganzen ist.
Zwei engere Anforderungen decken die meisten VPN-Container ab. Das Konfigurieren einer Schnittstelle benötigt die Fähigkeit zur Netzwerkverwaltung, und das Öffnen des Tunnelgeräts benötigt Zugriff auf genau diesen Geräteknoten. Das sind getrennte Gewährungen, und selbst beide zusammen sind enger als die pauschale Option. Der Rest der privilegierten Menge hat nichts mit dem Tunnel zu tun. Er existiert für Arbeitslasten, die wirklich Zugriff auf Host-Ebene brauchen, und ein VPN-Container ist normalerweise keine davon.
Ordnen Sie jedem Fehler eine Voraussetzung zu
Die Fehlermeldung sagt Ihnen, welche Voraussetzung fehlt, wenn Sie sie lesen, bevor Sie sie unterdrücken. Eine Meldung über einen Geräteknoten nennt das Gerät, eine Meldung über eine nicht erlaubte Operation nennt eine Fähigkeit, und eine Meldung über ein Modul oder ein sysctl nennt Kernel-Unterstützung. Jede davon hat eine andere Lösung, und nur eine davon ist eine Fähigkeit.
Eine fehlende Konfigurationsdatei bleibt fehlend, nachdem jede Fähigkeit gewährt wurde, weshalb der privilegierte Modus manchmal überhaupt nichts ändert. Der Container startet, der Tunnel schlägt weiterhin fehl, und der eigentliche Fehler hatte nie mit Berechtigungen zu tun. Kernel-Unterstützung ist der dritte Fall und der am leichtesten falsch gelesene. Ein Modul, das auf dem Host nicht geladen ist, lässt sich aus einem nicht privilegierten Container heraus nicht laden, und weitere Fähigkeiten im Container ändern den Zustand des Hosts nicht.
Prüfen Sie die Voraussetzung, nicht das Symptom
Beginnen Sie mit dem minimalen Aufruf, den das Image dokumentiert, führen Sie ihn aus und bewahren Sie den genauen Fehlertext auf. Fügen Sie dann jeweils eine Gewährung hinzu und notieren Sie, welche Ergänzung das Ergebnis geändert hat.
ls -l /dev/net/tun
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun image:tag
ip -br link show type tunEin Container, der das Gerät sieht und die Fähigkeit besitzt, aber trotzdem scheitert, sagt Ihnen, dass das Problem woanders liegt. Das ist ein nützliches Ergebnis, und der privilegierte Modus hätte es verborgen.
Prüfen Sie auch die Geräteberechtigungen auf dem Host, denn ein korrekt gewährter Geräteknoten mit falschem Gruppenbesitz erzeugt denselben Fehler wie eine fehlende Gewährung.
Halten Sie die engste Gewährung fest, die funktioniert
Schreiben Sie jedes Gerät und jede Fähigkeit auf, die die Bereitstellung braucht, zusammen mit dem Fehler, der sie begründet hat. Genau dieser Eintrag ermöglicht es der nächsten Person, etwas sicher zu entfernen, und genau danach wird ein Prüfer fragen, wenn ein Container als privilegiert gemeldet wird.
Prüfen Sie auch den umgebenden Kontext, denn Host-Netzwerk, Host-Mounts und Laufzeitoptionen können jeweils die Wirkung einer Berechtigung erweitern. Ein isolierter Laboraufruf, der alles davon kombiniert, ist keine Produktionskonfiguration, so gut er auch funktioniert hat. Testen Sie die Anwendung, ihr DNS-Verhalten und einen Tunnelfehler, bevor Sie die Bereitstellung als abgeschlossen bezeichnen. Die Berechtigung, eine Schnittstelle zu erstellen, ist keine Ausgangsrichtlinie, und ein Container, der perfekt tunneln kann, leitet trotzdem alles weiter, was die Anwendung sendet.