Një varg $_ENV bosh në një skript grepi duket si provë që OpenVPN nuk ka kaluar asgjë. Zakonisht provon diçka krejt tjetër: PHP ishte konfiguruar të mos e mbush atë superglobale, dhe vlerat qëndronin në mjedisin e procesit gjatë gjithë kohës. Përfundimi i dytë i gabuar është më i hollë, sepse dy variablat e adresës në grepin e lidhjes nënkuptojnë gjëra të ndryshme dhe përdoren në mënyrë të këmbyeshme. Të dyja gabimet kushtojnë një pasdite nëse filloni me të gabuarën.

Dy adresa, dy pohime të ndryshme

Pika e jashtme fundore është ajo që serveri vëzhgoi kur klienti u lidh, e disponueshme si trusted_ip për IPv4 dhe trusted_ip6 për IPv6. Adresa virtuale është ajo që pishina caktoi për këtë sesion, e disponueshme si ifconfig_pool_remote_ip.

Ato përgjigjen pyetjeve të ndryshme, dhe një regjistrim zakonisht ka nevojë për njërën prej tyre, jo për të dyja. E para është nga erdhi lidhja, e cila mund të jetë një adresë NAT e përbashkët e përdorur nga qindra njerëz. E dyta është ku jeton ky sesion brenda tunelit, dhe mund t'i caktohet një sesioni tjetër më vonë. Ngatërrimi i të dyjave prodhon regjistrime që duken të besueshme dhe janë të gabuara.

Një lexim minimal duket kështu.

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

Asnjëra vlerë nuk identifikon një person. Njëra është vëzhgim rrjeti, tjetra është qira, dhe një regjistrim që trajton secilën prej tyre si identifikues të qëndrueshëm pajisjeje do të jetë i gabuar herën e parë që një klient rilidhet nga një rrjet tjetër ose merr një adresë tjetër pishine. Zgjidhni fushën sipas pyetjes që regjistrimi duhet të përgjigjet, pastaj shkruani atë pyetje pranë kolonës.

Kontrolloni si u nis PHP, jo shell-in tuaj

Grepi ekzekutohet si fëmijë i demonit VPN me një mjedis që demoni e ndërton. Shell-i juaj interaktiv ka një tjetër, dhe ekzekutimi i skriptit me dorë teston mjedisin e shell-it, jo atë të grepit.

Filloni duke konfirmuar që grepi me të vërtetë u aktivizua në fazën që prisnit. Një skript i lidhur me fazën e gabuar, ose një që nuk u ekzekutua kurrë sepse direktiva tregon një shteg tjetër, prodhon saktësisht të njëjtin simptom si një variabël që mungon. Shtoni një rresht shënuesi të qëllimshëm në krye të skriptit dhe konfirmoni që shfaqet përpara se të inspektoni çdo gjë tjetër. Një rresht i vetëm me vulë kohore në regjistër ndan «nuk u ekzekutua kurrë» nga «u ekzekutua pa vlerën».

Pastaj konfirmoni cilin interpretues dhe cilin skedar konfigurimi përdor ai thirrje. Redaktimi i konfigurimit të PHP për një server web nuk ndryshon asgjë në një proces CLI të nisur nga OpenVPN, dhe të dy mund të ngarkojnë skedarë php.ini krejt të ndryshëm.

Pse një $_ENV bosh nuk provon asgjë

PHP referenca getenv dokumenton një lexim të drejtpërdrejtë të mjedisit të procesit, i cili kthen false kur emri mungon. Superglobalja $_ENV mbushet veçmas, dhe direktiva variables_order vendos cilat superglobale mbushen.

Nëse ajo direktivë lë jashtë E, $_ENV mbetet bosh pavarësisht se çfarë përmban mjedisi. Kodi që e indekson atëherë raporton një variabël që mungon, e cila në fakt është e pranishme, dhe hetimi shkon drejt OpenVPN ndërsa përgjigjja ndodhet në php.ini. Kontrolloni direktivën posaçërisht për konfigurimin CLI, jo për serverin web.

Leximi me getenv shmang të gjithë këtë konfuzion, dhe një skript mbështjellës që pastron mjedisin përpara se të thërrasë interpretuesin e riktheu atë në një formë tjetër.

Ruani një lidhje, jo një përditësim rreshti

Vendosni se cilën vlerë i nevojitet regjistrimit përpara se ta shkruani. Nëse qëllimi është të shënohet nga erdhi sesioni, ruani pikën e jashtme fundore dhe etiketoni si vëzhgim. Nëse qëllimi është të lidhet një sesion me një adresë tuneli për kohëzgjatjen e lidhjes, ruani adresën e pishinës dhe lidheni me sesionin.

Përditësoni sipas identitetit të autentikuar dhe sesionit aktual, jo sipas çdo rreshti që ndan një adresë tuneli, sepse adresat e pishinës ripërdoren dhe një ngjarje e vonë shkëputjeje mund të mbishkruajë të dhënat e një lidhjeje më të re. Trajtoni IPv6 në mënyrë eksplicite në vend që të shkruani në heshtje vetëm vlerën IPv4. Një rresht me adresë të jashtme NULL është më i mirë se një rresht me atë të gabuar, sepse i pari është dukshëm i paplotë.

Lidhni shkrimin me identifikuesin e sesionit që ofron OpenVPN, në mënyrë që rilidhja të krijojë një regjistrim të re dhe jo të modifikojë të vjetrin. Përdorni deklarata të parametrizuara dhe një llogari me vetëm lejet që i nevojiten operacionit. Grepi ekzekutohet me autoritetin e demonit, pra një pyetje e pakujdesshme është problem më i gjerë sesa një rresht regjistri i gabuar.

Diagnostikoni pa e hedhur mjedisin

Regjistroni cilat emra ishin të pranishëm, cila fazë u ekzekutua dhe cili interpretues u përdor. Mos shtypni të gjithë mjedisin, sepse një proces grepi mund të trashëgojë vlera të palidhura që nuk duhet të përfundojnë në një skedar regjistri.

Verifikoni një lidhje nga fillimi në fund: lexoni pikën e jashtme fundore, lexoni adresën e caktuar dhe konfirmoni të dyja kundrejt pamjes së vetë serverit për atë sesion. Pasi çifti konfirmohet për një klient, lidhjes mund t'i besohet edhe diku tjetër.

Artikuj të ngjashëm