OpenVPN PHP āķis: trusted_ip pret ifconfig_pool_remote_ip
Divi adreses ar divām atšķirīgām nozīmēm, ko nolasa process, kuru jūs nepalaidāt. Kādi ir āķa mainīgie un kāpēc tukšs $_ENV neko nepierāda.
Tukšs $_ENV masīvs āķa skriptā šķiet pierādījums, ka OpenVPN neko nenodeva. Parasti tas pierāda pavisam ko citu: PHP bija konfigurēts neaizpildīt šo superglobālo mainīgo, un vērtības visu laiku atradās procesa vidē. Otrais nepareizais secinājums ir smalkāks, jo divi adreses mainīgie savienojuma āķī nozīmē dažādas lietas un tiek lietoti kā savstarpēji aizstājami. Abas kļūdas maksā pēcpusdienu, ja sāk no nepareizās.
Divas adreses, divi dažādi apgalvojumi
Ārējais galapunkts ir tas, ko serveris novēroja, kad klients pievienojās, pieejams kā trusted_ip IPv4 gadījumā un trusted_ip6 IPv6 gadījumā. Virtuālā adrese ir tas, ko pūls piešķīra šai sesijai, pieejama kā ifconfig_pool_remote_ip.
Tie atbild uz dažādiem jautājumiem, un ierakstam parasti vajag vienu no tiem, nevis abus. Pirmais norāda, no kurienes savienojums ieradās, un tas var būt kopīga NAT adrese, ko izmanto simtiem cilvēku. Otrais norāda, kur šī sesija atrodas tunelī, un vēlāk to var piešķirt citai sesijai. Sajaucot abus, rodas ieraksti, kas izskatās ticami un ir nepareizi.
Minimāla nolasīšana izskatās šādi.
$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner = getenv('ifconfig_pool_remote_ip');
$outer = $outer4 !== false ? $outer4 : $outer6;Neviena vērtība neidentificē cilvēku. Viena ir tīkla novērojums, otra ir noma, un ieraksts, kas jebkuru no tām uzskata par stabilu ierīces identifikatoru, būs nepareizs pirmajā reizē, kad klients pārslēgsies no cita tīkla vai saņems citu pūla adresi. Izvēlieties lauku pēc jautājuma, uz kuru ierakstam jāatbild, un pēc tam ierakstiet šo jautājumu blakus kolonnai.
Pārbaudiet, kā PHP tika palaists, nevis savu čaulu
Āķis darbojas kā VPN dēmona bērnprocess ar vidi, ko dēmons izveido. Jūsu interaktīvajai čaulai ir cita vide, un skripta palaišana ar roku pārbauda čaulas, nevis āķa vidi.
Vispirms pārliecinieties, ka āķis patiešām nostrādāja tajā posmā, kuru gaidījāt. Skripts, kas pievienots nepareizajam posmam vai tāds, kas nekad neizpildījās, jo direktīva norāda citu ceļu, rada tieši to pašu simptomu kā trūkstošs mainīgais. Pievienojiet apzinātu marķiera rindu skripta sākumā un pārliecinieties, ka tā parādās, pirms pārbaudāt ko citu. Viena rinda ar laikspiedolu žurnālā atdala „nekad neizpildījās“ no „izpildījās bez vērtības“.
Pēc tam pārliecinieties, kuru interpretatoru un kuru konfigurācijas failu šis izsaukums izmanto. PHP konfigurācijas maiņa tīmekļa serverim neko nemaina CLI procesam, ko palaida OpenVPN, un abi var ielādēt pilnīgi atšķirīgus php.ini failus.
Kāpēc tukšs $_ENV neko nepierāda
PHP getenv atsauce apraksta tiešu procesa vides nolasīšanu, kas atgriež false, ja nosaukuma nav. $_ENV superglobālais mainīgais tiek aizpildīts atsevišķi, un direktīva variables_order izlemj, kuri superglobālie mainīgie tiks aizpildīti.
Ja šī direktīva izlaiž E, $_ENV paliek tukšs neatkarīgi no tā, ko satur vide. Kods, kas to indeksē, tad ziņo par trūkstošu mainīgo, kurš patiesībā ir, un izmeklēšana virzās uz OpenVPN, kamēr atbilde ir php.ini. Pārbaudiet direktīvu tieši CLI konfigurācijai, nevis tīmekļa serverim.
Nolasīšana ar getenv izvairās no visas šīs neskaidrības, un ietvara skripts, kas notīra vidi pirms interpretatora izsaukšanas, to atgriež citā formā.
Glabājiet saistību, nevis rindas atjauninājumu
Pirms rakstīšanas izlemiet, kura vērtība ierakstam vajadzīga. Ja mērķis ir atzīmēt, no kurienes sesija nāca, glabājiet ārējo galapunktu un apzīmējiet to kā novērojumu. Ja mērķis ir saistīt sesiju ar tuneļa adresi savienojuma laikā, glabājiet pūla adresi un piesaistiet to sesijai.
Atjauniniet pēc autentificētās identitātes un pašreizējās sesijas, nevis pēc katras rindas, kurai ir viena tuneļa adrese, jo pūla adreses tiek izmantotas atkārtoti un novēls atvienošanās notikums citādi var pārrakstīt jaunāka savienojuma datus. Apstrādājiet IPv6 skaidri, nevis klusām rakstiet tikai IPv4 vērtību. Rinda ar NULL ārējo adresi ir labāka par rindu ar nepareizu, jo pirmā ir redzami nepilnīga.
Piesaistiet rakstīšanu sesijas identifikatoram, ko nodrošina OpenVPN, lai atkārtots savienojums izveidotu jaunu ierakstu, nevis rediģētu veco. Izmantojiet parametrizētus vaicājumus un kontu, kuram ir tikai darbībai nepieciešamās atļaujas. Āķis darbojas ar dēmona pilnvarām, tāpēc nevīžīgs vaicājums ir plašāka problēma nekā nepareiza žurnāla rinda.
Diagnosticējiet, neizgāžot vidi
Žurnālā ierakstiet, kuri nosaukumi bija, kurš posms darbojās un kurš interpretators tika izmantots. Nedrukājiet visu vidi, jo āķa process var mantot nesaistītas vērtības, kurām nevajadzētu nonākt žurnāla failā.
Pārbaudiet vienu savienojumu no sākuma līdz beigām: nolasiet ārējo galapunktu, nolasiet piešķirto adresi un apstipriniet abus pret servera paša skatījumu uz šo sesiju. Kad pāris ir apstiprināts vienam klientam, saistībai var uzticēties arī citur.