Discussion:
consulta X-Forwarded-For de Apache
Add Reply
miguel angel gonzalez
2020-06-07 16:10:01 UTC
Responder
Permalink
Buenos días,
Estoy con un problema puntual en Apache, tengo un servidor Apache detrás de
un balanceador,
para obtener la ip real del cliente he configurado X-Forwarded-For, pero a
veces registra el log dos ip's

*35.195.xxx.xxx*, *35.195.xxx.xxx* - [06/Jun/2020:11:50:14 +0200] "POST
/Aplicación/web HTTP/1.1" 200 405 "-" "Go-http-client/1.1"

En el ejemplo anterior son la misma otras veces son diferentes.
Buscando por internet localizo esto:

X-Forwarded-For: <client>, <proxy1>, <proxy2>
<cliente>
La dirección IP del cliente <proxy1>, <proxy2>
Si una solicitud pasa por varios proxies, las direcciones IP de cada
proxy se listan en forma sucesiva.
Esto significa que la IP de más a la derecha es la IP del proxy más
reciente, y la IP de más a la izquierda es la IP del cliente
originador.

https://developer.mozilla.org/es/docs/Web/HTTP/Headers/X-Forwarded-For

Localizado donde está el problema, esa ip de la derecha es un proxy por el
que pasa pero en el log necesito que sólo registre la del cliente final, la
de la izquierda.
He probado varios escenarios pero no me funcionan:
1) Con remoteip añadir ese servidor a un listado (sólo como prueba porque
no es un servidor confiable)
https://www.globo.tech/learning-center/x-forwarded-for-ip-apache-web-server/

2)Por último he probado con SetEnvInf
Hay varios cambios que va a querer hacer en el formato predeterminado para
registrar la dirección ip del cliente X-Forwarded-For o la dirección ip
real del cliente si el encabezado X-Forwarded-For no existe.
Esos cambios se indican a continuación:
En apache.conf
1 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
combined
2 LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-Agent}i\"" proxy
3 SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
En el virtualhost:
4 CustomLog "logs/access_log" combined env=!forwarded
5 CustomLog "logs/access_log" proxy env=forwarded
https://www.techstacks.com/howto/log-client-ip-and-xforwardedfor-ip-in-apache.html

Dejo los enlaces consultados que he aplicado, he consultado otros tantos
pero por no enmarañar el hilo.
¿Se os ocurre alguna idea? Normalmente registra sólo una ip del cliente
pero dos o tres clientes pasan por un proxy y registra dos ip' s.

Muchas gracias, un saludo.
--
/m.a.
Camaleón
2020-06-07 17:00:02 UTC
Responder
Permalink
Estoy con un problema puntual en Apache, tengo un servidor Apache detrás de
un balanceador,
para obtener la ip real del cliente he configurado X-Forwarded-For, pero a
veces registra el log dos ip's
*35.195.xxx.xxx*, *35.195.xxx.xxx* - [06/Jun/2020:11:50:14 +0200] "POST
/Aplicación/web HTTP/1.1" 200 405 "-" "Go-http-client/1.1"
En el ejemplo anterior son la misma otras veces son diferentes.
X-Forwarded-For: <client>, <proxy1>, <proxy2>
<cliente>
La dirección IP del cliente <proxy1>, <proxy2>
Si una solicitud pasa por varios proxies, las direcciones IP de cada
proxy se listan en forma sucesiva.
Esto significa que la IP de más a la derecha es la IP del proxy más
reciente, y la IP de más a la izquierda es la IP del cliente
originador.
https://developer.mozilla.org/es/docs/Web/HTTP/Headers/X-Forwarded-For
Localizado donde está el problema, esa ip de la derecha es un proxy por el
que pasa pero en el log necesito que sólo registre la del cliente final, la
de la izquierda.
No te recomendaría alterar los registros originales del servidor web,
te pueden hacer falta.

¿No sería más conveniente guardar la IP del cliente y la de los
proxies, y procesar/filtrar después ese registro para que te muestre
sólo la IP que quieres?
(...)
1 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
combined
(...)

Apache doesn't log remoteIP when RemoteIPHeader X-Forwarded-For is
present
<https://serverfault.com/questions/888151/apache-doesnt-log-remoteip-when
-remoteipheader-x-forwarded-for-is-present>

Apuntan a cambiar «%h» por «%a».

Pero con eso conseguirás que almacene todas las IP, entiendo que no es lo que buscas,
pues sólo quieres una IP, la del cliente.

Sólo se me ocurre, pero no lo recomiendo, ver si el servidor web te
permite manipular (filtrar) los registros que genera antes de que se
guarden en el disco. Con cualquier aplicación de manipulación de textos
(p. ej., awk) podrías recortar las IP que no quieras y quedarte con el bloque que
necesites.

Saludos,
--
Camaleón
Ángel
2020-06-08 03:00:02 UTC
Responder
Permalink
Localizado donde está el problema, esa ip de la derecha es un proxy
por el que pasa pero en el log necesito que sólo registre la del
cliente final, la de la izquierda.
No. Lo que pretendes hacer es muy mala idea.

Lo que deberías hacer es, o bien guardar las dos direcciones IP (o tres,
o cinco...), indicando que la conexión vino de X, que afirmó estar
haciendo de proxy para Y. O guardar solo la IP de ese proxy desconocido.

El motivo es muy simple. Si te fias de cualquiera que diga ser un proxy,
y le crees el cliente que afirma ser el responsable e la petición, es
posible falsear la dirección de origen. Solo debes creerte la cabecera
de X-Forwarded-For si la dirección anterior de la que te viene (sea de
esa cabecera, o la ip que se conecta) es de un proxy de confianza (por
ejemplo, sabes que tu balanceador te da la dirección real).

Un saludo
miguel angel gonzalez
2020-06-08 10:20:01 UTC
Responder
Permalink
Hola Ángel,

Justo es lo que comento, sólo como prueba:
Con remoteip añadir ese servidor a un listado* (sólo como prueba porque no
es un servidor confiable por lo menos no nos pertenece a nosotros)*
La idea no es mía, es necesario ya que se procesa el fichero después por
otra aplicación, es decir, sólo necesito la ip final del cliente no por los
servidores que pasa.

@camaleon:
¿No sería más conveniente guardar la IP del cliente y la de los
proxies, y procesar/filtrar después ese registro para que te muestre
sólo la IP que quieres?

Pues si no encuentro otra solución va a ser la opción.

Sigo buscando porque la opción que comentas de «%h» por «%a» la probé y no
es exactamente lo que busco.

Gracias, un saludo.

El lun., 8 jun. 2020 a las 4:53, Ángel (<
Post by Ángel
Post by miguel angel gonzalez
Localizado donde está el problema, esa ip de la derecha es un proxy
por el que pasa pero en el log necesito que sólo registre la del
cliente final, la de la izquierda.
No. Lo que pretendes hacer es muy mala idea.
Lo que deberías hacer es, o bien guardar las dos direcciones IP (o tres,
o cinco...), indicando que la conexión vino de X, que afirmó estar
haciendo de proxy para Y. O guardar solo la IP de ese proxy desconocido.
El motivo es muy simple. Si te fias de cualquiera que diga ser un proxy,
y le crees el cliente que afirma ser el responsable e la petición, es
posible falsear la dirección de origen. Solo debes creerte la cabecera
de X-Forwarded-For si la dirección anterior de la que te viene (sea de
esa cabecera, o la ip que se conecta) es de un proxy de confianza (por
ejemplo, sabes que tu balanceador te da la dirección real).
Un saludo
--
/m.a.
Camaleón
2020-06-08 16:30:01 UTC
Responder
Permalink
El 2020-06-08 a las 12:17 +0200, miguel angel gonzalez escribió:

(...)
Post by Camaleón
¿No sería más conveniente guardar la IP del cliente y la de los
proxies, y procesar/filtrar después ese registro para que te muestre
sólo la IP que quieres?
Pues si no encuentro otra solución va a ser la opción.
Por aquí¹ indican esa vía pero sobre un servidor Nginx, quizá te dé
alguna pista. Básicamente proponen hacer un «grep» de la variable que
contiene las IP en formato de lista separada por comas y mapear la
nueva variable al log combinado con el resultado de la extracción.
Post by Camaleón
Sigo buscando porque la opción que comentas de «%h» por «%a» la probé y no
es exactamente lo que busco.
El tutorial que has seguido lo que permite es que la IP del cliente se
registre tembién en el log de Apache, y eso es precisamente lo que has
conseguido... pero no es lo que buscabas :-)

¹ <https://webkul.com/blog/x-forwarded-for-header-in-nginx-containing-mulit
ple-client-ips/>

Saludos,
--
Camaleón
Loading...