La geolocalización de IP asigna la dirección IP de un visitante a su ubicación geográfica real, como por ejemplo un país o una ciudad.

Gracias a esta geolocalización, puede adaptar cómo mostrar su sitio web a los visitantes en función de su país de origen. Por ejemplo, puede redireccionar sus visitantes a páginas web específicas en función de la ubicación o bien bloquear el acceso a su sitio web a visitantes de determinados países.

En este tema aprenderá cómo configurar la geolocalización de IP en Plesk y cómo usar dicha geolocalización con casos de uso común, como por ejemplo:

Configuración de la geolocalización de IP en Plesk

La configuración de la geolocalización de IP en Plesk se efectúa mediante el módulo ngx_http_geoip2_module de nginx y las bases de datos de geolocalización MaxMind, que usted debe descargar.

1. Downloading MaxMind Geolocation Databases

La empresa MaxMind ofrece dos bases de datos de geolocalización: GeoLite2 (gratuito) y GeoIP2 (de pago), que es más precisa que su opción gratuita.

En este tema tomaremos como ejemplo la base de datos gratuita GeoLite2. Siempre puede actualizar a GeoIP2.

Si desea descargar la base de datos de geolocalización GeoLite2, primero deberá crear una cuenta de GeoLite2 gratuita y entonces escoger cómo descargar las bases de datos. Puede hacerlo de las siguientes formas:

  • Descargar los archivos de las bases de datos directamente y a continuación cargarlas a su servidor Plesk.

  • Obtenga permalinks. Para descargar las bases de datos, use estos permalinks con scripts o comandos curl y get. También deberá generar y a continuación usar una clave de licencia para su cuenta de GeoLite2. Descubra cómo obtener y usar permalinks.

  • (Recomendado) Use la utilidad geoipupdate.

    Recomendamos esta forma de descarga de bases de datos de geolocalización porque esta utilidad está disponible mediante repositorios de paquetes de sistema en la mayoría de distribuciones de Linux. Con la utilidad geoipupdate, no solo puede descargar bases de datos de geolocalización, sino también actualizarlas.

Para descargar la base de datos de geolocalización GeoLite2 mediante la utilidad geoipupdate:

Nota: Para ver qué versión de la utilidad está disponible y la configuración de la utilidad, ejecute geoipupdate -v.

  1. Regístrese para obtener una cuenta gratuita de GeoLite2.

  2. Acceda a su cuenta GeoLite2 y genere una clave de licencia. A continuación, copie la clave y guárdela en un sitio seguro. Por motivos de seguridad, las claves de licencia solo se muestran en el momento de su generación.

    Cuando genere una clave de licencia, también verá el ID de su cuenta. En el próximo paso necesitará tanto el ID de la cuenta como la clave de licencia.

  3. Abra el archivo /etc/GeoIP.conf para poder evitarlo. La ruta al archivo GeoIP.conf puede variar en función de su distribución de Linux.

  4. Pegue el ID de su cuenta, la clave de licencia y los IDs de la edición de las bases de datos que desea descargar. Separe las distintas ediciones con espacios. Una vez finalizada la configuración, guarde el archivo.

  5. Para descargar las bases de datos, ejecute sudo geoipupdate o sudo geoipupdate -v (para ver la información detallada sobre qué bases de datos se descargan y dónde).

2. Enabling ngx_http_geoip2_module in Plesk

En Plesk 18.0.46 y versiones posteriores, nginx ya está compilado con ngx_http_geoip2_module. Por defecto, el módulo viene desactivado.

Nota: Si desea comprobar si nginx está compilado con el módulo, ejecute nginx -V. De estarlo, verá mod_geoip2 en la salida.

Para activar el módulo ngx_http_geoip2_module:

  1. Acceda a su servidor Plesk mediante SSH.
  2. Active el módulo ejecutando plesk bin nginx -e geoip2.

El módulo está activado. Lo verá en la lista de módulos nginx activados si ejecuta plesk bin nginx -s.

3. Configuring variables

Para usar datos de geolocalización y tomar decisiones en función de dichos datos, necesita asignar la dirección IP de un visitante del sitio web a varias propiedades (como el nombre de una ciudad o país) y guardarlas como variables en archivos de configuración de nginx.

Para configurar variables:

  1. Añada las siguientes directivas al archivo /etc/nginx/conf.d/geoip2.conf:

    geoip2 <path-to-the-database>/GeoLite2-Country.mmdb {
        auto_reload 5m;
        $geoip2_metadata_country_build metadata build_epoch;
        $geoip2_data_country_code country iso_code;
        $geoip2_data_country_name country names en;
    }
    
    geoip2 <path-to-the-database>/GeoLite2-City.mmdb {
        $geoip2_data_city_name city names en;
    }
    

    Sustituya <path-to-the-database> por la ruta actual a la base de datos. Por ejemplo, /usr/share/GeoIP/GeoLite2-Country.mmdb

    En CentOS, AlmaLinux y otros sistemas operativos parecidos a Red Hat, las ubicaciones predeterminadas de las bases de datos son las siguientes:

    • /usr/share/GeoIP/GeoLite2-ASN.mmdb
    • /usr/share/GeoIP/GeoLite2-City.mmdb
    • /usr/share/GeoIP/GeoLite2-Country.mmdb

    En Debian y Ubuntu, la ubicación predeterminada de la base de datos es /var/lib/GeoIP.

  2. Ejecute el comando service nginx reload para volver a cargar el archivo de configuración de nginx.

Ha completado la configuración de la geolocalización de IPs en Plesk. Ahora puede usar ngx_http_geoip2_module con varios casos de uso descritos a continuación.

Para aplicar estos casos de uso, debe configurar las directivas de nginx que referencian las siguientes variables:

Nombre de la variable Significado de la variable
$geoip2_metadata_country_build Hora de creación de la base de datos GeoLite2-Country
$geoip2_data_country_code Código ISO de dos letras del país
$geoip2_data_country_name Nombre del país en inglés
$geoip2_data_city_name Nombre de la ciudad en inglés

Bloqueo del acceso a un sitio web para visitantes de un determinado país

Es posible denegar el acceso a un sitio web a visitantes de un país en concreto. Cuando los visitantes intenten acceder al sitio, verán el código de estado HTTP 403, que denota que se prohíbe el acceso al recurso solicitado.

Para bloquear el acceso a un sitio web a los visitantes de un determinado país:

  1. Vaya a Sitios web y dominios > dominio > pestaña «Hosting y DNS» > Configuración de Apache y nginx.

  2. Añada lo siguiente a la casilla de texto «Directivas nginx adicionales» y haga clic en ACEPTAR.

    if ($geoip2_data_country_code = "XX") {
            return 403;
    }
    

    Donde XX es el código ISO de dos letras del país cuyos visitantes desea bloquear (por ejemplo, AQ en el caso de Antártida).

Los visitantes del país cuyo código ISO ha indicado ya no disponen de acceso a su sitio web.

Redireccionamiento de los visitantes de un sitio a una URL de geolocalización específica

Puede redireccionar aquellos visitantes que accedan a la URL general (por ejemplo, https://example.com/test) a una URL específica para el país del que procedan (por ejemplo, https:// example.com/US/test).

Para redireccionar a los visitantes del sitio web a una URL específica en función de la geolocalización:

  1. Vaya a Sitios web y dominios > dominio > pestaña «Hosting y DNS» > Configuración de Apache y nginx.

  2. Añada lo siguiente a la casilla de texto «Directivas nginx adicionales» y haga clic en ACEPTAR.

    location = /test {
        return 301 https://$host/$geoip2_data_country_code/<geolocation-specific-URL-part>;
    }
    

    Donde <geolocation-specific-URL-part> es la parte de la URL específica de la geolocalización (por ejemplo, test).

Por ejemplo, los visitantes de los Estados Unidos ahora serán redireccionados a https://example.com/US/test.

Aplicación de decisiones basadas en la geolocalización a sitios web pertenecientes a un plan de hosting

Usted puede, por ejemplo, bloquear o redireccionar los visitantes de un determinado país pero no aplicarlo a un sitio web individual, sino a todos los sitios web pertenecientes a un plan de hosting. Este caso es similar a los dos casos anteriores con un sitio web individual. La única diferencia es que, en este caso, no debe usar la configuración nginx de un dominio, sino la de un plan de hosting.

Veamos cómo conseguirlo en el caso del bloqueo del acceso a un sitio web.

Para impedir que los visitantes procedentes de un determinado país puedan acceder a los sitios web pertenecientes a un plan de hosting:

  1. Vaya a Planes de servicio y haga clic en el nombre del plan de servicio cuyo acceso a sus sitios web desea bloquear.

  2. Vaya a la pestaña «Servidor web», añada lo siguiente a la casilla de texto «Directivas nginx adicionales» y haga clic en ACEPTAR.

    if ($geoip2_data_country_code = "XX") {
        return 403;
    }
    

    Donde XX es el código ISO de dos letras del país cuyos visitantes desea bloquear (por ejemplo, AQ en el caso de Antártida).

Los visitantes del país cuyo código ISO ha indicado ya no pueden acceder a ninguno de los sitios web pertenecientes al plan de hosting.

Bloqueo del acceso a todos los sitios web alojados en el servidor para los visitantes de un determinado país

Existen dos formas de conseguirlo: usar plantillas de configuración o mediante la configuración del plan de hosting. Antes ya hemos descrito cómo usar la configuración del plan de hosting. A continuación le mostramos cómo usar plantillas de configuración personalizadas.

Nota: Debe usar plantillas de configuración o bien la configuración del plan de hosting. No es posible denegar el acceso a todo los sitios web alojados en el servidor añadiendo el archivo de configuración global de nginx a /etc/nginx/conf.d.

Para bloquear el acceso a todos los sitios web alojados en el servidor a los visitantes de un determinado país:

  1. Cree una plantilla de configuración personalizada nginxDomainVirtualHost.php tal y como se describe aquí.

  2. Localice el siguiente texto al final de la plantilla predeterminada copiada:

    <?php if (is_file($VAR->domain->physicalHosting->customNginxConfigFile)) : ?>
        include "<?php echo $VAR->domain->physicalHosting->customNginxConfigFile ?>";
    <?php endif ?>
    }
    

    Inserte sus directivas de restricción de acceso antes del corchete derecho de la siguiente forma:

    <?php if (is_file($VAR->domain->physicalHosting->customNginxConfigFile)) : ?>
        include "<?php echo $VAR->domain->physicalHosting->customNginxConfigFile ?>";
    <?php endif ?>
        if ($geoip2_data_country_code = "XX") {
            return 403;
        }
    }
    

    Donde XX es el código ISO de dos letras del país cuyos visitantes desea bloquear (por ejemplo, AQ en el caso de Antártida).

  3. Ejecute el siguiente comando para verificar que las plantillas modificadas son archivos PHP válidos:

    php -l nginxDomainVirtualHost.php
    
  4. Ejecute el siguiente comando para generar nuevos archivos de configuración:

    plesk sbin httpdmng --reconfigure-all
    

Los visitantes del país cuyo código ISO ha indicado ya no pueden acceder a ninguno de los sitios web alojados en el servidor.

Protección de un sitio web frente a posibles ataques de fuerza bruta procedentes de un mismo país

Puede proteger su sitio web de posibles ataques de fuerza bruta limitando las peticiones procedentes de direcciones IP que presenten el mismo código de país ISO. Puede aplicar esta protección a lo siguiente:

  • Un único sitio web
  • Todos los sitios web que pertenezcan a un plan de hosting
  • Todos los sitios web alojados en el servidor
  • Una o múltiples páginas web (por ejemplo, example.com/test)

Para proteger uno o más sitio web frente a ataques de fuerza bruta procedentes del mismo país:

  1. Añada la directiva del siguiente patrón al archivo /etc/nginx/conf.d/limit_req_zone.conf:

    limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
    

    Esto crea una zona de memoria compartida entre los procesos de trabajo de nginx. La zona almacena el estado de cada dirección IP y la frecuencia con la que ha accedido a una URL con limitación de peticiones. La directiva anterior limita las peticiones de las direcciones IP con el mismo código de país ISO a cinco por minuto (rate=5r/m).

    Obtenga más información sobre la limitación de tasas en nginx.

  2. El segundo paso varía en función de los sitios web y la cantidad de sitios web que desee proteger:

    • (Un único sitio web) Vaya a Sitios web y dominios > dominio > pestaña «Hosting y DNS» > Configuración de Apache y nginx, indique lo siguiente en el cuadro de texto «Directivas adicionales de nginx» y haga clic en ACEPTAR:

      limit_req zone=country_code;
      
    • (Todos los sitios web pertenecientes a un plan de hosting) Vaya a Planes de servicio y haga clic en el nombre del plan de servicio cuyos sitios web desea proteger. A continuación, vaya a la pestaña «Servidor web», añada lo siguiente al cuadro de texto «Directivas adicionales de nginx» y haga clic en ACEPTAR:

      limit_req zone=country_code;
      
    • (Todos los sitios web alojados en el servidor) Añada lo siguiente al archivo /etc/nginx/conf.d/limit_req.conf:

      limit_req zone=country_code;
      

Ha limitado las peticiones a uno o más sitios web desde direcciones IP con el mismo código de país ISO a cinco por minuto.

También puede proteger una única o varias páginas web limitando las peticiones procedentes de direcciones IP que presente el mismo código ISO de país. El procedimiento varían en función del tipo de hosting de su sitio web:

  • Hosting Apache+nginx
  • Hosting sólo con nginx
  • nginx configurado para servir PHP directamente

(Hosting nginx + Apache) Para proteger una determinada página web frente a posibles ataques de fuerza bruta procedentes del mismo país:

  1. Añada la directiva del siguiente patrón al archivo /etc/nginx/conf.d/limit_req_zone.conf:

    limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
    

    Esto crea una zona de memoria compartida entre los procesos de trabajo de nginx. La zona almacena el estado de cada dirección IP y la frecuencia con la que ha accedido a una URL con limitación de peticiones. La directiva anterior limita las peticiones de las direcciones IP con el mismo código de país ISO a cinco por minuto (rate=5r/m).

    Obtenga más información sobre la limitación de tasas en nginx.

  2. Cree una plantilla de configuración personalizada nginxDomainVirtualHost.php tal y como se describe aquí.

  3. Localice el siguiente texto al final de la plantilla predeterminada copiada:

    <?php if ($VAR->domain->physicalHosting->proxySettings['nginxProxyMode']): ?>
        location / {
        <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?>
            proxy_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>;
        <?php endif ?>
        <?php echo $VAR->includeTemplate('domain/service/proxy.php', $OPT) ?>
        }
    

    A continuación, inserte sus directivas tal y como se muestra a continuación, reemplazando example.com por su nombre de dominio y /test— por la página web exacta donde desea aplicar el límite:

    <?php if ($VAR->domain->physicalHosting->proxySettings['nginxProxyMode']): ?>
        location / {
        <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?>
            proxy_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>;
        <?php endif ?>
        <?php echo $VAR->includeTemplate('domain/service/proxy.php', $OPT) ?>
        }
    
        <?php if ($VAR->domain->asciiName == 'example.com'): ?>
            location = /test {
                limit_req zone=country_code;
            <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?>
                proxy_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>;
            <?php endif ?>
            <?php echo $VAR->includeTemplate('domain/service/proxy.php', $OPT) ?>
            }
        <?php endif ?>
    
  4. Ejecute el siguiente comando para verificar que las plantillas modificadas son archivos PHP válidos:

    php -l nginxDomainVirtualHost.php
    
  5. Ejecute el siguiente comando para generar nuevos archivos de configuración:

    plesk sbin httpdmng --reconfigure-all
    

Ha limitado las peticiones a la página web desde direcciones IP con el mismo código de país ISO a 5 por minuto.

(Hosting solo con nginx) Para proteger una determinada página web frente a posibles ataques de fuerza bruta procedentes del mismo país:

  1. Añada la directiva del siguiente patrón al archivo /etc/nginx/conf.d/limit_req_zone.conf:

    limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
    

    Esto crea una zona de memoria compartida entre los procesos de trabajo de nginx. La zona almacena el estado de cada dirección IP y la frecuencia con la que ha accedido a una URL con limitación de peticiones. La directiva anterior limita las peticiones de las direcciones IP con el mismo código de país ISO a cinco por minuto (rate=5r/m).

    Obtenga más información sobre la limitación de tasas en nginx.

  2. Vaya a Sitios web y dominios > dominio > pestaña «Hosting y DNS» > Configuración de Apache y nginx.

  3. Añada lo siguiente al cuadro de texto «Directivas adicionales de nginx», reemplazando /test por la página web exacta a la que desea aplicar el límite:

    location = /test {
        limit_req zone=country_code;
    }
    
  4. Haga clic en ACEPTAR.

Ha limitado las peticiones a la página web desde direcciones IP con el mismo código de país ISO a 5 por minuto.

(nginx sirve PHP directamente) Para proteger un determinado script PHP frente a ataques de fuerza bruta procedentes del mismo país:

  1. Añada la directiva del siguiente patrón al archivo /etc/nginx/conf.d/limit_req_zone.conf:

    limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
    

    Esto crea una zona de memoria compartida entre los procesos de trabajo de nginx. La zona almacena el estado de cada dirección IP y la frecuencia con la que ha accedido a una URL con limitación de peticiones. La directiva anterior limita las peticiones de las direcciones IP con el mismo código de país ISO a cinco por minuto (rate=5r/m).

    Obtenga más información sobre la limitación de tasas en nginx.

  2. Cree una plantilla de configuración personalizada nginxDomainVirtualHost.php tal y como se describe aquí.

  3. Localice el siguiente texto al final de la plantilla predeterminada copiada:

    location ~ \.php(/.*)?$ {
        <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?>
        fastcgi_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>;
        <?php endif ?>
        <?php echo $VAR->includeTemplate('domain/service/fpm.php', $OPT) ?>
    }
    

    Inserte las siguientes directivas antes del texto, incluyendo limit_req y reemplazando example.com por su nombre de dominio y /test\.php— por el script PHP exacto al que desea aplicar el límite:

    <?php if ($VAR->domain->asciiName == 'example.com'): ?>
        location ~ ^/test\.php$ {
            limit_req zone=country_code;
            <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?>
            fastcgi_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>;
            <?php endif ?>
            <?php echo $VAR->includeTemplate('domain/service/fpm.php', $OPT) ?>
        }
    <?php endif ?>
    location ~ \.php(/.*)?$ {
        <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?>
        fastcgi_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>;
        <?php endif ?>
        <?php echo $VAR->includeTemplate('domain/service/fpm.php', $OPT) ?>
    }
    
  4. Ejecute el siguiente comando para verificar que las plantillas modificadas son archivos PHP válidos:

    php -l nginxDomainVirtualHost.php
    
  5. Ejecute el siguiente comando para generar nuevos archivos de configuración:

    plesk sbin httpdmng --reconfigure-all
    

Ha limitado las peticiones al script PHP desde direcciones IP con el mismo código de país ISO a 5 por minuto.