En eidelt $_ENV-Array an engem Hook-Skript fillt sech wéi de Beweis, datt OpenVPN näischt iwwerginn huet. Meeschtens ass et de Beweis fir eppes ganz Aneres: PHP war sou konfiguréiert, datt et déi Superglobal net fëllt, an d'Wäerter souzen déi ganz Zäit an der Ëmwelt vum Prozess. Déi zweet falsch Schlussfolgerung ass subtiler, well déi zwou Adressvariabelen an engem Verbindungs-Hook verschidden Saachen bedeiten an duercherneen benotzt ginn. Béid Feeler kaschten en Nomëtteg, wann dir mat der falscher ufänkt.

Zwou Adressen, zwou verschidde Behauptungen

Den äusseren Endpunkt ass dat, wat de Server beim Verbannen vum Client observéiert huet, verfügbar als trusted_ip fir IPv4 an trusted_ip6 fir IPv6. Déi virtuell Adress ass déi, déi de Pool fir dës Sëtzung zougewisen huet, verfügbar als ifconfig_pool_remote_ip.

Si äntweren op verschidde Froe, an en Datensaz brauch meeschtens eng vun deenen zwou amplaz vu béiden. Déi éischt ass wou d'Verbindung hierkënnt, wat eng gedeelt NAT-Adress ka sinn, déi Honnerte vu Leit benotzen. Déi zweet ass wou dës Sëtzung am Tunnel lieft, an se ka méi spéit enger anerer Sëtzung zougewisen ginn. D'Verwiessele vun deenen zwou produzéiert Datensätz, déi plausibel ausgesinn an falsch sinn.

En minimale Liese gesäit esou aus.

$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner  = getenv('ifconfig_pool_remote_ip');
$outer  = $outer4 !== false ? $outer4 : $outer6;

Keen vun deenen zwee Wäerter identifizéiert eng Persoun. Dee een ass eng Netzwierkobservatioun, deen aneren eng Locatioun, an en Datensaz, deen een vun deenen zwee als stabil Apparatidentifiant behandelt, wäert falsch sinn déi éischte Kéier, wann e Client vun engem aneren Netzwierk nei verbënnt oder eng aner Pooladress kritt. Wielt d'Feld no der Fro, déi den Datensaz muss beäntweren, an da schreift déi Fro nieft d'Kolonnen.

Préift wéi PHP gestart gouf, net Är Shell

Den Hook leeft als Kand vum VPN-Daemon mat enger Ëmwelt, déi den Daemon baut. Är interaktiv Shell huet eng aner, an de Skript vun Hand ze starten test d'Ëmwelt vun der Shell amplaz vun där vum Hook.

Fänkt domat un ze bestätegen, datt den Hook wierklech an der Etapp ausgeléist gouf, déi dir erwaart hutt. E Skript, dat un der falscher Etapp hänkt, oder een, deen ni gelaf ass, well d'Direktiv op en anere Wee weist, gëtt genau deeselwechte Symptom wéi eng feelend Variabel. Setzt eng bewosst Markéierungszeil uewen an de Skript an bestätegt, datt se erschéngt, ier dir eppes anescht ënnersicht. Eng eenzeg Zeil mat Zäitstempel am Log trennt ni gelaf vu gelaf ouni de Wäert.

Bestätegt dann, wéi en Interpretator a wéi eng Konfiguratiounsdatei deen Opruff benotzt. D'PHP-Konfiguratioun fir e Webserver z'änneren ännert näischt un engem CLI-Prozess, deen OpenVPN start, an déi zwou kënnen ganz verschidde php.ini-Dateien lueden.

Firwat en eidelt $_ENV näischt beweist

PHP seng getenv-Referenz dokumentéiert e direkte Lies vun der Ëmwelt vum Prozess, deen false zréckgëtt, wann den Numm feelt. D'Superglobal $_ENV gëtt getrennt gefëllt, an d'Direktiv variables_order entscheet, wéi eng Superglobalen gefëllt ginn.

Wann déi Direktiv E ewechléisst, bleift $_ENV eidel, egal wat an der Ëmwelt ass. Code, deen en indexéiert, mellelt dann eng feelend Variabel, déi tatsächlech do ass, an d'Enquête geet Richtung OpenVPN, wärend d'Äntwert an php.ini ass. Préift d'Direktiv speziell fir d'CLI-Konfiguratioun, net fir de Webserver.

Mat getenv ze liese vermeit déi ganz Klass vu Verwiesselung, an e Wrapper-Skript, deen d'Ëmwelt eidel mécht ier en den Interpretator oprufft, bréngt se an enger anerer Form zeréck.

Späichert eng Associatioun, net eng Zeilen-Aktualiséierung

Entscheet, wéi en Wäert den Datensaz brauch, ier dir en schreift. Wann d'Zil ass ze vermierken, wou eng Sëtzung hierkënnt, späichert den äusseren Endpunkt a markéiert en als Observatioun. Wann d'Zil ass eng Sëtzung fir d'Dauer vun enger Verbindung enger Tunneladress zouzeuerdnen, späichert d'Pooladress a verknëppt se mat der Sëtzung.

Aktualiséiert no der authentifizéierter Identitéit an der aktueller Sëtzung amplaz no all Zeil, déi eng Tunneladress deelt, well Pooladressen nei benotzt ginn an en spéiden Ofbriecher-Event soss d'Donnéeë vun enger méi neier Verbindung iwwerschreiwe kann. Behandelt IPv6 explizit, amplaz just de IPv4-Wäert stëll ze schreiwen. Eng Zeil mat enger NULL äusserer Adress ass besser wéi eng mat der falscher, well déi éischt sichtbar onvollstänneg ass.

Verknëppt d'Schreiwen un de Sëtzungs-Identifiant, deen OpenVPN liwwert, sou datt eng Neiverbindung en neien Datensaz schafft amplaz den alen z'änneren. Benotzt parametriséiert Aussoen an e Kont mat just de Rechter, déi d'Operatioun brauch. En Hook leeft mat der Vollmacht vum Daemon, also ass eng suergfälteg Ufro e gréissere Problem wéi eng falsch Logzeil.

Diagnostizéiert ouni d'Ëmwelt erauszeschëdden

Logt wéi eng Nimm do waren, wéi eng Etapp gelaf ass a wéi en Interpretator benotzt gouf. Dréckt net déi ganz Ëmwelt, well en Hook-Prozess onverbonne Wäerter ierwe kann, déi net an eng Logdatei gehéieren.

Verifizéiert eng Verbindung vum Ufank bis zum Schluss: liest den äusseren Endpunkt, liest déi zougewisen Adress a bestätegt béid géint dem Server seng eege Vue op déi Sëtzung. Soubal de Puer fir ee Client bestätegt ass, kann der Associatioun anzwousch anescht vertraut ginn.

Ähnlech Artikelen