Unha matriz $_ENV baleira nun script de hook parece a proba de que OpenVPN non pasou nada. Normalmente é a proba de algo completamente distinto: PHP estaba configurado para non encher esa superglobal, e os valores levaban todo o tempo no contorno do proceso. A segunda conclusión falsa é máis sutil, porque as dúas variables de dirección dun hook de conexión significan cousas distintas e úsanse de xeito intercambiable. Ambos os erros custan unha tarde se comezas polo equivocado.

Dúas direccións, dúas afirmacións distintas

O extremo externo é o que o servidor observou cando se conectou o cliente, dispoñible como trusted_ip para IPv4 e trusted_ip6 para IPv6. A dirección virtual é a que o pool asignou a esta sesión, dispoñible como ifconfig_pool_remote_ip.

Responden a preguntas distintas, e un rexistro normalmente necesita unha das dúas en lugar de ambas. A primeira é de onde chegou a conexión, que pode ser unha dirección NAT compartida por centos de persoas. A segunda é onde vive esta sesión dentro do túnel, e pode reasignarse a outra sesión máis adiante. Confundir as dúas produce rexistros que parecen plausibles e son incorrectos.

Unha lectura mínima ten este aspecto.

$outer4 = getenv('trusted_ip');
$outer6 = getenv('trusted_ip6');
$inner  = getenv('ifconfig_pool_remote_ip');
$outer  = $outer4 !== false ? $outer4 : $outer6;

Ningún dos dous valores identifica a unha persoa. Un é unha observación de rede, o outro un arrendamento, e un rexistro que trate calquera dos dous como identificador estable de dispositivo estará mal a primeira vez que un cliente se reconecte desde outra rede ou reciba outra dirección do pool. Escolle o campo pola pregunta que debe responder o rexistro, e logo escribe esa pregunta xunto á columna.

Comproba como se lanzou PHP, non a túa shell

O hook execútase como fillo do demonio VPN cun contorno que o demonio constrúe. A túa shell interactiva ten outro, e executar o script a man proba o contorno da shell e non o do hook.

Comeza confirmando que o hook se disparou realmente na etapa que esperabas. Un script ligado á etapa equivocada, ou un que nunca se executou porque a directiva apunta a outra ruta, produce exactamente o mesmo síntoma que unha variable ausente. Engade unha liña marcadora deliberada ao principio do script e confirma que aparece antes de inspeccionar calquera outra cousa. Unha soa liña con marca de tempo no rexistro separa nunca se executou de executouse sen o valor.

Despois confirma que intérprete e que ficheiro de configuración usa esa invocación. Editar a configuración de PHP dun servidor web non cambia nada nun proceso CLI iniciado por OpenVPN, e ambos poden cargar ficheiros php.ini completamente distintos.

Por que un $_ENV baleiro non demostra nada

A referencia de getenv de PHP documenta unha lectura directa do contorno do proceso, que devolve false cando o nome non está. A superglobal $_ENV énchese por separado, e a directiva variables_order decide que superglobais se enchen.

Se esa directiva omite E, $_ENV queda baleira sen importar o que conteña o contorno. O código que a indexa entón informa dunha variable ausente que en realidade está presente, e a investigación vai cara a OpenVPN cando a resposta está en php.ini. Comproba a directiva especificamente para a configuración CLI, non para o servidor web.

Ler con getenv evita toda esta clase de confusión, e un script envoltorio que limpe o contorno antes de invocar o intérprete reintrodúcea noutra forma.

Garda unha asociación, non unha actualización de fila

Decide que valor necesita o rexistro antes de escribilo. Se o obxectivo é anotar de onde veu unha sesión, garda o extremo externo e etiquétao como observación. Se o obxectivo é mapear unha sesión a unha dirección de túnel durante unha conexión, garda a dirección do pool e vincúlaa á sesión.

Actualiza pola identidade autenticada e a sesión actual en lugar de por cada fila que comparte unha dirección de túnel, porque as direccións do pool reutilízanse e un evento de desconexión tardío pode sobrescribir os datos dunha conexión máis recente. Trata IPv6 de xeito explícito en vez de escribir en silencio só o valor IPv4. Unha fila cunha dirección externa NULL é mellor que unha coa equivocada, porque a primeira é visiblemente incompleta.

Vincula a escritura ao identificador de sesión que proporciona OpenVPN, para que unha reconexión cree un rexistro novo en lugar de editar o antigo. Usa sentenzas parametrizadas e unha conta con só os permisos que necesita a operación. Un hook execútase coa autoridade do demonio, así que unha consulta descoidada é un problema máis amplo que unha liña de rexistro errónea.

Diagnostica sen botar o contorno

Rexistra que nomes estaban presentes, que etapa se executou e que intérprete se usou. Non imprimas todo o contorno, porque un proceso de hook pode herdar valores alleos que non deberían acabar nun ficheiro de rexistro.

Verifica unha conexión de extremo a extremo: le o extremo externo, le a dirección asignada e confirma ambas contra a visión propia do servidor desa sesión. Unha vez confirmado o par para un cliente, a asociación pódese confiar noutros lugares.

Artigos relacionados