Tuščias $_ENV masyvas kablio scenarijuje atrodo kaip įrodymas, kad OpenVPN nieko neperdavė. Paprastai tai įrodo visai ką kita: PHP buvo sukonfigūruotas neužpildyti to supervizualinio kintamojo, o reikšmės visą laiką buvo proceso aplinkoje. Antroji klaidinga išvada yra subtilesnė, nes du adreso kintamieji prisijungimo kabliuke reiškia skirtingus dalykus, o naudojami lyg būtų tarpusavyje pakeičiami. Abi klaidos kainuoja popietę, jei pradedama nuo neteisingos.

Du adresai, du skirtingi teiginiai

Išorinis galinis taškas yra tai, ką serveris stebėjo klientui prisijungus, prieinamas kaip trusted_ip IPv4 atveju ir trusted_ip6 IPv6 atveju. Virtualusis adresas yra tai, ką telkinys priskyrė šiai sesijai, prieinamas kaip ifconfig_pool_remote_ip.

Jie atsako į skirtingus klausimus, o įrašui paprastai reikia vieno iš jų, o ne abiejų. Pirmasis nurodo, iš kur atėjo prisijungimas, ir tai gali būti bendras NAT adresas, naudojamas šimtų žmonių. Antrasis nurodo, kur ši sesija gyvena tunelio viduje, ir vėliau jis gali būti priskirtas kitai sesijai. Sumaišius abu, gaunami įrašai, kurie atrodo tikėtini ir yra neteisingi.

Minimalus skaitymas atrodo taip.

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

Nė viena reikšmė neatpažįsta žmogaus. Viena yra tinklo stebėjimas, kita – nuomos santykis, o įrašas, kuris bet kurią iš jų laiko stabiliu įrenginio identifikatoriumi, bus neteisingas pirmą kartą, kai klientas prisijungs iš kitokio tinklo arba gaus kitą telkinio adresą. Pasirinkite lauką pagal klausimą, į kurį įrašas turi atsakyti, tada užrašykite tą klausimą šalia stulpelio.

Tikrinkite, kaip buvo paleistas PHP, o ne savo apvalkalą

Kablys veikia kaip VPN tarnybos vaikas su aplinka, kurią ta tarnyba sukuria. Jūsų interaktyvusis apvalkalas turi kitokią, o scenarijaus paleidimas ranka tikrina apvalkalo aplinką, o ne kablio.

Pirmiausia patvirtinkite, kad kablys tikrai suveikė tame etape, kurio tikėjotės. Prie netinkamo etapo prijungtas scenarijus arba toks, kuris niekada nevyko, nes direktyva rodo į kitą kelią, duoda lygiai tą patį simptomą kaip trūkstamas kintamasis. Įdėkite sąmoningą žymeklio eilutę scenarijaus viršuje ir patvirtinkite, kad ji pasirodo, prieš tikrindami ką nors kita. Viena eilutė su laiko žyma žurnale atskiria „niekada nevyko“ nuo „vyko be reikšmės“.

Tada patvirtinkite, kurį interpretatorių ir kurį konfigūracijos failą naudoja tas iškvietimas. PHP konfigūracijos keitimas žiniatinklio serveriui nieko nekeičia CLI procesui, paleistam OpenVPN, ir abu gali įkelti visiškai skirtingus php.ini failus.

Kodėl tuščias $_ENV nieko neįrodo

PHP getenv nuoroda aprašo tiesioginį proceso aplinkos skaitymą, kuris grąžina false, kai pavadinimo nėra. $_ENV superglobalas užpildomas atskirai, o direktyva variables_order nusprendžia, kurie superglobalai bus užpildyti.

Jei ta direktyva praleidžia E, $_ENV lieka tuščias, kad ir ką aplinka turėtų. Kodas, kuris jį indeksuoja, tada praneša apie trūkstamą kintamąjį, kuris iš tikrųjų yra, o tyrimas krypsta link OpenVPN, kai atsakymas yra php.ini. Tikrinkite direktyvą būtent CLI konfigūracijai, o ne žiniatinklio serveriui.

Skaitymas su getenv išvengia visos šios painiavos, o apvalkalo scenarijus, kuris išvalo aplinką prieš kviesdamas interpretatorių, ją grąžina kita forma.

Saugokite ryšį, o ne eilutės atnaujinimą

Prieš rašydami nuspręskite, kurios reikšmės reikia įrašui. Jei tikslas – pažymėti, iš kur atėjo sesija, saugokite išorinį galinį tašką ir pažymėkite jį kaip stebėjimą. Jei tikslas – susieti sesiją su tunelio adresu prisijungimo trukmei, saugokite telkinio adresą ir susiekite jį su sesija.

Atnaujinkite pagal autentifikuotą tapatybę ir dabartinę sesiją, o ne pagal kiekvieną eilutę, turinčią tą patį tunelio adresą, nes telkinio adresai naudojami pakartotinai ir vėlyvas atsijungimo įvykis gali perrašyti naujesnio prisijungimo duomenis. Tvarkykite IPv6 aiškiai, o ne tyliai rašykite tik IPv4 reikšmę. Eilutė su NULL išoriniu adresu yra geresnė už eilutę su neteisingu, nes pirmoji akivaizdžiai nepilna.

Susiekite rašymą su sesijos identifikatoriumi, kurį pateikia OpenVPN, kad prisijungimas iš naujo sukurtų naują įrašą, o ne redaguotų senąjį. Naudokite parametrizuotus sakinius ir paskyrą, kuri turi tik operacijai reikalingus leidimus. Kablys veikia su tarnybos įgaliojimais, todėl neapdairi užklausa yra platesnė problema nei neteisinga žurnalo eilutė.

Diagnozuokite neišmetę aplinkos

Registruokite, kurie pavadinimai buvo, kuris etapas vyko ir kuris interpretatorius buvo naudojamas. Nespausdinkite visos aplinkos, nes kablio procesas gali paveldėti nesusijusių reikšmių, kurios neturėtų atsidurti žurnalo faile.

Patikrinkite vieną prisijungimą nuo pradžios iki galo: perskaitykite išorinį galinį tašką, perskaitykite priskirtą adresą ir patvirtinkite abu pagal serverio požiūrį į tą sesiją. Kai pora patvirtinta vienam klientui, ryšiu galima pasitikėti ir kitur.

Susiję straipsniai