La geolocalizzazione dell’IP mappa l’indirizzo IP di un visitatore del sito web con la sua posizione geografica reale, ad esempio indicando un paese o una città.

Con la geolocalizzazione IP, è possibile personalizzare la visualizzazione del sito web ai visitatori in base al luogo in cui vivono. Ad esempio, è possibile reindirizzare i visitatori a pagine web specifiche per il luogo in cui si trovano oppure bloccare l’accesso al sito ai visitatori provenienti da un paese specifico.

In questa sezione, imparerai come configurare una geolocalizzazione dell’IP su Plesk e come usarla in vari casi comuni, come ad esempio:

Configurare la geolocalizzazione dell’IP su Plesk

Puoi impostare la geolocalizzazione dell’IP su Plesk usando il modulo nginx integrato ngx_http_geoip2_module e i database di geolocalizzazione MaxMind, che è necessario scaricare.

1. Downloading MaxMind Geolocation Databases

La compagnia MaxMind offre due database di geolocalizzazione: GeoLite2, gratuito, e GeoIP2, a pagamento, che è più preciso della sua controparte gratuita.

In questa sezione, utilizzeremo come esempio il database gratuito GeoLite2. È sempre possibile aggiornarlo a GeoIP2.

Per scaricare il database di geolocalizzazione GeoLite2, è necessario innanzitutto creare un account gratuito GeoLite2 e poi scegliere come scaricare i database. È possibile farlo nei seguenti modi:

  • Scaricare direttamente gli archivi dei database e caricarli sul server Plesk.

  • Ottenere i permalink. Per scaricare i database, utilizza questi permalink con gli script o i comandi curl e get. È inoltre necessario generare e utilizzare una chiave di licenza per il proprio account GeoLite2. Per saperne di più su come ottenere e utilizzare i permalink <https://dev.maxmind.com/geoip/updating-databases#directly-downloading-databases>`__.

  • (Consigliato) Uso dell’utility geoipupdate.

    Si consiglia questo modo di scaricare i database di geolocalizzazione perché questa utility è disponibile nei repository dei pacchetti di sistema delle principali distribuzioni Linux. Con l’utility geoipupdate è possibile non solo scaricare ma anche aggiornare i database di geolocalizzazione.

Per scaricare il database di geolocalizzazione di GeoLite2 utilizzando l’utility geoipupdate:

Nota: Per vedere qualle versione dell’utility è disponibile e le sue impostazioni, esegui geoipupdate -v.

  1. Registrati per ottenere gratuitamente un account GeoLite2.

  2. Accedi al tuo account GeoLite2 e genera una chiave di licenza. Una volta fatto, copia la chiave e conservala al sicuro. Per motivi di sicurezza, le chiavi di licenza vengono visualizzate solo quando vengono generate.

    Quando si genera una chiave di licenza, viene visualizzato anche l’ID dell’account. Nella fase successiva saranno necessari sia l’ID dell’account che la chiave di licenza.

  3. Apri il file /etc/GeoIP.conf per la modifica. Il percorso del file GeoIP.conf può variare a seconda della tua distribuzione Linux.

  4. Copia l’ID del tuo account, la chiave di licenza e gli ID delle edizioni dei database che si desidera scaricare. Separa le edizioni multiple con degli spazi. Una volta completata la configurazione, salva il file.

    Nota: È anche possibile scaricare il file GeoIP.conf parzialmente precompilato qui <https://www.maxmind.com/en/accounts/current/license-key/GeoIP.conf>`__.

  5. Per scaricare i database, esegui sudo geoipupdate o sudo geoipupdate -v (per vedere le informazioni dettagliate su quali database vengono scaricati e dove).

2. Enabling ngx_http_geoip2_module in Plesk

Su Plesk 18.0.46 e successivi, nginx è già compilato con ngx_http_geoip2_module. Per impostazione predefinita, il modulo è disabilitato.

Nota: Per controllare se nginx è compilato con il modulo, esegui nginx -V. Se lo è, vedrai mod_geoip2 nell’output.

Per abilitare ngx_http_geoip2_module:

  1. Accedi al tuo server di Plesk via SSH.
  2. Abilita il modulo eseguendo plesk bin nginx -e geoip2.

Il modulo è abilitato. Sarà possibile vederlo nella lista dei moduli nginx se esegui plesk bin nginx -s.

3. Configuring variables

Per utilizzare i dati di geolocalizzazione e prendere decisioni in base a essi, è necessario mappare l’indirizzo IP di un visitatore del sito web a varie proprietà (come il nome di un Paese o di una città) e memorizzarle come variabili nei file di configurazione nginx.

Per configurare le variabili:

  1. Aggiungi le seguenti direttive al file /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;
    }
    

    Sostituisci <path-to-the-database> con il percorso del database attuale, per esempio, /usr/share/GeoIP/GeoLite2-Country.mmdb

    Su CentOS, AlmaLinux e altri sistemi operativi simili a Red Hat, le posizioni predefinite dei database sono le seguenti:

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

    Su Debian e Ubuntu, la posizione predefinita dei database è /var/lib/GeoIP.

  2. Esegui il comando service nginx reload per ricaricare il file di configurazione nginx.

È stata completata la configurazione della geolocalizzazione dell’IP su Plesk. È ora possibile utilizzare ngx_http_geoip2_module in vari modi nei casi descritti di seguito.

Per applicare questi casi, è necessario configurare le direttive nginx che fanno riferimento alle seguenti variabili:

Nome variabile Significato variabile
$geoip2_metadata_country_build Tempo di realizzazione del database GeoLite2-Country
$geoip2_data_country_code Codice ISO a due lettere del paese
$geoip2_data_country_name Nome del paese in inglese
$geoip2_data_city_name Nome della città in inglese

Bloccare l’accesso a un sito web a visitatori di un determinato paese

È possibile impedire l’accesso al sito web ai visitatori provenienti da un determinato paese. Quando cercheranno di accedere al sito, vedranno il codice di stato HTTP 403, che significa che l’accesso alla risorsa richiesta è vietato.

Per bloccare l’accesso a un sito web ai visitatori di un determinato paese:

  1. Vai su Siti web e domini > dominio > scheda «Hosting e DNS» > Impostazioni di Apache & nginx.

  2. Inserisci quanto segue nella casella di testo «Direttive nginx aggiuntive» e poi fai clic su OK.

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

    Dove XX è il codice ISO a due lettere del paese di cui si vogliono bloccare i visitatori (ad esempio, AQ per l’Antartide).

I visitatori del paese di cui hai specificato il codice ISO non avranno più accesso al tuo sito web.

Reindirizzare i visitatori del sito web a un URL specifico geolocalizzato

È possibile reindirizzare i visitatori che accedono all’URL generale (ad esempio, https://example.com/test) a un URL specifico del paese (ad esempio, https:// example.com/US/test).

Per reindirizzare i visitatori del sito web a un URL specifico geolocalizzato:

  1. Vai su Siti web e domini > dominio > scheda «Hosting e DNS» > Impostazioni di Apache & nginx.

  2. Inserisci quanto segue nella casella di testo «Direttive nginx aggiuntive» e poi fai clic su OK.

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

    Dove <geolocation-specific-URL-part> è la parte dell’URL specifico geolocalizzato (ad esempio, test).

Per esempio, i visitatori provenienti dagli Stati Uniti, saranno ora reindirizzati a https://example.com/US/test.

Applicazione di decisioni basate sulla geolocalizzazione a siti web che appartengono a un unico piano di hosting

È possibile, ad esempio, bloccare o reindirizzare i visitatori di un determinato paese non solo per un sito web, bensì per tutti i siti web che appartengono a un piano di hosting. Questo caso è simile ai due precedenti con un singolo sito web. L’unica differenza è che non dovete usare le impostazioni nginx di un dominio, ma quelle di un piano di hosting.

Vediamo come farlo sull’esempio del blocco di accesso al sito web.

Per bloccare l’accesso ai siti web che appartengono a un piano di hosting per i visitatori di un determinato paese:

  1. Vai su Piani di servizio e fai clic sul nome del piano di servizio di accesso ai siti web che si desidera bloccare.

  2. Vai alla scheda «Server Web», inserisci quanto segue nella casella di testo «Direttive nginx aggiuntive» e poi fai clic su OK.

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

    Dove XX è il codice ISO a due lettere del paese di cui si vogliono bloccare i visitatori (ad esempio, AQ per l’Antartide).

I visitatori provenienti dal paese di cui hai specificato il codice ISO non hanno più accesso a tutti i siti web che appartengono al piano di hosting.

Bloccare l’accesso a tutti i siti web ospitati sul server a visitatori di un determinato paese

Esistono due modi per implementare questa casistica: utilizzando i modelli di configurazione o le impostazioni del piano di hosting. Abbiamo descritto prima come utilizzare le impostazioni del piano di hosting. Di seguito mostreremo come utilizzare i modelli di configurazione personalizzati.

Nota: È necessario utilizzare i modelli di configurazione o le impostazioni del piano di hosting. Non è possibile negare l’accesso a tutti i siti web ospitati sul server aggiungendo il file di configurazione globale di nginx a /etc/nginx/conf.d.

Per bloccare l’accesso a tutti i siti web ospitati sul server a visitatori di un determinato paese:

  1. Crea un modello di configurazione personalizzato nginxDomainVirtualHost.php usando questa procedura.

  2. Trova il testo seguente alla fine del modello predefinito copiato:

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

    E inserisci le direttive di restrizione dell’accesso prima della parentesi graffa a destra nel modo seguente:

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

    Dove XX è il codice ISO a due lettere del paese di cui si vogliono bloccare i visitatori (ad esempio, AQ per l’Antartide).

  3. Esegui il comando seguente per verificare che i modelli modificati siano file PHP validi:

    php -l nginxDomainVirtualHost.php
    
  4. Esegui il comando seguente per generare nuovi file di configurazione:

    plesk sbin httpdmng --reconfigure-all
    

I visitatori del paese di cui hai specificato il codice ISO non hanno più accesso a tutti i siti web ospitati sul server.

Proteggere un sito web da attacchi di forza bruta provenienti dallo stesso paese

È possibile proteggere il proprio sito web da attacchi di forza bruta limitando le richieste provenienti da indirizzi IP che hanno lo stesso codice paese ISO. È possibile applicare questa protezione a quanto segue:

  • Un sito web singolo
  • Tutti i siti web che appartengono a un piano di hosting
  • Tutti i siti web ospitati sul server
  • Una o più pagine web (per esempio, example.com/test)

Per proteggere uno o più siti web da attacchi di forza bruta provenienti dallo stesso paese:

  1. Aggiungi al file /etc/nginx/conf.d/limit_req_zone.conf la direttiva con il seguente modello:

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

    Questo crea una zona di memoria condivisa tra i processi di lavoro di nginx. La zona memorizza lo stato di ogni indirizzo IP e la frequenza di accesso a un URL a richiesta limitata. La direttiva precedente limita le richieste da indirizzi IP con lo stesso codice paese ISO a cinque al minuto (rate=5r/m).

    Per saperne di più sui limiti di velocità in nginx <http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone>`__.

  2. La seconda fase varia a seconda di quali e quanti siti web si vogliono proteggere:

    • (Un sito web singolo) Vai su Siti web e domini > dominio > la scheda «Hosting e DNS» > Impostazioni di Apache e nginx, inserisci quanto segue nella casella di testo «Direttive nginx aggiuntive», quindi fai clic su OK:

      limit_req zone=country_code;
      
    • (Tutti i siti web che appartengono a un piano di hosting) Vai su Piani di servizio e fai clic sul nome del piano di servizio di cui vuoi proteggere i siti web. Poi vai alla scheda «Server Web», inserisci quando segue nella casella di testo «Direttive nginx aggiuntive», e fai clic su OK:

      limit_req zone=country_code;
      
    • (Tutti i siti web ospitati sul server) Inserisci quanto segue nel file /etc/nginx/conf.d/limit_req.conf:

      limit_req zone=country_code;
      

Hai limitato le richieste a cinque al minuto a uno o più siti web da indirizzi IP con lo stesso codice ISO del paese.

È inoltre possibile proteggere una singola o più pagine web limitando le richieste provenienti da indirizzi IP che hanno lo stesso codice paese ISO. La procedura varia a seconda del tipo di hosting del sito web:

  • Apache+hosting nginx
  • hosting solo nginx
  • nginx configurato per servire direttamente PHP

(Apache+hosting nginx) Per proteggere una determinata pagina web da attacchi di forza bruta provenienti dallo stesso paese:

  1. Aggiungi al file /etc/nginx/conf.d/limit_req_zone.conf la direttiva con il seguente modello:

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

    Questo crea una zona di memoria condivisa tra i processi di lavoro di nginx. La zona memorizza lo stato di ogni indirizzo IP e la frequenza di accesso a un URL a richiesta limitata. La direttiva precedente limita le richieste da indirizzi IP con lo stesso codice paese ISO a cinque al minuto (rate=5r/m).

    Per saperne di più sui limiti di velocità in nginx <http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone>`__.

  2. Crea un modello di configurazione personalizzato nginxDomainVirtualHost.php usando questa procedura.

  3. Trova il testo seguente alla fine del modello predefinito copiato:

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

    E inserisci le tue direttive dopo di essa, sostituendo example.com con il tuo nome di dominio e /test con la pagina web esatta a cui vuoi applicare il limite:

    <?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. Esegui il comando seguente per verificare che i modelli modificati siano file PHP validi:

    php -l nginxDomainVirtualHost.php
    
  5. Esegui il comando seguente per generare nuovi file di configurazione:

    plesk sbin httpdmng --reconfigure-all
    

Hai limitato a cinque al minuto le richieste alla pagina web provenienti da indirizzi IP con lo stesso codice ISO del paese.

(Hosting solo nginx) Per proteggere una determinata pagina web da attacchi di forza bruta provenienti dallo stesso paese:

  1. Aggiungi al file /etc/nginx/conf.d/limit_req_zone.conf la direttiva con il seguente modello:

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

    Questo crea una zona di memoria condivisa tra i processi di lavoro di nginx. La zona memorizza lo stato di ogni indirizzo IP e la frequenza di accesso a un URL a richiesta limitata. La direttiva precedente limita le richieste da indirizzi IP con lo stesso codice paese ISO a cinque al minuto (rate=5r/m).

    Per saperne di più sui limiti di velocità in nginx <http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone>`__.

  2. Vai su Siti web e domini > dominio > scheda «Hosting e DNS» > Impostazioni di Apache & nginx.

  3. Inserisci quanto segue nella casella di testo «Direttive nginx aggiuntive» sostituendo /test con la pagina web precisa a cui vuoi applicare il limite:

    location = /test {
        limit_req zone=country_code;
    }
    
  4. Fai clic su OK.

Hai limitato a cinque al minuto le richieste alla pagina web provenienti da indirizzi IP con lo stesso codice ISO del paese.

(nginx che serve direttamente PHP) Per proteggere un particolare script PHP da attacchi di forza bruta provenienti dallo stesso paese:

  1. Aggiungi al file /etc/nginx/conf.d/limit_req_zone.conf la direttiva con il seguente modello:

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

    Questo crea una zona di memoria condivisa tra i processi di lavoro di nginx. La zona memorizza lo stato di ogni indirizzo IP e la frequenza di accesso a un URL a richiesta limitata. La direttiva precedente limita le richieste da indirizzi IP con lo stesso codice paese ISO a cinque al minuto (rate=5r/m).

    Per saperne di più sui limiti di velocità in nginx <http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone>`__.

  2. Crea un modello di configurazione personalizzato nginxDomainVirtualHost.php usando questa procedura.

  3. Trova il testo seguente alla fine del modello predefinito copiato:

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

    E inserisci le seguenti direttive prima del testo includendo limit_req e sostituendo example.com con il nome del proprio dominio e /test\.php con l’esatto script PHP a cui si vuole applicare il limite:

    <?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. Esegui il comando seguente per verificare che i modelli modificati siano file PHP validi:

    php -l nginxDomainVirtualHost.php
    
  5. Esegui il comando seguente per generare nuovi file di configurazione:

    plesk sbin httpdmng --reconfigure-all
    

Hai limitato a cinque al minuto le richieste allo script PHP provenienti da indirizzi IP con lo stesso codice ISO del paese.