Un problema que me he encontrado al utilizar Squid como proxy transparente delante de Apache, para mejorar los problemas de carga, ha sido que ahora todas las peticiones Web provienen de Squid, es decir, cuando llegan a Apache, la IP que se ve en todo momento es la del proxy, no la del visitante real. Esto provoca problemas inesperados y preocupantes, por citar un par de ejemplos:
- Viendo el access_log de Apache es imposible detectar un ataque, todo proviene siempre de la IP local de Squid.
- En WordPress Akismet detecta todos los trackbacks y comentarios de Spam como provenientes de nuestra IP, con lo cual no sólo funciona de mala manera, sino que encima corremos el riesgo de ser considerados como una IP fuente de Spam
Para solucionar esto, lo primero es lograr que Squid pase a Apache las cabeceras correctas, entre ellas la IP real del visitantes. En squid.conf:
follow_x_forwarded_for allow all
acl_uses_indirect_client on
delay_pool_uses_indirect_client on
log_uses_indirect_client on
header_access X_Forwarded_For allow all
Luego modificaremos «a machete» el formato de Log de Apache para el vhost que nos interese en httpd.conf:
# Si encontramos un REMOTE_ADDR lo seteamos
SetEnvIf Remote_Addr «(.*)» TRUE_REMOTE_ADDR=$1
# Si es posible, cazamos la última IP de la lista de proxies
SetEnvIf X-Forwarded-For «([0-9\.]+)$» TRUE_REMOTE_ADDR=$1
# Ponga aqui su magia
CustomLog ruta/logs/dominio-access_log «%{TRUE_REMOTE_ADDR}e %l %u %t \»%r\» %>s %b \»%{Referer}i\» \»%{User-Agent}i\»»
Un reinicio de Apache y Squid, y ya tenemos nuestro proxy transparente funcionando, y a Apache recibiendo las IPs reales de los visitantes.
4 comentarios en “Obligar a Apache a guardar la IP real de los visitantes”