2010-02-11 11 views
8

En una situación en la que Apache está sentado detrás de un proxy inverso (como Squid), la variable de entorno cgi REMOTE_ADDR obtiene la dirección del proxy en lugar del cliente.Establecer REMOTE_ADDR a X-Forwarded-For en apache

Sin embargo, el proxy establecerá un encabezado llamado X-Forwarded-For para contener la dirección IP original del cliente para que Apache pueda verlo.

La pregunta es, ¿cómo hacemos para que Apache reemplace REMOTE_ADDR con el valor en el encabezado X-Forwarded-For para que todas las aplicaciones web vean la dirección correcta?

Respuesta

10

Puede usar mod_rpaf para eso. http://stderr.net/apache/rpaf/

+0

Exactamente lo que estaba buscando (y pensé que no existía). – tylerl

+2

Estoy haciendo +1 de esto, pero quiero tener en cuenta que aparentemente rpaf no ocupa un rango de red. Entonces, si su proveedor está haciendo el balance por usted, debe esperar que nunca cambien sus direcciones IP balanceadoras. Además, ubuntu 12.04 no carga correctamente la conf, tiene que comentar y cerrar en rpaf.conf o de lo contrario no carga esa conf. –

+0

@DevNull: vea el mod_rpaf actualizado, admite rangos de CDIR. https://github.com/gnif/mod_rpaf. Este repositorio es el oficial ahora, ya que lo tengo con el permiso del autor original. – Geoffrey

1

Recuerde que este valor puede ser falso. Consulte http://blog.c22.cc/2011/04/22/surveymonkey-ip-spoofing/ para obtener un ejemplo de la vida real con consecuencias de secuencias de comandos entre sitios.

+4

Por eso cada mecanismo para hacer esta traducción que he visto (incluido el muy útil módulo rpaf mencionado por maciekb) usa una lista blanca REMOTE_HOST para que sepa que proviene de un proxy de confianza. – tylerl

6

Tenga en cuenta que el encabezado X-Forwarded-For puede contener lista de direcciones IP si la solicitud ha atravesado más de un proxy. En este caso, generalmente desea la IP más a la izquierda. Puede extraer esto con un SetEnvIf:

SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=$1 

Nota el uso de $ 1 para establecer la variable de entorno XFFCLIENTIP para mantener el contenido del primer grupo en la expresión regular (entre paréntesis).

Luego puede usar el valor de la variable de entorno para establecer encabezados (o usarlo en formatos de registro de Apache para que los registros contengan la IP del cliente real).

+1

Creo que su expresión regular es incorrecta: desea obtener la dirección IP más a la derecha en el encabezado 'X-Forwarded-For', no en el extremo izquierdo. En su lugar, su expresión debe ser '" ^. *? (\ D {1,3} + \. \ D {1,3} + \. \ D {1,3} + \. \ D {1,3} + $ "'. –

+0

Me doy cuenta de que Wikipedia es la fuente definitiva, pero actualmente dice que el IP de la izquierda es el cliente: https://en.wikipedia.org/wiki/X-Forwarded-For –

+0

Entonces, ¿a quién debería? ¿cree? :) –

3

Además de mod_rpaf como se mencionó anteriormente, parece que mod_extract_forwarded también realizará esta función.

Una ventaja para mod_extract_forwarded es que está disponible desde EPEL para servidores RHEL/CentOS mientras que mod_rpaf no lo es.

Parece que ninguno de estos dos módulos le permiten a la lista blanca de una red entera de servidores proxy, por lo que la gente CloudFlare crearon su propio plugin: mod_cloudflare que, cabe señalar, es no una de propósito general herramienta como los otros dos; contiene una lista codificada de subredes CloudFlare.

2

Sí, podemos hacer esto.

Sólo tiene que añadir auto_prepend_file en su php.ini como auto_prepend_file = "c:/prepend.php" y en este archivo añadir lo siguiente:

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR']; 
} 

Es necesario el MOD_REMOTEIP de ancho Apache RemoteIPHeader X-Real-IP.

Cheers,

Guiremach

2

Desafortunadamente,

en el momento de escribir esto, ninguno de los backports y tenedores en freshports.org, people.apache.org o gist.github.com trabajó. Todos estaban basados ​​en una versión alfa temprana de Apache httpd 2.3 que no era compatible con las versiones actuales de 2.2 ni 2.4.

Así que después de horas perdiendo tiempo mientras intentaba ajustar los backports para crear uno real para httpd 2.2, decidí moverme a httpd 2.4. Dentro de httpd 2.4, mod_remoteip funciona sin problemas, incluso si un equilibrador de carga tiene conexiones keepalive permanentes que utiliza para proxy de solicitudes de diferentes direcciones IP del cliente real al back-end. No estoy seguro de si los otros módulos pueden manejar esta situación (cambiando las direcciones IP del cliente en cada solicitud dentro de la misma conexión).

0

Puede instalar el módulo mod_extract_forwarded y establecer MEFaccept parámetro para todos.

Cuestiones relacionadas