Guía: Cómo permitir el acceso solo desde países específicos utilizando una lista blanca con PHP o htaccess

22.01.2025

Guía: Cómo permitir el acceso solo desde países específicos utilizando una lista blanca con PHP o htaccess

Esta guía explica cómo configurar tu servidor para que solo permita acceso desde ciertos países (lista blanca) utilizando .htaccess o PHP. A continuación, se detalla cómo hacerlo con ejemplos basados en la información de ipdeny.com.


1. Permitir acceso solo desde países específicos usando .htaccess

Pasos:

  1. Descargar los archivos de IPs de los países permitidos:

  2. Abrir o crear el archivo .htaccess en la raíz de tu sitio web.

  3. Agregar las reglas para permitir solo las IPs específicas: Usa el siguiente formato para configurar las IPs de los países permitidos:

    <Limit GET POST>
    Order Deny,Allow
    Deny from all
    Allow from 181.48.0.0/16
    Allow from 190.144.0.0/13
    Allow from 186.28.0.0/15
    # Agrega más IPs aquí desde otros países permitidos
    </Limit>
  4. Convertir y agregar IPs de otros países:

    • Si necesitas incluir IPs de varios países, concatena las listas descargadas y agrega las líneas Allow from.
  5. Guardar y subir el archivo .htaccess al servidor:

    • Asegúrate de que el archivo esté en la raíz del sitio web.

2. Permitir acceso solo desde países específicos usando PHP

Si prefieres un enfoque más dinámico, puedes usar PHP para configurar una lista blanca de países.

Pasos:

  1. Crear el archivo countryallow.php: Este archivo se encargará de validar las IPs según los países permitidos. Crea el archivo con el siguiente contenido:

    <?php
    function allowCountries($allowedCountries) {
        // Directorio donde se almacenarán las listas de IP descargadas
        $ipDataDir = __DIR__ . '/ipdata/';
        
        // Crear el directorio si no existe
        if (!is_dir($ipDataDir)) {
            mkdir($ipDataDir, 0755, true);
        }
        $clientIP = $_SERVER['REMOTE_ADDR'];
        $isAllowed = false;
        foreach ($allowedCountries as $country) {
            $filePath = $ipDataDir . $country . '-aggregated.zone';
            // Descargar el archivo si no existe
            if (!file_exists($filePath)) {
                $url = "https://www.ipdeny.com/ipblocks/data/aggregated/{$country}-aggregated.zone";
                $ipList = file_get_contents($url);
                if ($ipList) {
                    file_put_contents($filePath, $ipList);
                } else {
                    die("Error al descargar datos de IP para el país: {$country}");
                }
            }
            // Validar la IP contra el archivo descargado
            $ipRanges = file($filePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            foreach ($ipRanges as $ipRange) {
                if (ip_in_range($clientIP, $ipRange)) {
                    $isAllowed = true;
                    break 2; // Salir del bucle si se encuentra permitido
                }
            }
        }
        // Denegar acceso si la IP no pertenece a los países permitidos
        if (!$isAllowed) {
            header("HTTP/1.1 403 Forbidden");
            exit('403 Forbidden - Acceso denegado.');
        }
    }
    function ip_in_range($ip, $range) {
        if (strpos($range, '/') === false) {
            return $ip === $range;
        }
        list($subnet, $bits) = explode('/', $range);
        $ip = ip2long($ip);
        $subnet = ip2long($subnet);
        $mask = -1 << (32 - $bits);
        $subnet &= $mask;
        return ($ip & $mask) === $subnet;
    }
    ?>

     
  2. Modificar el archivo index.php: En el archivo index.php, agrega esta línea al inicio para incluir la validación:

    <?php include 'countryallow.php'; allowCountries(['co', 'us']); // Lista blanca: Colombia y Estados Unidos ?>

    Cambia el array ['co', 'us'] por los códigos de los países que desees permitir.

  3. Subir los archivos al servidor:

    • Sube countryallow.php y actualiza tu archivo index.php en el servidor.

Notas importantes

  1. Mantenimiento: Actualiza las listas de IP periódicamente para mantenerlas al día. Puedes automatizar este proceso con un cron job.
  2. Escalabilidad: Si tu sitio web recibe mucho tráfico, considera el impacto en el rendimiento al procesar grandes listas de IP en tiempo real.
  3. Precisión: El bloqueo o permiso por IP puede no ser 100% preciso debido a proxies, VPNs o cambios en las asignaciones de IP.

Con estas configuraciones, puedes permitir acceso solo desde países específicos utilizando .htaccess para una solución estática o PHP para un enfoque dinámico. Ambas opciones te permiten restringir el acceso a tu sitio web de manera efectiva con una lista blanca basada en países.

¡Hablemos!