OpenVPN PHP-hoko: trusted_ip kontraŭ ifconfig_pool_remote_ip
Du adresoj kun du malsamaj signifoj, legataj de procezo, kiun vi ne lanĉis. Kio estas la hokaj variabloj, kaj kial malplena $_ENV pruvas nenion.
Malplena tabelo $_ENV en hoka skripto ŝajnas pruvo, ke OpenVPN nenion transdonis. Kutime ĝi estas pruvo pri io tute alia: PHP estis agordita ne plenigi tiun superglobulon, kaj la valoroj sidis en la proceza medio la tutan tempon. La dua malĝusta konkludo estas pli subtila, ĉar la du adresaj variabloj en konekta hoko signifas malsamajn aferojn kaj estas uzataj interŝanĝeble. Ambaŭ eraroj kostas posttagmezon, se vi komencas per la malĝusta.
Du adresoj, du malsamaj asertoj
La ekstera finpunkto estas tio, kion la servilo observis kiam la kliento konektiĝis, disponebla kiel trusted_ip por IPv4 kaj trusted_ip6 por IPv6. La virtuala adreso estas tio, kion la baseno atribuis por ĉi tiu seanco, disponebla kiel ifconfig_pool_remote_ip.
Ili respondas al malsamaj demandoj, kaj rikordo kutime bezonas unu el ili anstataŭ ambaŭ. La unua estas de kie la konekto venis, kio povas esti komuna NAT-adreso uzata de centoj da homoj. La dua estas kie ĉi tiu seanco loĝas ene de la tunelo, kaj ĝi povas esti reatribuita al alia seanco poste. Konfuzi la du produktas rikordojn, kiuj aspektas kredindaj kaj estas malĝustaj.
Minimuma legado aspektas tiel.
$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner = getenv('ifconfig_pool_remote_ip');
$outer = $outer4 !== false ? $outer4 : $outer6;Neniu el la du valoroj identigas personon. Unu estas reta observo, la alia estas luo, kaj rikordo, kiu traktas ajnan el ili kiel stabilan aparatan identigilon, estos malĝusta la unuan fojon, kiam kliento rekonektiĝos el alia reto aŭ ricevos alian basenan adreson. Elektu la kampon laŭ la demando, kiun la rikordo devas respondi, kaj poste skribu tiun demandon apud la kolumno.
Kontrolu, kiel PHP estis lanĉita, ne vian ŝelon
La hoko funkcias kiel infano de la VPN-demonoj kun medio, kiun la demono konstruas. Via interaga ŝelo havas alian, kaj ruli la skripton permane testas la medion de la ŝelo anstataŭ tiun de la hoko.
Komencu per konfirmo, ke la hoko vere ekfunkciis en la etapo, kiun vi atendis. Skripto ligita al la malĝusta etapo, aŭ unu, kiu neniam ruliĝis ĉar la direktivo montras al alia vojo, donas ĝuste la saman simptomon kiel mankanta variablo. Aldonu intencan markan linion ĉe la supro de la skripto kaj konfirmu, ke ĝi aperas antaŭ ol vi kontroli ion ajn alian. Unu linio kun tempindiko en la protokolo apartigas neniam ruliĝis de ruliĝis sen la valoro.
Poste konfirmu, kiun interpretilon kaj kiun agordan dosieron tiu alvoko uzas. Redakti la PHP-agordon por retservilo ŝanĝas nenion pri CLI-procezo lanĉita de OpenVPN, kaj la du povas ŝargi tute malsamajn dosierojn php.ini.
Kial malplena $_ENV pruvas nenion
La getenv-referenco de PHP dokumentas rektan legadon de la proceza medio, kiu redonas false kiam la nomo mankas. La superglobulo $_ENV estas plenigata aparte, kaj la direktivo variables_order decidas, kiuj superglobuloj pleniĝos.
Se tiu direktivo preterlasas E, $_ENV restas malplena sendepende de tio, kion la medio enhavas. Kodo, kiu indeksas ĝin, tiam raportas mankantan variablon, kiu fakte ĉeestas, kaj la esplorado iras al OpenVPN dum la respondo estas en php.ini. Kontrolu la direktivon specife por la CLI-agordo, ne por la retservilo.
Legi per getenv evitas la tutan ĉi tiun klason de konfuzo, kaj ĉirkaŭa skripto, kiu purigas la medion antaŭ ol alvoki la interpretilon, reenkondukas ĝin en alia formo.
Konservu asocion, ne ĝisdatigon de vico
Decidu, kiun valoron la rikordo bezonas antaŭ ol skribi ĝin. Se la celo estas noti, de kie seanco venis, konservu la eksteran finpunkton kaj etikedu ĝin kiel observon. Se la celo estas mapi seancon al tunela adreso dum la daŭro de konekto, konservu la basenan adreson kaj ligu ĝin al la seanco.
Ĝisdatigu laŭ la aŭtentikigita identeco kaj la aktuala seanco anstataŭ laŭ ĉiu vico, kiu dividas tunelan adreson, ĉar basenaj adresoj estas reuzataj kaj malfrua malkonekta evento alie povas anstataŭigi la datumojn de pli nova konekto. Traktu IPv6 eksplicite anstataŭ silente skribi nur la IPv4-valoron. Vico kun NULL ekstera adreso estas pli bona ol vico kun la malĝusta, ĉar la unua estas videble nekompleta.
Ligu la skribon al la seanca identigilo, kiun OpenVPN provizas, por ke rekonekto kreu novan rikordon anstataŭ redakti la malnovan. Uzu parametrigitajn deklarojn kaj konton kun nur la permesoj, kiujn la operacio bezonas. Hoko funkcias kun la aŭtoritato de la demono, do senzorga demando estas pli vasta problemo ol malĝusta protokola linio.
Diagnozu sen elŝuti la medion
Protokolu, kiuj nomoj ĉeestis, kiu etapo ruliĝis kaj kiu interpretilo estis uzata. Ne presu la tutan medion, ĉar hoka procezo povas heredi nerilatajn valorojn, kiuj ne devus finiĝi en protokola dosiero.
Kontrolu unu konekton de komenco ĝis fino: legu la eksteran finpunkton, legu la atribuitan adreson, kaj konfirmu ambaŭ kontraŭ la propra vido de la servilo pri tiu seanco. Post kiam la paro konfirmiĝis por unu kliento, la asocio povas esti fidita aliloke.