Setzt een VPN-Client an e Container an Dir kritt een Nummensraum mat engem Tunnel dran, net een Host deen säin ganze Verkéier iwwer eng VPN leet. Dat sinn getrennte Projeten, an se als een ze behandelen ass de Wee wéi Containere fälleg privilegéiert ginn. Dëse Guide deckt just dat éischt of: een gepréift Image, ee geschützte Profil an e Clientprozess deen op säin eegenen Netzwierk-Nummensraum beschränkt ass.

Fänkt mat engem Artefakt un, deen een aneren schonn approuvéiert huet. D'Schrëtt hei drënner gi vun engem Image aus, deen de openvpn-Ausféierbar enthält an e komplette Clientprofil mat sengem Zertifikat a Schlësselmaterial dat schonn am Mount opgeléist ass. Si bauen keng Software, ginn keng Authentifikatiounsdonnéeën aus a decken weder rootlos Runtime-Ëmgerlaachen nach natif Windows-Containere of, déi all d'Äntwert änneren.

Wat de Container kritt an wat net

Halt de Profil an alles op dat en referenzéiert an engem lokalen Verzeechnes mat restriktive Rechter, als nëmme-lies gemount. Relativ Weeër am Profil mussen an deem Mount opgeléist ginn; dat ass en Detail deen d'Leit iwwersinn wann en Zertifikat een Verzeechnes iwwer dem Profil läit an de Container et ni gesäit.

services:
  vpn:
    image: ${VPN_CLIENT_IMAGE:?set the reviewed image reference}
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    volumes:
      - ./vpn:/vpn:ro
    working_dir: /vpn
    entrypoint: ["openvpn"]
    command: ["--config", "/vpn/client.ovpn"]

Dee Fichier gëtt dräi Saachen a freet näischt anescht. D'Image-Referenz soll per Digest fixéiert ginn wann Är Deploymentspolitik dat seet, an de Profil soll dee gepréiften sinn, net eng Kopie déi een um Host op der Plaz geännert huet.

Nëmme-lies heescht hei, datt de Container Är Hostfichieren net ännere kann; et heescht net, datt de Container de private Schlëssel deen Dir gemount hutt net liese kann. Dat ass de ganzen Zweck vum Mount, an dofir spillen Dateirechter, Proprietéit a wéi de Geheimnis um Host ukomm ass nach ëmmer eng Roll. Gitt ni e Passwuert op der Kommandozeil a bakt et net an eng Image-Schicht, well béides op Plazen iwwerlieft, déi Dir spéider net kënnt botzen.

Kapazitéiten, entrypoint an de Fall tëschent hinnen

Zwou Astellunge sinn néideg an si maachen onverbonne Aarbecht. NET_ADMIN erlaabt Interface- an Route-Manipulatioun am Nummensraum vum Container. Den Apparatentrag /dev/net/tun erlaabt dem Prozess den Tunnelapparat iwwerhaapt opzemaachen. Een ouni deen aneren ze ginn produzéiert e kloere Fehler, wat praktesch ass: een feelenden TUN-Apparat feelt beim Opmaachen, wärend eng feelend Kapazitéit feelt wann de Client d'Interface konfiguréiere wëll.

Keen vun deenen zwee rechtfertegt privileged: true. Een privilegéierten Container kritt all Kapazitéit plus Apparatzougang, an dat ass eng vill méi grouss Bewëllegung wéi dës Aarbechtslaascht brauch. D'Referenz zu Runtime-Privilegien a Kapazitéiten erklärt wéi wäit dës Bewëllegung geet. Wann e Chart oder e Blogpost et freet, kontrolléiert als éischt ob d'Fuerderung tatsächlech e feelende Apparatwee oder eng feelend Kapazitéit war.

D'Iwwerschreiwen vum entrypoint ass den Deel deen bäisst. Den openvpn direkt opzeruffen ass richteg fir en einfacht Image a falsch fir all Produktimage deem säi Startskript Firewall-Reegelen, Resolver-Fichieren oder Authentifikatiounsdonnéeën virbereet ier en den Daemon ausféiert. Dëst Skript z'iwwerschreiwen iwwerspréngt d'Virbereedung an hält Iech beim Debugge vun engem Tunnel deen an engem hallef konfiguréierten Nummensraum opkomm ass.

Loosst de Client am Virdergrond lafen an loosst en de Haaptprozess vum Container sinn. E Prozess deen daemoneséiert geet direkt eraus, de Container startet an enger Loop nei, an d'Logs déi Dir braucht sinn iwwer Neistarts verdeelt déi all d'selwecht ausgesinn.

Verifizéiert vun bannen am Nummensraum, net vum Host

Hieft de Stack erop, bestätegt am Log datt de Client en verbonnene Zustand erreecht huet, an ënnersicht dann den Nummensraum deen den Tunnel tatsächlech hält.

docker compose up -d
docker compose logs --tail 40 vpn
docker compose exec vpn ip -br addr
docker compose exec vpn ip route

D'Adresslëscht soll en Tunnelinterface weisen mat enger Adress aus dem Pool, an d'Routentabelle soll déi gepusht Destinatiounen weisen déi drop weisen. Wann d'Interface feelt, ass de Client ni bis zum Punkt komm wou en se mécht. Wann et se gëtt awer keng Route se benotzt, ass d'Plaz fir ze sichen de Push oder d'Routeoptiounen.

Test dann d'Destinatioun déi Iech wichteg ass, aus dem Nummensraum deen den Tunnel benotze soll, mat der Applikatioun an net just mat engem Ping. Nummaufléisung ass e separate Fehler deen et wäert ass explizit ze testen: eng gepusht DNS-Adress aktualiséiert den Resolver vun engem Container net vu selwer, an e autonome Client deen de Push ignoréiert wäert Nimm iwwer dat opléisen wat d'Image konfiguréiert huet.

Den ofgetrennten Zoustand ass Deel vum Kontrakt

D'Reconnect-Verhalen brauch seng eege Kontroll, well eng Restartpolitik beweist datt de Prozess nei startet an näischt seet iwwer wat den Verkéier tëschenduerch mécht. Stopp den Tunnel, probéier d'beabsichtegt Destinatioun an observéier ob d'Verbindung verweigert gëtt, hänkt oder stëlldaach iwwer déi gewéinlech Route vum Container geléngt. Déi lescht Resultat ass dat wat zielt, an et ass onsiichtbar an engem gesonden Log.

Wann d'Aarbechtslaascht ni de gewéinleche Wee däerf benotzen, designéiert dat explizit mat Firewall-Reegelen an engem Bereetschaftssignal am Nummensraum. E Kill Switch ass eng Politik déi Dir schreift an testt, net eng Eegenschaft déi Dir ierft duerch d'Lafe vun engem Client an engem Container.

Denkt schlussendlech un d'Grenz: dës Route liewen am Nummensraum vum Container an ersetzen net d'Routingtabelle vum Host. Dem Docker seng Weiderleeungs-, Iwwersetzungs- a Firewall-Reegelen bleiwen Deel vum baussenzege Wee, an eng publizéiert Port ass keng VPN-Interface.

Ähnlech Artikelen