OpenVPN PHP kuka: trusted_ip nasuprot ifconfig_pool_remote_ip
Dvije adrese s dva različita značenja, koje čita proces koji niste pokrenuli. Šta su varijable kuke i zašto prazan $_ENV ništa ne dokazuje.
Prazan niz $_ENV u skripti kuke izgleda kao dokaz da OpenVPN nije ništa prenio. Obično dokazuje nešto sasvim drugo: PHP je bio konfigurisan da ne popunjava tu superglobalnu varijablu, a vrijednosti su sve vrijeme stajale u okruženju procesa. Drugi pogrešan zaključak je suptilniji, jer dvije varijable adrese u kuki veze znače različite stvari i koriste se kao zamjenjive. Obje greške koštaju jedno poslijepodne ako se počne s pogrešnom.
Dvije adrese, dvije različite tvrdnje
Spoljna krajnja tačka je ono što je server primijetio kad se klijent povezao, dostupna kao trusted_ip za IPv4 i trusted_ip6 za IPv6. Virtuelna adresa je ono što je bazen dodijelio ovoj sesiji, dostupna kao ifconfig_pool_remote_ip.
Odgovaraju na različita pitanja, a zapisu obično treba jedna od njih, ne obje. Prva govori odakle je veza došla, što može biti dijeljena NAT adresa koju koriste stotine ljudi. Druga govori gdje ova sesija živi unutar tunela, i može se kasnije dodijeliti drugoj sesiji. Miješanje dviju 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 vrijednost ne identifikuje osobu. Jedna je mrežno posmatranje, druga je zakup, a zapis koji bilo koju od njih tretira kao stabilan identifikator uređaja bit će pogrešan prvi put kad se klijent ponovo poveže iz druge mreže ili dobije drugu adresu bazena. Izaberite polje prema pitanju na koje zapis mora odgovoriti, pa to pitanje upišite pored kolone.
Provjerite kako je PHP pokrenut, a ne svoju ljusku
Kuka radi kao dijete VPN demona s okruženjem koje demon gradi. Vaša interaktivna ljuska ima drugo, a ručno pokretanje skripte provjerava okruženje ljuske, a ne kuke.
Počnite time što ćete potvrditi da se kuka zaista aktivirala u fazi koju ste očekivali. Skripta prikačena na pogrešnu fazu, ili ona koja nikad nije pokrenuta jer direktiva pokazuje na drugu putanju, daje tačno isti simptom kao varijabla koja nedostaje. Dodajte namjernu liniju oznake na vrh skripte i potvrdite da se pojavljuje prije nego što provjerite bilo šta drugo. Jedna linija s vremenskom oznakom u dnevniku razdvaja „nikad nije pokrenuta“ od „pokrenuta bez vrijednosti“.
Zatim potvrdite koji interpretator i koju konfiguracionu datoteku koristi taj poziv. Mijenjanje PHP konfiguracije za web server ne mijenja ništa kod CLI procesa koji pokrene OpenVPN, i oba mogu učitati sasvim različite php.ini datoteke.
Zašto prazan $_ENV ništa ne dokazuje
PHP referenca za getenv opisuje direktno čitanje okruženja procesa, koje vraća false kada imena nema. Superglobalna $_ENV se popunjava odvojeno, a direktiva variables_order odlučuje koje će se superglobalne popuniti.
Ako ta direktiva izostavi E, $_ENV ostaje prazna bez obzira na to šta okruženje sadrži. Kod koji je indeksira tada prijavljuje varijablu koja nedostaje, a koja je zapravo prisutna, i istraga ide prema OpenVPN-u dok je odgovor u php.ini. Provjerite direktivu posebno za CLI konfiguraciju, ne za web server.
Čitanje pomoću getenv izbjegava cijelu ovu zbrku, a omotna skripta koja čisti okruženje prije pozivanja interpretatora vraća je u drugom obliku.
Čuvajte povezanost, a ne ažuriranje reda
Odlučite koja vrijednost treba zapisu prije nego što ga upišete. Ako je cilj zabilježiti odakle je sesija došla, sačuvajte spoljnu krajnju tačku i označite je kao posmatranje. Ako je cilj povezati sesiju s adresom tunela za vrijeme trajanja veze, sačuvajte adresu bazena i vežite je za sesiju.
Ažurirajte po autentifikovanom identitetu i trenutnoj sesiji, a ne po svakom redu koji dijeli adresu tunela, jer se adrese bazena koriste ponovo i kasni događaj prekida može inače prepisati podatke novije veze. Obrađujte IPv6 eksplicitno umjesto da tiho upisujete samo IPv4 vrijednost. Red s NULL spoljnom adresom bolji je od reda s pogrešnom, jer je prvi vidljivo nepotpun.
Vežite upis za identifikator sesije koji OpenVPN daje, tako da ponovno povezivanje stvori novi zapis umjesto da uređuje stari. Koristite parametrizovane naredbe i račun sa samo onim dozvolama koje operacija traži. Kuka radi s ovlašćenjima demona, pa je nepažljiv upit širi problem od pogrešne linije dnevnika.
Dijagnostikujte bez izbacivanja okruženja
Bilježite koja su imena bila prisutna, koja faza se izvršila i koji je interpretator korišten. Ne štampajte cijelo okruženje, jer proces kuke može naslijediti nepovezane vrijednosti koje ne bi trebalo da završe u datoteci dnevnika.
Provjerite jednu vezu od početka do kraja: pročitajte spoljnu krajnju tačku, pročitajte dodijeljenu adresu i potvrdite obje prema vlastitom viđenju te sesije na serveru. Kad je par potvrđen za jednog klijenta, povezanosti se može vjerovati i drugdje.