'n Leë $_ENV skikking in 'n haakskrip voel soos die bewys dat OpenVPN niks deurgegee het nie. Dit is gewoonlik die bewys van iets heeltemal anders: PHP is so ingestel dat hy nie daardie superglobale vul nie, en die waardes het die hele tyd in die proses se omgewing gesit. Die tweede valse gevolgtrekking is subtieler, want die twee adresveranderlikes in 'n verbindingshaak beteken verskillende dinge en word om die beurt gebruik. Albei foute kos jou 'n middag as jy by die verkeerde een begin.

Twee adresse, twee verskillende aansprake

Die buitenste eindpunt is wat die bediener waargeneem het toe die kliënt verbind het, beskikbaar as trusted_ip vir IPv4 en trusted_ip6 vir IPv6. Die virtuele adres is wat die poel vir hierdie sessie toegeken het, beskikbaar as ifconfig_pool_remote_ip.

Hulle beantwoord verskillende vrae, en 'n rekord het gewoonlik een van hulle nodig eerder as albei. Die eerste is waar die verbinding vandaan gekom het, wat 'n gedeelde NAT-adres kan wees wat honderde mense gebruik. Die tweede is waar hierdie sessie binne die tonnel leef, en dit kan later aan 'n ander sessie toegewys word. Om die twee te verwar lewer rekords wat geloofwaardig lyk en verkeerd is.

'n Minimale lees lyk so.

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

Nie een waarde identifiseer 'n persoon nie. Die een is 'n netwerkwaarneming, die ander 'n huur, en 'n rekord wat enige van die twee as 'n stabiele toestelidentifiseerder behandel, sal verkeerd wees die eerste keer dat 'n kliënt van 'n ander netwerk herverbind of 'n ander poeladres kry. Kies die veld volgens die vraag wat die rekord moet beantwoord, en skryf daardie vraag langs die kolom.

Kyk hoe PHP begin is, nie na jou dop nie

Die haak loop as 'n kind van die VPN-daemon met 'n omgewing wat die daemon saamstel. Jou interaktiewe dop het 'n ander een, en om die skrip met die hand te loop toets die dop se omgewing eerder as die haak s'n.

Begin deur te bevestig dat die haak werklik in die fase gevuur het wat jy verwag het. 'n Skrip wat aan die verkeerde fase gekoppel is, of een wat nooit geloop het nie omdat die richtlijn na 'n ander pad wys, lewer presies dieselfde simptoom as 'n ontbrekende veranderlike. Voeg 'n doelbewuste merkerlyn boaan die skrip by en bevestig dat dit verskyn voordat jy iets anders ondersoek. 'n Enkele tydgestempelde lyn in die log skei nooit geloop van geloop sonder die waarde.

Bevestig dan watter tolk en watter konfigurasielêer daardie oproep gebruik. Om die PHP-konfigurasie vir 'n webbediener te wysig, verander niks aan 'n CLI-proses wat deur OpenVPN begin is nie, en die twee kan heeltemal verskillende php.ini-lêers laai.

Waarom 'n leë $_ENV niks bewys nie

PHP se getenv-verwysing dokumenteer 'n direkte lees van die proses se omgewing, wat false teruggee wanneer die naam ontbreek. Die $_ENV superglobale word afsonderlik gevul, en die variables_order richtlijn bepaal watter superglobale gevul word.

As daardie richtlijn E weglaat, bly $_ENV leeg ongeag wat die omgewing bevat. Kode wat dit indekseer, rapporteer dan 'n ontbrekende veranderlike wat in werklikheid daar is, en die ondersoek beweeg na OpenVPN terwyl die antwoord in php.ini is. Kyk spesifiek na die richtlijn vir die CLI-konfigurasie, nie vir die webbediener nie.

Om met getenv te lees, vermy die hele klas verwarring, en 'n omhulskrip wat die omgewing skoonmaak voordat dit die tolk oproep, bring dit in 'n ander vorm terug.

Stoor 'n assosiasie, nie 'n ry-opdatering nie

Bepaal watter waarde die rekord nodig het voordat jy dit skryf. As die doel is om te noteer waar 'n sessie vandaan gekom het, stoor die buitenste eindpunt en noem dit 'n waarneming. As die doel is om 'n sessie aan 'n tonneladres te koppel vir die duur van 'n verbinding, stoor die poeladres en koppel dit aan die sessie.

Dateer op volgens die geoutentifiseerde identiteit en die huidige sessie eerder as volgens elke ry wat 'n tonneladres deel, want poeladresse word hergebruik en 'n laat ontkoppelingsgebeurtenis kan andersins 'n nuwer verbinding se data oorskryf. Hanteer IPv6 eksplisiet in plaas daarvan om stilweg net die IPv4-waarde te skryf. 'n Ry met 'n NULL buitenste adres is beter as 'n ry met die verkeerde een, want die eerste is sigbaar onvolledig.

Koppel die skryf aan die sessie-identifiseerder wat OpenVPN verskaf, sodat 'n herverbinding 'n nuwe rekord skep eerder as om die ou een te wysig. Gebruik geparametriseerde stellings en 'n rekening met net die toestemmings wat die bewerking nodig het. 'n Haak loop met die daemon se gesag, so 'n sorgelose navraag is 'n groter probleem as 'n verkeerde loglyn.

Diagnoseer sonder om die omgewing te stort

Teken aan watter name teenwoordig was, watter fase geloop het en watter tolk gebruik is. Moenie die hele omgewing druk nie, want 'n haakproses kan onverwante waardes erf wat nie in 'n loglêer moet beland nie.

Verifieer een verbinding van begin tot end: lees die buitenste eindpunt, lees die toegekende adres, en bevestig albei teen die bediener se eie siening van daardie sessie. Sodra die paar vir een kliënt bevestig is, kan die assosiasie elders vertrou word.

Verwante artikels