Prazen seznam $_ENV v skriptu kavlja je videti kot dokaz, da OpenVPN ni ničesar posredoval. Običajno dokazuje nekaj povsem drugega: PHP je bil nastavljen tako, da te nadglobalne spremenljivke ne napolni, vrednosti pa so ves čas stale v okolju procesa. Drugi napačni sklep je bolj subtilen, ker dve naslovni spremenljivki v kavlju povezave pomenita različne stvari in se uporabljata zamenljivo. Obe napaki staneta popoldne, če začnete z napačno.

Dva naslova, dve različni trditvi

Zunanja končna točka je tisto, kar je strežnik opazoval ob povezavi odjemalca, na voljo kot trusted_ip za IPv4 in trusted_ip6 za IPv6. Navidezni naslov je tisto, kar je nabor dodelil tej seji, na voljo kot ifconfig_pool_remote_ip.

Odgovarjata na različna vprašanja in zapis običajno potrebuje enega od njiju, ne obeh. Prvi pove, od kod je povezava prišla, kar je lahko skupni naslov NAT, ki ga uporabljajo stotine ljudi. Drugi pove, kje ta seja živi znotraj tunela, in se lahko pozneje dodeli drugi seji. Zamenjevanje obeh ustvari zapise, ki so videti verjetni in so napačni.

Minimalno branje je videti tako.

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

Nobena vrednost ne prepozna osebe. Ena je omrežno opazovanje, druga je najem, in zapis, ki katero koli od njiju obravnava kot stabilen identifikator naprave, bo napačen prvič, ko se odjemalec znova poveže iz drugega omrežja ali prejme drug naslov iz nabora. Izberite polje glede na vprašanje, na katero mora zapis odgovoriti, nato to vprašanje zapišite ob stolpec.

Preverite, kako je bil PHP zagnan, ne svoje lupine

Kavelj teče kot otrok demona VPN z okoljem, ki ga demon zgradi. Vaša interaktivna lupina ima drugo, in ročno zaganjanje skripta preverja okolje lupine, ne kavlja.

Začnite s potrditvijo, da se je kavelj res sprožil v fazi, ki ste jo pričakovali. Skript, pripet na napačno fazo, ali tak, ki se ni nikoli zagnal, ker direktiva kaže na drugo pot, daje natanko enak simptom kot manjkajoča spremenljivka. Dodajte namerno označevalno vrstico na vrh skripta in potrdite, da se pojavi, preden pregledate karkoli drugega. Ena vrstica s časovnim žigom v dnevniku loči «nikoli se ni zagnal» od «se je zagnal brez vrednosti».

Nato potrdite, kateri tolmač in katero konfiguracijsko datoteko uporablja ta klic. Urejanje konfiguracije PHP za spletni strežnik ne spremeni ničesar pri procesu CLI, ki ga zažene OpenVPN, in oba lahko naložita povsem različne datoteke php.ini.

Zakaj prazen $_ENV ničesar ne dokazuje

PHP referenca getenv opisuje neposredno branje okolja procesa, ki vrne false, ko imena ni. Nadglobalna spremenljivka $_ENV se polni ločeno, direktiva variables_order pa odloči, katere nadglobalne se napolnijo.

Če ta direktiva izpusti E, $_ENV ostane prazen ne glede na to, kaj okolje vsebuje. Koda, ki ga indeksira, nato poroča o manjkajoči spremenljivki, ki v resnici obstaja, in preiskava gre proti OpenVPN, medtem ko je odgovor v php.ini. Preverite direktivo posebej za konfiguracijo CLI, ne za spletni strežnik.

Branje z getenv se izogne vsej tej zmedi, in ovojni skript, ki počisti okolje pred klicem tolmača, jo vrne v drugi obliki.

Shranite povezavo, ne posodobitve vrstice

Preden zapišete, se odločite, katero vrednost zapis potrebuje. Če je cilj zabeležiti, od kod je seja prišla, shranite zunanjo končno točko in jo označite kot opazovanje. Če je cilj povezati sejo z naslovom tunela za trajanje povezave, shranite naslov iz nabora in ga povežite s sejo.

Posodabljajte po overjeni identiteti in trenutni seji, ne po vsaki vrstici, ki si deli naslov tunela, ker se naslovi iz nabora uporabljajo znova in poznejši dogodek prekinitve lahko sicer prepiše podatke novejše povezave. Obravnavajte IPv6 izrecno, namesto da tiho zapišete samo vrednost IPv4. Vrstica z NULL zunanjim naslovom je boljša od vrstice z napačnim, ker je prva vidno nepopolna.

Zapis povežite z identifikatorjem seje, ki ga ponuja OpenVPN, da ponovna povezava ustvari nov zapis, namesto da bi urejala starega. Uporabite parametrizirane stavke in račun samo z dovoljenji, ki jih operacija potrebuje. Kavelj teče s pooblastilom demona, zato je neprevidna poizvedba širši problem kot napačna vrstica dnevnika.

Diagnosticirajte, ne da bi izlili okolje

Beležite, katera imena so bila prisotna, katera faza se je izvedla in kateri tolmač je bil uporabljen. Ne natisnite celotnega okolja, ker proces kavlja lahko podeduje nepovezane vrednosti, ki ne bi smele pristati v dnevniški datoteki.

Preverite eno povezavo od začetka do konca: preberite zunanjo končno točko, preberite dodeljeni naslov in oba potrdite glede na strežnikov lastni pogled na to sejo. Ko je par potrjen za enega odjemalca, je povezavi mogoče zaupati tudi drugje.

Sorodni članki