IP remotas con HAProxy

19

Estoy probando una nueva configuración del servidor web que tiene un par de problemas. Esencialmente, tenemos un servidor web, donde el código usa la IP remota para algunas cosas interesantes, y también algunos directorios apache asegurados a ciertas IP (nuestra oficina, etc.).

Sin embargo, acabamos de lanzar esto detrás de ha_proxy para que podamos considerar agregar algunos servidores de aplicaciones más, pero ahora la IP remota siempre aparece como la ip del proxy, no el usuario remoto real. Esto significa que no podemos llegar a algunas ubicaciones, y nuestra aplicación se está comportando un poco extraño donde la IP del usuario es importante.

Nuestra configuración es la siguiente:

global
      maxconn 4096
      pidfile /var/run/haproxy.pid
      daemon

defaults
      mode http
      retries 3
      option redispatch
      maxconn 2000
      contimeout 5000
      clitimeout 50000
      srvtimeout 50000

listen farm xxx.xxx.xxx.xxx:80
      mode http
      cookie GALAXY insert
      balance roundrobin
      option httpclose
      option forwardfor
      stats enable
      stats auth username:userpass

      server app1 xxx.xxx.xxx.xxx:80 maxconn 1 check
Neil Middleton
fuente

Respuestas:

31

Citado del documento HAProxy en haproxy.1wt.eu .

- si la aplicación necesita registrar la IP del cliente original, use el
  Opción "forwardfor" que agregará un encabezado "X-Fordered-For" con el
  dirección IP del cliente original. También debe usar "httpclose" para asegurarse
  que reescribirá todas las solicitudes y no solo la primera de cada
  sesión:
        opción httpclose
        opción hacia adelante

Se indica que la aplicación debe tratar el encabezado HTTP X-Fordered-For para conocer la dirección IP del cliente. Parece que es el único camino a seguir en su caso.

Actualizado para HAProxy 1.4

Haproxy 1.4 introdujo un nuevo modo con la "opción http-server-close". Todavía cerró la conexión con el servidor, pero si es posible y se mantiene, se mantiene vivo hacia el cliente. En la mayoría de las configuraciones, es probable que desee usar eso, ya que ayuda con la latencia en la parte única de alta latencia de su conexión (entre Haproxy y el cliente).

   option http-server-close
   option forwardfor
Maxwell
fuente
2
Mejor uso option forwardfor header X-Real-IPy reqidel ^X-Real-IP:, esto deja de falsificar IP en sus registros. FYI: X-Real-IPes el encabezado predeterminado para NginXla opción ' set_real_ip_from.
Tino
La pregunta no menciona nginx. X-Real-IP no funcionaría.
Rick Fletcher
1. ¿Deben establecerse estas dos opciones en la sección de configuración de interfaz de usuario o de fondo? (Porque parece que no funcionan aquí) 2. ¿Se requiere algún tipo de configuración también a nivel de Tomcat?
yglodt
6

Hay una manera de recompilar HAproxy para incluir Tproxy que permitirá el reenvío de la dirección de origen.

Aquí hay una publicación de blog al respecto: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

Algunas notas

El último kernel de Linux (2.6.28-11-server) incluye soporte para TProxy, por lo que no es necesario volver a compilar el kernel.

Asegúrese de configurar los servidores en su granja de servidores web con una dirección de puerta de enlace predeterminada que apunte al servidor HAProxy.

Geoff Dalgas
fuente
2

Use el módulo rpaf apache http://stderr.net/apache/rpaf/ Sé que esta es una publicación anterior, pero me llevó días encontrarla. Esto presentará a cualquier aplicación la x-fordered-for ip.

Shaggy63
fuente
1

Tenga en cuenta que parece que puede anular lo que la aplicación ve al cambiar los encabezados de Apache:

SetEnvIf X-Forwarded-For (.*) REMOTE_ADDR=$1
SetEnvIf X-Forwarded-For (.*) REMOTE_IP=$1

Sin embargo, esto no funciona para el acceso a Apache a través de "Permitir desde", etc.

Neil Middleton
fuente
Esto podría causar resultados impredecibles si el cliente envía un X-Forwarded-Forencabezado existente a medida que la nueva dirección IP se agrega al final de la lista existente, separada por una coma y un espacio. Cambie (.*)a ([^ ]*)$para tomar solo la última IP ... o use mod_rpafo mod_remoteippara Apache 2.4 o posterior.
Ladadadada
1

HAProxy, por diseño, no puede reenviar la dirección IP original al servidor real, casi como cualquier otro proxy.

Una solución puede ser, si su único problema es con un servidor web, buscar en el encabezado HTTP X-reenviado, que debe contener la dirección del cliente. Ahora, eso es más o menos específico de la aplicación / idioma, pero eche un vistazo a este ejemplo en php:

$headers = apache_request_headers();

$real_client_ip = $headers["X-Forwarded-For"];

Si también desea registrar la dirección original, puede modificar el LogFormat en httpd.conf para que se vea así:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common

Thiagodrv
fuente
mal, puedes con la opción "reenviar"
wittwerch
Sí, y esta opción se activa de manera predeterminada, pero lo que hace es configurar el encabezado HTTP X-Fordered-For. Lo que estaba diciendo, y parece a mí que es lo que el autor de la pregunta en realidad estaba pidiendo, era acerca de la dirección de la fuente real del paquete IP
Thiagodrv
0

Bueno, parece que el X-Forward-for no funciona bien para su configuración. Entonces, ¿hay alguna razón especial para que te quedes con el haproxy? Parece que IPVS es más apropiado para sus necesidades (en realidad uso ldirector que a su vez usa ipvs).

Echa un vistazo a:

http://kb.linuxvirtualserver.org/wiki/IPVS

y

http://www.vergenet.net/linux/ldirectord/

El uso de IPVS en modo 'Túnel de IP' o 'Enrutamiento directo' conserva la dirección del cliente.

Thiagodrv
fuente
0

Pruebe mod_extract_forward de http://www.openinfo.co.uk/apache/

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEFOrder refuse,accept
MEFRefuse all
MEFAccept xxx.xxx.xxx.xxx

fuente
-1

Manera fácil con haproxy en modo tcp y nginx:

Añadir proxy de envío como opción de servidor:

haproxy.conf:

.

.

escuchar ssl 0.0.0.0:443

modo tcp

saldo al menos

opción httpchk GET / ping

opción log-health-cheques

servidor w1 192.168.1.1:443 enviar-proxy comprobar check-ssl verificar ninguno

servidor w2 192.168.1.1:443 enviar proxy comprobar check-ssl verificar ninguno

.

.

Nginx necesita soporte de protocolo proxy

nginx.conf:

.

.

escuchar 192.168.1.1:443 ssl proxy_protocol;

.

.

set_real_ip_from 192.168.1.0/24;

real_ip_header proxy_protocol;

.

.

Emilio Joel Macías Gómez
fuente