OpenVPN PHP hook: trusted_ip nasuprot ifconfig_pool_remote_ip
Dvije adrese s dva različita značenja, koje čita proces koji niste pokrenuli vi. Šta su varijable hooka i zašto prazan $_ENV ništa ne dokazuje.
Prazan niz $_ENV u hook skripti izgleda kao dokaz da OpenVPN nije prenio ništa. Obično je to dokaz nečeg sasvim drugog: PHP je bio podešen da ne popunjava taj superglobal, a vrijednosti su cijelo vrijeme stajale u okruženju procesa. Drugi pogrešan zaključak je suptilniji, jer dvije varijable adrese u hooku za vezu znače različite stvari i koriste se naizmjenično. Obje greške koštaju jedno poslijepodne ako počnete od pogrešne.
Dvije adrese, dvije različite tvrdnje
Vanjski krajnji punkt je ono što je server primijetio kada se klijent povezao, dostupno kao trusted_ip za IPv4 i trusted_ip6 za IPv6. Virtuelna adresa je ono što je pool dodijelio za ovu sesiju, dostupno kao ifconfig_pool_remote_ip.
One odgovaraju na različita pitanja, a zapis obično treba jednu od njih, a ne obje. Prva je odakle je veza stigla, što može biti zajednička NAT adresa koju koriste stotine ljudi. Druga je gdje ova sesija živi unutar tunela i može se kasnije dodijeliti drugoj sesiji. Miješanje njih dvije daje zapise koji izgledaju uvjerljivo i pogrešni su.
Minimalno čitanje izgleda ovako.
$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner = getenv('ifconfig_pool_remote_ip');
$outer = $outer4 !== false ? $outer4 : $outer6;Nijedna od dvije vrijednosti ne identifikuje osobu. Jedna je mrežno opažanje, druga je zakup, a zapis koji bilo koju od njih tretira kao stabilan identifikator uređaja bit će pogrešan prvi put kada se klijent ponovo poveže s druge mreže ili dobije drugu adresu iz poola. Odaberite polje prema pitanju na koje zapis mora odgovoriti, a zatim to pitanje napišite pored kolone.
Provjerite kako je PHP pokrenut, ne svoj shell
Hook radi kao dijete VPN daemona s okruženjem koje daemon gradi. Vaš interaktivni shell ima drugačije, a ručno pokretanje skripte testira okruženje shella, a ne hooka.
Počnite potvrđivanjem da se hook zaista aktivirao u fazi koju ste očekivali. Skripta vezana za pogrešnu fazu, ili ona koja nikada nije pokrenuta jer direktiva pokazuje na drugu putanju, daje tačno isti simptom kao nedostajuća varijabla. Dodajte namjernu marker liniju na vrh skripte i potvrdite da se pojavljuje prije nego što pregledate bilo šta drugo. Jedna linija s vremenskom oznakom u logu razdvaja „nikad nije pokrenuto“ od „pokrenuto bez vrijednosti“.
Zatim potvrdite koji interpretator i koji konfiguracijski fajl koristi taj poziv. Uređivanje PHP konfiguracije za web server ne mijenja ništa kod CLI procesa koji pokreće OpenVPN, a njih dvoje mogu učitati sasvim različite php.ini fajlove.
Zašto prazan $_ENV ništa ne dokazuje
PHP-ova getenv referenca dokumentuje direktno čitanje okruženja procesa, koje vraća false kada ime nije prisutno. Superglobal $_ENV se popunjava odvojeno, a direktiva variables_order odlučuje koji će se superglobali popuniti.
Ako ta direktiva izostavi E, $_ENV ostaje prazan bez obzira na to šta okruženje sadrži. Kod koji ga indeksira tada prijavljuje nedostajuću varijablu koja je zapravo prisutna, a istraga ide prema OpenVPN-u dok je odgovor u php.ini. Provjerite direktivu posebno za CLI konfiguraciju, ne za web server.
Čitanje s getenv izbjegava cijelu ovu klasu zabune, a wrapper skripta koja čisti okruženje prije pozivanja interpretatora vraća je u drugom obliku.
Sačuvajte asocijaciju, ne ažuriranje reda
Odlučite koja vrijednost treba zapisu prije nego što ga napišete. Ako je cilj zabilježiti odakle je sesija došla, sačuvajte vanjski krajnji punkt i označite ga kao opažanje. Ako je cilj mapirati sesiju na adresu tunela za trajanje veze, sačuvajte adresu iz poola i vežite je za sesiju.
Ažurirajte prema autentifikovanom identitetu i trenutnoj sesiji, a ne prema svakom redu koji dijeli adresu tunela, jer se adrese iz poola ponovo koriste i zakašnjeli događaj prekida može inače prepisati podatke novije veze. Obradite IPv6 eksplicitno umjesto da tiho upisujete samo IPv4 vrijednost. Red s NULL vanjskom adresom bolji je od reda s pogrešnom, jer je prvi vidljivo nepotpun.
Vežite upis za identifikator sesije koji OpenVPN pruža, tako da ponovno povezivanje stvara novi zapis umjesto uređivanja starog. Koristite parametrizovane naredbe i račun sa samo onim dozvolama koje operacija zahtijeva. Hook radi s ovlaštenjima daemona, pa je nepažljiv upit širi problem od pogrešne log linije.
Dijagnostikujte bez ispisivanja okruženja
Zabilježite koja su imena bila prisutna, koja faza je radila i koji je interpretator korišten. Ne ispisujte cijelo okruženje, jer hook proces može naslijediti nepovezane vrijednosti koje ne bi trebale završiti u log fajlu.
Provjerite jednu vezu od početka do kraja: pročitajte vanjski krajnji punkt, pročitajte dodijeljenu adresu i potvrdite oboje prema serverovom vlastitom pogledu na tu sesiju. Kada je par potvrđen za jednog klijenta, asocijaciji se može vjerovati i drugdje.