Un tablou $_ENV gol într-un script de hook pare o dovadă că OpenVPN nu a transmis nimic. De obicei este dovada cu totul altceva: PHP era configurat să nu populeze acea superglobală, iar valorile se aflau în mediul procesului tot timpul. A doua concluzie falsă este mai subtilă, pentru că cele două variabile de adresă dintr-un hook de conexiune înseamnă lucruri diferite și sunt folosite interschimbabil. Ambele greșeli costă o după-amiază dacă începeți cu cea greșită.

Două adrese, două afirmații diferite

Punctul final exterior este ceea ce serverul a observat când clientul s-a conectat, disponibil ca trusted_ip pentru IPv4 și trusted_ip6 pentru IPv6. Adresa virtuală este ceea ce pool-ul a atribuit pentru această sesiune, disponibilă ca ifconfig_pool_remote_ip.

Răspund la întrebări diferite, iar o înregistrare are de obicei nevoie de una dintre ele, nu de ambele. Prima este de unde a venit conexiunea, care poate fi o adresă NAT partajată de sute de oameni. A doua este unde trăiește această sesiune în interiorul tunelului și poate fi reatribuită altei sesiuni mai târziu. Confundarea celor două produce înregistrări care par plauzibile și sunt greșite.

O citire minimă arată astfel.

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

Niciuna dintre valori nu identifică o persoană. Una este o observație de rețea, cealaltă este o concesiune, iar o înregistrare care tratează oricare dintre ele ca identificator stabil al dispozitivului va fi greșită prima dată când un client se reconectează din altă rețea sau primește altă adresă din pool. Alegeți câmpul după întrebarea la care înregistrarea trebuie să răspundă, apoi scrieți acea întrebare lângă coloană.

Verificați cum a fost lansat PHP, nu shell-ul dumneavoastră

Hook-ul rulează ca fiu al demonului VPN cu un mediu pe care demonul îl construiește. Shell-ul interactiv are altul, iar rularea scriptului manual testează mediul shell-ului, nu pe cel al hook-ului.

Începeți prin a confirma că hook-ul a declanșat într-adevăr în etapa pe care o așteptați. Un script atașat etapei greșite, sau unul care nu a rulat niciodată pentru că directiva indică altă cale, produce exact același simptom ca o variabilă lipsă. Adăugați o linie de marcaj deliberată în capul scriptului și confirmați că apare înainte de a inspecta orice altceva. O singură linie cu marcaj temporal în jurnal separă «nu a rulat niciodată» de «a rulat fără valoare».

Apoi confirmați ce interpretor și ce fișier de configurare folosește acea invocare. Editarea configurației PHP pentru un server web nu schimbă nimic la un proces CLI pornit de OpenVPN, iar cele două pot încărca fișiere php.ini complet diferite.

De ce un $_ENV gol nu dovedește nimic

PHP referința getenv documentează o citire directă a mediului procesului, care returnează false când numele lipsește. Superglobala $_ENV este populată separat, iar directiva variables_order decide ce superglobale sunt completate.

Dacă acea directivă omite E, $_ENV rămâne goală indiferent ce conține mediul. Codul care o indexează raportează atunci o variabilă lipsă care de fapt există, iar investigația merge spre OpenVPN când răspunsul este în php.ini. Verificați directiva special pentru configurația CLI, nu pentru serverul web.

Citirea cu getenv evită toată această confuzie, iar un script de împachetare care curăță mediul înainte de a invoca interpretorul o reintroduce într-o altă formă.

Stocați o asociere, nu o actualizare de rând

Decideți de ce valoare are nevoie înregistrarea înainte de a o scrie. Dacă scopul este să notați de unde a venit o sesiune, stocați punctul final exterior și etichetați-l ca observație. Dacă scopul este să asociați o sesiune cu o adresă de tunel pe durata unei conexiuni, stocați adresa din pool și legați-o de sesiune.

Actualizați după identitatea autentificată și sesiunea curentă, nu după fiecare rând care partajează o adresă de tunel, pentru că adresele din pool sunt reutilizate și un eveniment de deconectare târziu poate altfel suprascrie datele unei conexiuni mai noi. Tratați IPv6 explicit în loc să scrieți în tăcere doar valoarea IPv4. Un rând cu adresă exterioară NULL este mai bun decât un rând cu cea greșită, pentru că primul este vizibil incomplet.

Legați scrierea de identificatorul de sesiune pe care îl oferă OpenVPN, astfel încât o reconectare să creeze o înregistrare nouă în loc să o editeze pe cea veche. Folosiți instrucțiuni parametrizate și un cont cu doar permisiunile de care are nevoie operația. Un hook rulează cu autoritatea demonului, deci o interogare neglijentă este o problemă mai largă decât o linie de jurnal greșită.

Diagnosticați fără a descărca mediul

Înregistrați ce nume erau prezente, ce etapă a rulat și ce interpretor a fost folosit. Nu tipăriți tot mediul, pentru că un proces de hook poate moșteni valori nelegate care nu ar trebui să ajungă într-un fișier de jurnal.

Verificați o conexiune de la un capăt la altul: citiți punctul final exterior, citiți adresa atribuită și confirmați ambele față de propria vedere a serverului asupra acelei sesiuni. Odată confirmată perechea pentru un client, asocierii i se poate acorda încredere și în altă parte.

Articole similare