Que che di realmente REMOTE_ADDR de PHP detrás dunha VPN
É un valor que forneceu o teu servidor web, non unha consulta ao túnel. Percorre a ruta da petición, comproba quen pode reescribila e mantén a identidade na aplicación.
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 listener | What can be reported |
|---|---|
| Client routed straight to the private listener, no translation | The client's tunnel address |
| Gateway translates the source before forwarding | The gateway's translated address |
| Reverse proxy terminates the client and opens its own backend connection | The proxy's backend address |
| Load balancer in front of two proxies | Whichever 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.