Alguén pregunta por que un usuario de VPN aparece no rexistro da aplicación cun enderezo que pertence á pasarela, ou cun enderezo que cambiou despois de xantar. A resposta comeza por que é ese valor: unha entrada que o servidor web colocou na contorna da petición. Non é unha consulta ao túnel, nin unha identidade de certificado, nin a promesa de que o número pertence a unha soa persoa. Leelo como calquera desas tres cousas produce respostas seguras que están erradas de maneiras distintas.

O valor vén do servidor, non do túnel

PHP recibe a contorna da petición do que executou o script. A referencia das variables de servidor de PHP describe estas entradas como creadas polo servidor web, cunha dispoñibilidade que depende de como chegou a petición.

Un script executado como hook de liña de comandos da VPN é un contexto de execución completamente distinto. Non ten petición web, nin socket de cliente, nin REMOTE_ADDR, e por iso o código web copiado nun hook produce valores baleiros en lugar de erróneos. O hook ten a súa propia contorna, enchida polo daemon, e está documentado por separado. Buscar REMOTE_ADDR alí é buscar unha variable que nunca se definiu.

Ten presente esa distinción antes de comparar dous rexistros. Pode que esteas comparando unha petición de páxina cun hook, e iso non é unha comparación en absoluto. Comproba primeiro o contexto de execución e despois o enderezo.

Percorre a ruta da petición antes de confiar no número

O enderezo informado é o par da conexión que viu o servidor web. Insire calquera cousa entre o cliente e ese servidor e o par cambia. A tradución, a terminación e o balanceo moven cada unha a observación un salto máis lonxe do usuario.

Catro rutas habituais producen catro observacións distintas.

Path to the listenerWhat can be reported
Client routed straight to the private listener, no translationThe client's tunnel address
Gateway translates the source before forwardingThe gateway's translated address
Reverse proxy terminates the client and opens its own backend connectionThe proxy's backend address
Load balancer in front of two proxiesWhichever hop the server treats as its peer

Anota a ruta co nome do destino, a familia de enderezos e cada punto de tradución. Sen ese mapa, un valor correcto e un valor erróneo parecen idénticos nunha liña de rexistro. Dúas liñas de diagrama aforran unha tarde de discusión.

A substitución só ocorre onde está configurada

Un servidor ou un framework pode substituír deliberadamente o enderezo do cliente. O módulo remote-IP de Apache e o módulo real-IP de NGINX fan os dous isto, e o valor que recibe PHP depende desa configuración e dos parámetros que se pasan ao xestor do script.

Así que REMOTE_ADDR non é universalmente o par TCP intacto. É o par tal como o servidor decidiu informalo despois de aplicar a súa propia política. Esa distinción decide se o valor é proba ou adorno.

Pregunta ao responsable do servidor que campo é autoritativo nesta instalación e como se conserva o par orixinal cando hai substitución. Se ninguén sabe responder, o rexistro aínda non proba nada.

Non leas as cabeceiras de reenvío con confianza

Quen chama pode enviar el mesmo cabeceiras de reenvío. Tratar a primeira entrada separada por comas como un enderezo de usuario verificado é decidir crer en quen se conecte, xusto o contrario do propósito da cabeceira. A cabeceira describe unha cadea, e só unha capa de confianza pode responder por esa cadea.

Usa o soporte de proxies de confianza do servidor ou do framework coa cadea de proxies real configurada, e deixa que descarte os valores de fontes alleas a esa cadea. A análise escrita á man é onde viven a maioría dos fallos interesantes.

Un enderezo informado por un proxy tampouco cambia a orixe dos paquetes que ve un devasado anterior. Mantén os metadatos HTTP e o filtrado de rede como observacións separadas, porque responden a preguntas distintas.

Usa a identidade da aplicación para decidir

Para acceder aos rexistros dun usuario, apoiaxe no principal autenticado e nas regras de autorización da aplicación. Un enderezo interno pode reasignarse, e un enderezo traducido pode representar centos de usuarios simultáneos. Ningunha desas propiedades pode reparala unha comprobación de enderezo.

Se as operacións necesitan vincular unha petición a unha sesión VPN, une o enderezo observado e a marca de tempo cos rexistros de sesión autoritativos segundo o modelo de tradución que documentaches. Iso produce unha asociación defendible; un enderezo só, non.

Para o diagnóstico, rexistra os poucos campos que necesitas en lugar de todo o array do servidor, que pode levar cabeceiras e material de autenticación. A conclusión útil di que significa este valor nesta instalación, non que valor se parece máis a un cliente.

Artigos relacionados