Hook de PHP a OpenVPN: trusted_ip enfront de ifconfig_pool_remote_ip
Dues adreces amb dos significats diferents, llegides per un procés que no has iniciat tu. Què són les variables del hook i per què un $_ENV buit no demostra res.
Una matriu $_ENV buida en un script de hook sembla la prova que OpenVPN no ha passat res. Normalment és la prova d'una altra cosa del tot: PHP estava configurat per no omplir aquesta superglobal, i els valors eren a l'entorn del procés tot el temps. La segona conclusió falsa és més subtil, perquè les dues variables d'adreça d'un hook de connexió volen dir coses diferents i s'utilitzen intercanviablement. Tots dos errors costen una tarda si comences pel que no cal.
Dues adreces, dues afirmacions diferents
El punt final extern és el que el servidor va observar quan el client es va connectar, disponible com a trusted_ip per a IPv4 i trusted_ip6 per a IPv6. L'adreça virtual és la que el pool va assignar per a aquesta sessió, disponible com a ifconfig_pool_remote_ip.
Responen preguntes diferents, i un registre normalment necessita una de les dues, no totes dues. La primera és d'on va arribar la connexió, que pot ser una adreça NAT compartida que utilitzen centenars de persones. La segona és on viu aquesta sessió dins del túnel, i es pot reassignar a una altra sessió més endavant. Confondre-les produeix registres que semblen plausibles i són incorrectes.
Una lectura mínima té aquest aspecte.
$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner = getenv('ifconfig_pool_remote_ip');
$outer = $outer4 !== false ? $outer4 : $outer6;Cap de les dues dades identifica una persona. Una és una observació de xarxa, l'altra és un contracte d'arrendament, i un registre que tracti qualsevol de les dues com un identificador estable de dispositiu serà incorrecte la primera vegada que un client es reconnecti des d'una altra xarxa o rebi una altra adreça del pool. Trieu el camp per la pregunta que ha de respondre el registre, i després escriviu aquesta pregunta al costat de la columna.
Comprova com s'ha iniciat PHP, no la teva shell
El hook s'executa com a fill del dimoni VPN amb un entorn que el dimoni construeix. La teva shell interactiva en té un altre, i executar el script a mà prova l'entorn de la shell, no el del hook.
Comença confirmant que el hook s'ha disparat realment a l'etapa que esperaves. Un script lligat a l'etapa equivocada, o un que no s'ha executat mai perquè la directiva apunta a un altre camí, produeix exactament el mateix símptoma que una variable absent. Afegeix una línia marcadora deliberada a la part superior del script i confirma que apareix abans d'inspeccionar res més. Una sola línia amb marca de temps al registre separa «no s'ha executat mai» de «s'ha executat sense el valor».
Després confirma quin intèrpret i quin fitxer de configuració utilitza aquesta invocació. Editar la configuració de PHP d'un servidor web no canvia res en un procés CLI iniciat per OpenVPN, i els dos poden carregar fitxers php.ini completament diferents.
Per què un $_ENV buit no demostra res
La referència de getenv de PHP documenta una lectura directa de l'entorn del procés, que retorna false quan el nom no hi és. La superglobal $_ENV s'omple per separat, i la directiva variables_order decideix quines superglobals s'omplen.
Si aquesta directiva omet E, $_ENV es queda buit passi el que passi a l'entorn. El codi que hi indexa aleshores informa d'una variable absent que de fet hi és, i la investigació va cap a OpenVPN quan la resposta és a php.ini. Comprova la directiva específicament per a la configuració CLI, no per al servidor web.
Llegir amb getenv evita tota aquesta classe de confusió, i un script embolcall que netegi l'entorn abans d'invocar l'intèrpret la reintrodueix en una altra forma.
Desa una associació, no una actualització de fila
Decideix quin valor necessita el registre abans d'escriure'l. Si l'objectiu és anotar d'on ha vingut una sessió, desa el punt final extern i etiqueta'l com una observació. Si l'objectiu és mapar una sessió a una adreça de túnel durant una connexió, desa l'adreça del pool i vincula-la a la sessió.
Actualitza per la identitat autenticada i la sessió actual, no per cada fila que comparteix una adreça de túnel, perquè les adreces del pool es reutilitzen i un esdeveniment de desconnexió tardà pot sobreescriure les dades d'una connexió més nova. Tracta IPv6 explícitament en lloc d'escriure en silenci només el valor IPv4. Una fila amb una adreça externa NULL és millor que una fila amb la incorrecta, perquè la primera és visiblement incompleta.
Vincula l'escriptura a l'identificador de sessió que proporciona OpenVPN, perquè una reconnexió creï un registre nou en lloc d'editar l'antic. Utilitza sentències parametritzades i un compte amb només els permisos que necessita l'operació. Un hook s'executa amb l'autoritat del dimoni, així que una consulta descuidada és un problema més ampli que una línia de registre equivocada.
Diagnostica sense abocar l'entorn
Registra quins noms hi eren, quina etapa s'ha executat i quin intèrpret s'ha utilitzat. No imprimeixis tot l'entorn, perquè un procés de hook pot heretar valors no relacionats que no haurien d'acabar en un fitxer de registre.
Verifica una connexió d'extrem a extrem: llegeix el punt final extern, llegeix l'adreça assignada i confirma totes dues contra la visió pròpia del servidor d'aquesta sessió. Un cop la parella està confirmada per a un client, l'associació es pot confiar en altres llocs.