Logo de Kodflux - Plataforma de Herramientas SEO y Auditoría Web

PHP / Intermedio / 5 min

Restaurar la IP real del visitante tras Cloudflare

Recupera la IP real de tus visitantes en WordPress detras de Cloudflare, con validacion de rangos anti-spoofing.

Detrás de Cloudflare, WordPress registra la IP de Cloudflare en lugar de la del visitante: tus comentarios, logs y plugins de seguridad ven a todos como la misma dirección. Cloudflare envía la IP real en la cabecera CF-Connecting-IP. Este snippet la restaura en REMOTE_ADDR, pero solo si la petición viene de un rango real de Cloudflare, para que nadie pueda falsear su IP enviando la cabecera a mano.

Guía de Implementación Paso a Paso

  1. Accede a tu servidor por FTP o al editor de archivos de tu hosting.
  2. Abre el archivo wp-config.php en la raíz de WordPress.
  3. Pega el código de abajo justo antes de la línea /* That's all, stop editing! */.
  4. Guarda los cambios y recarga el sitio.
  5. Comprueba en tus comentarios o logs que ahora aparece la IP real del visitante.
PHP
// Restaurar IP real del visitante detrás de Cloudflare (con validación anti-spoofing)
if ( isset( $_SERVER['HTTP_CF_CONNECTING_IP'] ) ) {

    // Rangos oficiales de Cloudflare (IPv4). Ver: cloudflare.com/ips
    $cf_ranges = array(
        '173.245.48.0/20', '103.21.244.0/22', '103.22.200.0/22',
        '103.31.4.0/22', '141.101.64.0/18', '108.162.192.0/18',
        '190.93.240.0/20', '188.114.96.0/20', '197.234.240.0/22',
        '198.41.128.0/17', '162.158.0.0/15', '104.16.0.0/13',
        '104.24.0.0/14', '172.64.0.0/13', '131.0.72.0/22',
    );

    $remote = $_SERVER['REMOTE_ADDR'];
    $ip_long = ip2long( $remote );
    $trusted = false;

    foreach ( $cf_ranges as $range ) {
        list( $subnet, $bits ) = explode( '/', $range );
        $mask = -1 << ( 32 - (int) $bits );
        if ( ( $ip_long & $mask ) === ( ip2long( $subnet ) & $mask ) ) {
            $trusted = true;
            break;
        }
    }

    // Solo confiamos en la cabecera si viene de una IP de Cloudflare
    if ( $trusted && filter_var( $_SERVER['HTTP_CF_CONNECTING_IP'], FILTER_VALIDATE_IP ) ) {
        $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
    }
}

La validación por rangos es lo que hace este snippet seguro: sin ella, cualquiera podría enviar una cabecera CF-Connecting-IP falsa para saltarse baneos por IP. Si Cloudflare añade rangos nuevos, actualiza la lista desde su página oficial de IPs.

Buscar en Kodflux