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.

Applying Geolocation-based Decisions to Websites that Belong to One Hosting Plan

You can, for example, block or redirect visitors from a specific country but apply it not to one individual website but to all websites that belong to one hosting plan. This case is similar to the two previous ones with an individual website. The only difference is that you need to use not a domain’s but a hosting plan’s nginx settings.

Let’s see how to do so on the example of website access block.

To block access to websites that belong to one hosting plan for visitors from a specific country:

  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).

Visitors from the country whose ISO code you have specified no longer have access to all websites that belong to the hosting plan.

Block Access to All Websites Hosted on the Server for Visitors From a Specific Country

There are two ways to implement this use case: using configuration templates or hosting plan settings. We have described how to use hosting plan settings earlier. Below we will show you how to use custom configuration templates.

Nota: You need to use either configuration templates or hosting plan settings. It is not possible to deny access to all websites hosted on the server by adding the global nginx configuration file to /etc/nginx/conf.d.

To block access to all websites hosted on the server for visitors from a specific country:

  1. Create a custom configuration template nginxDomainVirtualHost.php using this procedure.

  2. Find the following text at the end of the copied default template:

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

    And insert your access restriction directives before the right brace as follows:

    <?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
    

Visitors from the country whose ISO code you have specified no longer have access to all websites hosted on the server.

Protecting a Website From Brute-force Attacks From the Same Country

You can protect your website from brute-force attacks by limiting requests from IP addresses that have the same ISO country code. You can apply this protection to the following:

  • 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)

To protect one or multiple websites from brute-force attacks from the same country:

  1. Add the directive of the following pattern to the /etc/nginx/conf.d/limit_req_zone.conf file:

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

    This creates a memory zone shared among nginx worker processes. The zone stores the state of each IP address and how often it has accessed a request‑limited URL. The directive above limits requests from IP addresses with the same ISO country code to five per minute (rate=5r/m).

    Learn more about rate limiting in nginx.

  2. The second step varies depending on which and how many websites you want to protect:

    • (A single website) Go to Websites & Domains > domain > the «Hosting & DNS» tab > Apache & nginx Settings, put the following in the «Additional nginx directives» textbox, and then click OK:

      limit_req zone=country_code;
      
    • (All websites that belong to one hosting plan) Go to Service Plans and click the name of the service plan whose websites you want to protect. Then go to the «Web Server» tab, add the following to the «Additional nginx directives» textbox, and click OK:

      limit_req zone=country_code;
      
    • (All websites hosted on the server) Put the following to the /etc/nginx/conf.d/limit_req.conf file:

      limit_req zone=country_code;
      

You have limited requests to one or multiple websites from IP addresses with the same country ISO code to five per minute.

You can also protect a single or multiple web pages by limiting requests from IP addresses that have the same ISO country code. The procedure differs depending on your website hosting type:

  • Hosting Apache+nginx
  • nginx-only hosting
  • nginx configured to serve PHP directly

(Apache+nginx hosting) To protect a particular web page from brute-force attacks from the same country:

  1. Add the directive of the following pattern to the /etc/nginx/conf.d/limit_req_zone.conf file:

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

    This creates a memory zone shared among nginx worker processes. The zone stores the state of each IP address and how often it has accessed a request‑limited URL. The directive above limits requests from IP addresses with the same ISO country code to five per minute (rate=5r/m).

    Learn more about rate limiting in nginx.

  2. Create a custom configuration template nginxDomainVirtualHost.php using this procedure.

  3. Find the following text at the end of the copied default template:

    <?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) ?>
        }
    

    And insert your directives after it as follows replacing example.com with your domain name and /test—with the exact web page you want to apply the limit to:

    <?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
    

You have limited requests to the web page from IP addresses with the same country ISO code to 5 per minute.

(nginx-only hosting) To protect a particular web page from brute-force attacks from the same country:

  1. Add the directive of the following pattern to the /etc/nginx/conf.d/limit_req_zone.conf file:

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

    This creates a memory zone shared among nginx worker processes. The zone stores the state of each IP address and how often it has accessed a request‑limited URL. The directive above limits requests from IP addresses with the same ISO country code to five per minute (rate=5r/m).

    Learn more about rate limiting in nginx.

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

  3. Put the following in the «Additional nginx directives» textbox replacing /test with the exact web page you want to apply the limit to:

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

You have limited requests to the web page from IP addresses with the same country ISO code to 5 per minute.

(nginx serves PHP directly) To protect a particular PHP script from brute-force attacks from the same country:

  1. Add the directive of the following pattern to the /etc/nginx/conf.d/limit_req_zone.conf file:

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

    This creates a memory zone shared among nginx worker processes. The zone stores the state of each IP address and how often it has accessed a request‑limited URL. The directive above limits requests from IP addresses with the same ISO country code to five per minute (rate=5r/m).

    Learn more about rate limiting in nginx.

  2. Create a custom configuration template nginxDomainVirtualHost.php using this procedure.

  3. Find the following text at the end of the copied default template:

    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) ?>
    }
    

    And insert the following directives before the text including limit_req and replacing example.com with your domain name and /test\.php—with the exact PHP script you want to apply the limit to:

    <?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
    

You have limited requests to the PHP script from IP addresses with the same country ISO code to 5 per minute.