Obtener la IP original de los clientes cuando usas Cloudflare

Ya hemos hablado largo y tendido sobre Cloudflare, una capa extra de seguridad y de caché para tus páginas web.

Eso si, si deseas obtener, por tema de registro o para alguna aplicación web, la IP de un cliente, verás que hay un problema. Al venir todas las peticiones de los servidores de Cloudflare, no sabes la IP real de un cliente. Aquí os comentamos cómo resolverlo.

En esta página de Cloudflare viene la solución para cada servidor web o proxy. Por ejemplo en Apache debemos instalar el módulo mod_cloudflare.

En Nginx podemos usar otro módulo que se llama http_real_ip. Este módulo no se carga por defecto, hay que instalarlo o compilarlo con la opción --with-http_realip_module . Si ese es tu caso estás de enhorabuena. Sólo tienes que poner en tu configuración de nginx:

set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 199.27.128.0/21;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2c0f:f248::/32;
set_real_ip_from 2a06:98c0::/29;

# use any of the following two
real_ip_header CF-Connecting-IP;
#real_ip_header X-Forwarded-For;

Después sólo tienes que probar la configuración de nginx y reiniciar si todo está bien. Deberías ver las IPs originales.

Si no tienes es módulo en nginx, y no te apetece recompilar, puedes hacer un truco. En la configuración de nginx puedes poner algo como:

location ~ \.php$ {

fastcgi_param REMOTE_ADDR $http_x_real_ip;

#…other rules

}

Esto usará ese parámetro de http_x_real_ip para coger la ip real que Cloudflare pone en las cabeceras. Pero sólo valdrá para aplicaciones que pasen por fastcgi. Por ejemplo el propio nginx no sabrá la ip real si no le ponemos un parámetro (ver las siguientes líneas).

También puedes usar esta opción para redirigir según la IP real, por ejemplo con:

if ($http_x_real_ip != xxxx.xxxx.xxxx.xxxx) {

         return 403;         }

Y, si no quieres ponerlo en nginx puedes buscar las cabeceras desde Php con:

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

¿Cómo comprobar que funciona?

Además de en los logs (que puede ser un follón mirarlo), puedes poner un phpInfo en tu servidor (quítalo luego). Hay un apartado donde puedes ver el SERVER [“Remote Address”] y las cabeceras que pasa Cloudflare en SERVER [“http_x_real_ip”] y SERVER [“http_x_forwarded_for”]. Cuando funciona, el campo Remote Address debe ser una de las cabeceras de Cloudflare (http_x_real_ip o la otra según cual uses).

 

1 comentario en «Obtener la IP original de los clientes cuando usas Cloudflare»

Deja un comentario

Resumen de nuestra Política de Privacidad

  • Responsable: SmythSys IT Consulting SLNE.
  • Finalidad: Gestionar y moderar los comentarios.
  • Legitimación: Necesitas dar tu consentimiento para publicar un comentario.
  • Destinatarios: Tus datos se alojan en los servidores de OVH.
  • Derechos: Tienes derecho a acceder, rectificar, limitar y suprimir los datos en la dirección del responsable (en nuestra política de privacidad).

Time limit is exhausted. Please reload CAPTCHA.