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
option forwardfor header X-Real-IP
yreqidel ^X-Real-IP:
, esto deja de falsificar IP en sus registros. FYI:X-Real-IP
es el encabezado predeterminado paraNginX
la opción 'set_real_ip_from
.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.
fuente
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.
fuente
Tenga en cuenta que parece que puede anular lo que la aplicación ve al cambiar los encabezados de Apache:
Sin embargo, esto no funciona para el acceso a Apache a través de "Permitir desde", etc.
fuente
X-Forwarded-For
encabezado 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 usemod_rpaf
omod_remoteip
para Apache 2.4 o posterior.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
fuente
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.
fuente
Pruebe mod_extract_forward de http://www.openinfo.co.uk/apache/
fuente
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;
.
.
fuente