Recuperar IP externa en PHP detrás de Haproxy

Recuperar IP externa en PHP detrás de Haproxy

Estoy usando Haproxy para permitir la ejecución de un servidor websocket y un servidor web Lighttpd en la misma máquina. Quiero recuperar la dirección IP externa de la máquina desde la aplicación web que se ejecuta en el servidor Lighttpd.

Sin haproxy esto funciona:

PHP

<?php
    $myip = $_SERVER['SERVER_ADDR'];
    $myurl = 'http://'.$myip.'/pathToProject/';
    define('URL', $myurl);
?>

Pero detrás del proxy$_SERVER['SERVER_ADDR'];devuelve 127.0.0.1 que no funciona con el marco PHP que estoy usando.

haproxy.conf

global
    maxconn     4096
    nbproc      1

defaults
    mode        http

frontend all 0.0.0.0:80
    timeout client 86400000
    default_backend www_backend
    acl is_websocket hdr(Upgrade) -i WebSocket
    acl is_websocket hdr_beg(Host) -i ws
    use_backend socket_backend if is_websocket

backend www_backend
    balance roundrobin
    option forwardfor
    timeout server 30000
    timeout connect 4000
    server apiserver 127.0.0.1:8080 weight 1 maxconn 1024 check

backend socket_backend
    balance roundrobin
    option forwardfor
    timeout queue 5000
    timeout server 86400000
    timeout connect 86400000
    server apiserver 127.0.0.1:8082 weight 1 maxconn 1024 check

Respuesta1

Deberá agregar la opción "option forwardfor"en su archivo de configuración de HAproxy, para que HAproxy agregue un nuevo encabezado con la dirección IP real del visitante.

Después de eso, en su código PHP, verifique el encabezado HTTP_X_FORWARDED_FOR, en lugar de REMOTE_ADDR.

foreach (getallheaders() as $name => $value) {
    echo "$name: $value<br>\n";
}

Puede encontrar una respuesta completa y detallada aquí:haproxy y reenvío de la dirección IP del cliente a los servidores

Respuesta2

En teoría, esto es exactamente lo que puedes resolver usando

    option originalto

en su interfaz, según eldocumentos.

Su aplicación tendrá que depender del encabezado X-Original-To.

Respuesta3

gracias chicos funciona....

1) editar archivo nano /etc/haproxy/haproxy.cfgy agregar ahí

    defaults
      mode http
      option forwardfor 

2) y en php

      <?php 
      echo '<pre>'; print_r(getallheaders()); echo '</pre>';


      // PROBLEM IS each browser has different "x-forwarder-for" some "X-Forwarder-for" and some browser gave you 2x ip "x.x.x.x, x.x.x.x"
      foreach ( getallheaders() as $k => $v) {
        if ( strtolower($k) == 'x-forwarded-for' ) {
          $tmp = explode(', ', $v);
          if ( $tmp[count($tmp)-1] != '' )
             $_SERVER['REMOTE_ADDR'] = $tmp[count($tmp)-1];     
        }
      }


      echo $_SERVER['REMOTE_ADDR'];
      ?>

3) puedes ver la dirección IP

Respuesta4

Así lo resolví (sólo funciona en Linux):

$myip = shell_exec("ifconfig eth0 | awk '/inet / {print$2}' | cut -d: -f2");
$myurl = 'http://'.$myip.'/page/';
define('URL', $myurl);

información relacionada