Jump to content

Consulta TÉCNICA - Como Recuperar IP visitante si pasa por un balanceador de carga


Recommended Posts

En todos los clientes se puede ver desde qué IP un cliente a conectado con tu página web:

 

post-1412705-0-55174200-1507736305_thumb.png <-- Captura de pantalla

post-1412705-0-55174200-1507736305.png

 

Sin embargo si tienes clonada la página y es balanceada con un balaneador de carga esta IP captada siempre será la privada del balanaceador de carga en vez de la pública del cliente. (Por lo menos este es mi caso en PS1.7)

 

Los balanceadores de carga al igual que los proxy normalmente inyectan la cabecera "X-Forwarded-For" donde se indica como valor la ip origen del cliente para que pueda ser recuperada posteriormente,

 

Así pues en PHP con {$_SERVER['REMOTE_ADDR']} devuelve la IP origen si la conexión es directa y {$_SERVER['HTTP_X_FORWARDED_FOR']} devuelve la IP origen si se ha pasado a través de un Proxy o balanceador ya que en ese caso REMOTE_ADDR devuelve la IP del balanceador o Proxy.

 

 

 

Ahora bien, revisando el código de Prestashop compruebo que este si contempla esto y debe hacer las comprobaciones oportunas

Concretamente encuentro el comando en los siguientes archivos (PS 7.1):

\classes\Tools.php (líneas 321, 334, 337,340, 341, 344)

 

\vendor\symfony\symfony\src\Symfony\Component\HttpFoundation\Tests\RequestTest.php (Lineas 931, 963 y 1604)

 

\vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Tests\Fragment\InlineFragmentRendererTest.php (58, 174, 199)

 

\vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Tests\HttpCache\HttpCacheTest.php(Linea 1251)

 

Sin embargo, a pesar de esto en las fichas de mis clientes solo se muestra la IP del balanceador

 

 

¿Prestashop no realiza correctamente esta comprobación? o es que debería cambiar algo?

 

(Si creo un fichero PHP con estos valores los resultados son las IP que indico por lo que veo que todo concuerda con lo que indico)

 

Un saludo y muchas gracias

 

Link to comment
Share on other sites

A ver si algún gurú me puede dar algo de luz de lo que me está ocurriendo

 

Buscando más información he dado con este topic:
https://www.prestashop.com/forums/topic/300496-maintenance-ip-problems/

 

Ahí indicaron en uno de los post que una posible solución podría ser modificar el archivo \classes\Tools.php

La modificación consiste en modificar el condicional de la línea 337

        if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && (!isset($_SERVER['REMOTE_ADDR'])
            || preg_match('/^127\..*/i', trim($_SERVER['REMOTE_ADDR'])) || preg_match('/^172\.16.*/i', trim($_SERVER['REMOTE_ADDR']))
            || preg_match('/^192\.168\.*/i', trim($_SERVER['REMOTE_ADDR'])) || preg_match('/^10\..*/i', trim($_SERVER['REMOTE_ADDR'])))) {

Por lo siguiente:

        if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] {

Quedando pues la función así (tools.php en PS1.7):

    /**
    * Get the server variable REMOTE_ADDR, or the first ip of HTTP_X_FORWARDED_FOR (when using proxy)
    *
    * @return string $remote_addr ip of client
    */
    public static function getRemoteAddr()
    {
        if (function_exists('apache_request_headers')) {
            $headers = apache_request_headers();
        } else {
            $headers = $_SERVER;
        }

        if (array_key_exists('X-Forwarded-For', $headers)) {
            $_SERVER['HTTP_X_FORWARDED_FOR'] = $headers['X-Forwarded-For'];
        }

        if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && (!isset($_SERVER['REMOTE_ADDR'])
            || preg_match('/^127\..*/i', trim($_SERVER['REMOTE_ADDR'])) || preg_match('/^172\.16.*/i', trim($_SERVER['REMOTE_ADDR']))
            || preg_match('/^192\.168\.*/i', trim($_SERVER['REMOTE_ADDR'])) || preg_match('/^10\..*/i', trim($_SERVER['REMOTE_ADDR'])))) {
            if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',')) {
                $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
                return $ips[0];
            } else {
                return $_SERVER['HTTP_X_FORWARDED_FOR'];
            }
        } else {
            return $_SERVER['REMOTE_ADDR'];
        }
    }

He probado a realizar esta modificación pero por el momento no consigo resultados y sigue apareciendo la IP del Balanceador

 

Investigando he creado un fichero php independiente solo con esta función modificado, los return con echo y metiendo algún echo aparte para hacer seguimiento de en que if entra.
El resultado es que me devuelve la IP real en vez del balancedor como debería ser (El penúltimo else) y sin embargo desde Prestashop parece ser que no existe esa cabecera ya que si modifico el último else que es el que coje prestashop y lo modifico por HTTP_X_FORWARDED_FOR para forzarlo lo que guarda es ip 0.0.0.0 (Puesto que si llega allí es porque el valor no existe o está vacío y por eso devuelve REMOTE_ADDR que es el balanceador de carga)

 

No se si me he explicado correctamente =S

¿Se os ocurre algo?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...