(Plesk für Linux) Einrichten der IP-Geolokalisierung für eine Website

Die IP-Geolokalisierung ordnet die IP-Adresse eines Website-Besuchers seinem realen geografischen Standort zu, zum Beispiel einem Land oder einer Stadt.

Mit der IP-Geolokalisierung können Sie die Darstellung Ihrer Website für Besucher je nach deren Wohnort anpassen. Sie können Ihre Besucher zum Beispiel auf standortspezifische Webseiten umleiten oder den Zugriff auf Ihre Website für Besucher aus einem bestimmten Land sperren.

In diesem Abschnitt erfahren Sie, wie Sie die IP-Geolokalisierung in Plesk einrichten und wie Sie die IP-Geolokalisierung für gängige Anwendungsfälle nutzen, z.B.:

Einrichtung der IP-Geolokalisierung in Plesk

Sie richten die IP-Geolokalisierung in Plesk mit dem integrierten Nginx-Modul ngx_http_geoip2_module und den Geolokalisierungsdatenbanken von MaxMind ein, die Sie herunterladen müssen.

1. Downloading MaxMind Geolocation Databases

Das Unternehmen MaxMind bietet zwei Geolokalisierungsdatenbanken an: Die kostenlose GeoLite2 und die kostenpflichtige GeoIP2, die genauer ist als ihr kostenloses Gegenstück.

In diesem Abschnitt werden wir die kostenlose GeoLite2-Datenbank als Beispiel verwenden. Sie können sie jederzeit auf GeoIP2 aktualisieren.

Um die GeoLite2-Geolokalisierungsdatenbank herunterzuladen, müssen Sie zunächst ein kostenloses GeoLite2-Konto anlegen und dann auswählen, wie Sie die Datenbanken herunterladen möchten. Sie können dies auf die folgenden Arten tun:

  • Laden Sie die Archive der Datenbanken direkt herunter und laden Sie sie dann auf Ihren Plesk Server hoch.

  • Permalinks abrufen. Um die Datenbanken herunterzuladen, verwenden Sie diese Permalinks mit Skripten oder den Befehlen curl und get. Außerdem müssen Sie einen Lizenzschlüssel für Ihr GeoLite2-Konto generieren und dann verwenden. Erfahren Sie mehr darüber, wie Sie Permalinks erhalten und verwenden.

  • (Empfohlen) Verwenden Sie das Dienstprogramm geoipupdate.

    Wir empfehlen diese Vorgehensweise beim Herunterladen der Geolokalisierungsdatenbanken, da dieses Dienstprogramm in den Systempaketquellen der wichtigsten Linux-Distributionen verfügbar ist. Mit dem Dienstprogramm geoipupdate können Sie die Geolokalisierungsdatenbanken nicht nur herunterladen, sondern auch aktualisieren.

So laden Sie die GeoLite2-Geolokalisierungsdatenbank mit dem Dienstprogramm geoipupdate herunter:

Bemerkung

Um zu erfahren, welche Version des Dienstprogramms verfügbar ist und wie die Einstellungen des Dienstprogramms aussehen, führen Sie geoipupdate -v aus.

  1. Melden Sie sich an, um ein kostenloses GeoLite2-Konto zu erhalten.

  2. Melden Sie sich bei Ihrem GeoLite 2-Account an und generieren Sie einen Lizenzschlüssel. Kopieren Sie anschließend den Schlüssel und bewahren Sie ihn sicher auf. Aus Sicherheitsgründen werden Lizenzschlüssel nur angezeigt, wenn sie generiert wurden.

    Wenn Sie einen Lizenzschlüssel generieren, sehen Sie auch Ihre Account-ID. Sie benötigen im nächsten Schritt sowohl die Account-ID als auch den Lizenzschlüssel.

  3. Öffnen Sie die Datei /etc/GeoIP.conf zur Bearbeitung. Der Pfad zur Datei GeoIP.conf kann sich je nach Linux-Distribution unterscheiden.

  4. Fügen Sie Ihre Account-ID, Ihren Lizenzschlüssel und die Edition-IDs der Datenbanken ein, die Sie herunterladen möchten. Trennen Sie mehrere Editionen durch Leerzeichen. Sobald Sie die Einrichtung abgeschlossen haben, speichern Sie die Datei.

  5. Um die Datenbanken herunterzuladen, führen Sie sudo geoipupdate oder sudo geoipupdate -v aus (um detaillierte Informationen darüber zu erhalten, welche Datenbanken heruntergeladen werden und wohin).

2. Enabling ngx_http_geoip2_module in Plesk

In Plesk 18.0.46 und höher ist nginx bereits mit ngx_http_geoip2_module kompiliert. In der Standardeinstellung ist das Modul deaktiviert.

Bemerkung

Um zu überprüfen, ob nginx mit dem Modul kompiliert ist, führen Sie nginx -V aus. Wenn dies der Fall ist, sehen Sie mod_geoip2 in der Ausgabe.

So aktivieren Sie ngx_http_geoip2_module:

  1. Melden Sie sich über SSH bei Ihrem Plesk Server an.
  2. Aktivieren Sie das Modul, indem Sie plesk bin nginx -e geoip2 ausführen.

Das Modul ist aktiviert. Sie sehen es in der Liste der aktivierten nginx-Module, wenn Sie plesk bin nginx -s ausführen.

3. Configuring variables

Um Geolokalisierungsdaten zu verwenden und darauf basierende Entscheidungen zu treffen, müssen Sie die IP-Adresse eines Website-Besuchers verschiedenen Eigenschaften zuordnen (z.B. dem Namen eines Landes oder einer Stadt) und diese als Variablen in nginx-Konfigurationsdateien speichern.

Um Variablen zu konfigurieren:

  1. Fügen Sie die folgenden Direktiven in die Datei /etc/nginx/conf.d/geoip2.conf ein:

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

    Ersetzen Sie <path-to-the-database> durch den tatsächlichen Datenbankpfad, zum Beispiel /usr/share/GeoIP/GeoLite2-Country.mmdb

    Unter CentOS, AlmaLinux und anderen Red Hat-ähnlichen Betriebssystemen sind die Standardspeicherorte der Datenbanken die folgenden:

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

    Unter Debian und Ubuntu ist der Standardspeicherort der Datenbanken /var/lib/GeoIP.

  2. Führen Sie den Befehl service nginx reload aus, um die nginx-Konfigurationsdatei neu zu laden.

Sie haben die Einrichtung der IP-Geolokalisierung von Plesk abgeschlossen. Sie können nun ngx_http_geoip2_module für verschiedene, unten beschriebene Anwendungsfälle verwenden.

Um diese Anwendungsfälle anzuwenden, müssen Sie nginx-Anweisungen konfigurieren, die auf die folgenden Variablen verweisen:

Name der Variable Bedeutung der Variable
$geoip2_metadata_country_build Erstellungszeit der GeoLite2-Country-Datenbank
$geoip2_data_country_code Aus zwei Buchstaben bestehender ISO-Code des Landes
$geoip2_data_country_name Name des Landes in Englisch
$geoip2_data_city_name Name der Stadt in Englisch

Blockieren des Zugriffs auf eine Website für Besucher aus einem bestimmten Land

Sie können Besuchern aus einem bestimmten Land den Zugriff auf Ihre Website verweigern. Wenn sie versuchen, auf die Website zuzugreifen, sehen sie den Statuscode HTTP 403, was bedeutet, dass der Zugriff auf die angeforderte Ressource verboten ist.

Zum Blockieren des Zugriffs auf eine Website für Besucher aus einem bestimmten Land:

  1. Gehen Sie zu Websites & Domains > Domain > die Registerkarte „Hosting & DNS“ > Apache- & nginx-Einstellungen.

  2. Geben Sie Folgendes in das Textfeld „Zusätzliche nginx-Anweisungen“ ein und klicken Sie dann auf OK.

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

    Dabei ist XX der zweistellige ISO-Code des Landes, dessen Besucher Sie blockieren möchten (z.B. AQ für die Antarktis).

Besucher aus dem Land, dessen ISO-Code Sie angegeben haben, haben keinen Zugang mehr zu Ihrer Website.

Umleitung von Website-Besuchern zu einer standortspezifischen URL

Sie können Besucher, die auf die allgemeine URL (z.B. https://example.com/test) zugreifen, auf eine länderspezifische URL umleiten (z.B. https:// example.com/US/test).

Zur Umleitung von Website-Besuchern auf eine standortspezifische URL:

  1. Gehen Sie zu Websites & Domains > Domain > die Registerkarte „Hosting & DNS“ > Apache- & nginx-Einstellungen.

  2. Geben Sie Folgendes in das Textfeld „Zusätzliche nginx-Anweisungen“ ein und klicken Sie dann auf OK.

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

    Dabei ist <geolocation-specific-URL-part> der standortspezifische URL-Teil (zum Beispiel test).

Besucher, zum Beispiel aus den Vereinigten Staaten, werden nun auf https://example.com/US/test umgeleitet.

Anwendung der standortbezogenen Entscheidungen auf Websites, die zu einem Hosting-Paket gehören

Sie können z.B. Besucher aus einem bestimmten Land sperren oder umleiten, aber nicht für eine einzelne Website, sondern für alle Websites, die zu einem Hosting-Paket gehören. Dieser Fall ist ähnlich wie die beiden vorherigen mit einer einzelnen Website. Der einzige Unterschied besteht darin, dass Sie nicht die nginx-Einstellungen einer Domain, sondern die eines Hosting-Pakets verwenden müssen.

Betrachten wir anhand des Beispiels einer Website-Zugangssperre, wie das zu tun ist.

Zum Blockieren des Zugriffs auf Websites, die zu einem bestimmten Hosting-Paket gehören, für Besucher aus einem bestimmten Land:

  1. Gehen Sie zu Service-Pakete und klicken Sie auf den Namen des Service-Pakets, dessen Websites Sie sperren möchten.

  2. Gehen Sie zum Tab „Webserver“, fügen Sie im Textfeld „Zusätzliche nginx-Anweisungen“ Folgendes hinzu, und klicken Sie dann auf OK.

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

    Dabei ist XX der zweistellige ISO-Code des Landes, dessen Besucher Sie blockieren möchten (z.B. AQ für die Antarktis).

Besucher aus dem Land, dessen ISO-Code Sie angegeben haben, haben keinen Zugriff mehr auf alle Websites, die zu dem Hosting-Paket gehören.

Blockieren des Zugriffs auf alle auf dem Server gehosteten Websites für Besucher aus einem bestimmten Land

Es gibt zwei Möglichkeiten, diesen Anwendungsfall zu implementieren: mithilfe von Konfigurationsvorlagen oder Hosting-Paket-Einstellungen. Wir haben bereits beschrieben, wie Sie die Einstellungen für das Hosting-Paket verwenden können. Nachfolgend zeigen wir Ihnen, wie Sie benutzerdefinierte Konfigurationsvorlagen verwenden können.

Bemerkung

Entweder müssen Sie Konfigurationsvorlagen oder die Einstellungen des Hosting-Pakets verwenden. Es ist nicht möglich, den Zugriff auf alle auf dem Server gehosteten Websites zu verweigern, indem Sie die globale nginx-Konfigurationsdatei zu /etc/nginx/conf.d hinzufügen.

Zum Blockieren des Zugriffs auf alle auf dem Server gehosteten Websites für Besucher aus einem bestimmten Land:

  1. Erstellen Sie eine benutzerdefinierte Konfigurationsvorlage nginxDomainVirtualHost.php mithilfe dieser Vorgehensweise.

  2. Suchen Sie den folgenden Text am Ende der kopierten Standardvorlage:

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

    Und fügen Sie Ihre Anweisungen zur Zugriffsbeschränkung vor der rechten Klammer wie folgt ein:

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

    Dabei ist XX der zweistellige ISO-Code des Landes, dessen Besucher Sie blockieren möchten (z.B. AQ für die Antarktis).

  3. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die geänderten Vorlagen gültige PHP-Dateien sind:

    php -l nginxDomainVirtualHost.php
    
  4. Führen Sie den folgenden Befehl aus, um neue Konfigurationsdateien zu erzeugen:

    plesk sbin httpdmng --reconfigure-all
    

Besucher aus dem Land, dessen ISO-Code Sie angegeben haben, haben keinen Zugang mehr zu allen auf dem Server gehosteten Websites.

Schutz einer Website vor Brute-Force-Angriffen aus demselben Land

Sie können Ihre Website vor Brute-Force-Angriffen schützen, indem Sie Anfragen von IP-Adressen, die denselben ISO-Ländercode haben, begrenzen. Sie können diesen Schutz auf folgende Punkte anwenden:

  • Eine einzelne Website
  • Alle Websites eines Hosting-Pakets
  • Alle auf dem Server gehosteten Websites
  • Eine oder mehrere Webseiten (zum Beispiel example.com/test)

Zum Schutz einer oder mehrerer Websites vor Brute-Force-Angriffen aus demselben Land:

  1. Fügen Sie die Direktive nach folgendem Muster in die Datei /etc/nginx/conf.d/limit_req_zone.conf ein:

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

    Dadurch wird eine Speicherzone erstellt, die von den nginx-Arbeitsprozessen gemeinsam genutzt wird. Die Zone speichert den Status jeder IP-Adresse und die Häufigkeit, mit der sie auf eine URL mit Anfragebegrenzung zugegriffen hat. Die obige Direktive begrenzt Anfragen von IP-Adressen mit demselben ISO-Ländercode auf fünf pro Minute (rate=5r/m).

    Erfahren Sie mehr über die Ratenbegrenzung in nginx.

  2. Der zweite Schritt variiert je nachdem, welche und wie viele Websites Sie schützen möchten:

    • (Eine einzelne Website) Gehen Sie zu Websites & Domains > Domain > Tab „Hosting & DNS“ > Apache- & nginx-Einstellungen, geben Sie im Textfeld „Zusätzliche nginx-Anweisungen“ Folgendes ein, und klicken Sie dann auf OK:

      limit_req zone=country_code;
      
    • (Alle Websites eines Hosting-Pakets) Gehen Sie zu Service-Pakete und klicken Sie auf den Namen des Service-Pakets, dessen Websites Sie schützen möchten. Wechseln Sie dann auf den Tab „Webserver“, fügen Sie im Textfeld „Zusätzliche nginx-Anweisungen“ Folgendes hinzu und klicken Sie auf OK:

      limit_req zone=country_code;
      
    • (Alle auf dem Server gehosteten Websites) Fügen Sie Folgendes in die Datei /etc/nginx/conf.d/limit_req.conf ein:

      limit_req zone=country_code;
      

Sie haben die Anfragen an eine oder mehrere Websites von IP-Adressen mit demselben ISO-Ländercode auf fünf pro Minute beschränkt.

Sie können auch eine einzelne oder mehrere Webseiten schützen, indem Sie Anfragen von IP-Adressen mit demselben ISO-Ländercode beschränken. Das Verfahren unterscheidet sich je nach Art Ihres Website-Hostings:

  • Apache+nginx-Hosting
  • Hosting nur mit nginx
  • nginx bedient PHP direkt

(Apache+nginx-Hosting) Zum Schutz einer bestimmten Webseite vor Brute-Force-Angriffen aus demselben Land:

  1. Fügen Sie die Direktive nach folgendem Muster in die Datei /etc/nginx/conf.d/limit_req_zone.conf ein:

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

    Dadurch wird eine Speicherzone erstellt, die von den nginx-Arbeitsprozessen gemeinsam genutzt wird. Die Zone speichert den Status jeder IP-Adresse und die Häufigkeit, mit der sie auf eine URL mit Anfragebegrenzung zugegriffen hat. Die obige Direktive begrenzt Anfragen von IP-Adressen mit demselben ISO-Ländercode auf fünf pro Minute (rate=5r/m).

    Erfahren Sie mehr über die Ratenbegrenzung in nginx.

  2. Erstellen Sie eine benutzerdefinierte Konfigurationsvorlage nginxDomainVirtualHost.php mithilfe dieser Vorgehensweise.

  3. Suchen Sie den folgenden Text am Ende der kopierten Standardvorlage:

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

    Fügen Sie danach Ihre Direktiven wie folgt ein, wobei Sie example.com durch Ihren Domainnamen und /test durch den genauen Namen der Webseite ersetzen, auf die Sie das Limit anwenden möchten:

    <?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. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die geänderten Vorlagen gültige PHP-Dateien sind:

    php -l nginxDomainVirtualHost.php
    
  5. Führen Sie den folgenden Befehl aus, um neue Konfigurationsdateien zu erzeugen:

    plesk sbin httpdmng --reconfigure-all
    

Sie haben die Anfragen an die Webseite von IP-Adressen mit demselben ISO-Ländercode auf 5 pro Minute begrenzt.

(Hosting nur mit nginx) Zum Schutz einer bestimmten Webseite vor Brute-Force-Angriffen aus demselben Land:

  1. Fügen Sie die Direktive nach folgendem Muster in die Datei /etc/nginx/conf.d/limit_req_zone.conf ein:

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

    Dadurch wird eine Speicherzone erstellt, die von den nginx-Arbeitsprozessen gemeinsam genutzt wird. Die Zone speichert den Status jeder IP-Adresse und die Häufigkeit, mit der sie auf eine URL mit Anfragebegrenzung zugegriffen hat. Die obige Direktive begrenzt Anfragen von IP-Adressen mit demselben ISO-Ländercode auf fünf pro Minute (rate=5r/m).

    Erfahren Sie mehr über die Ratenbegrenzung in nginx.

  2. Gehen Sie zu Websites & Domains > Domain > die Registerkarte „Hosting & DNS“ > Apache- & nginx-Einstellungen.

  3. Geben Sie in das Textfeld „Zusätzliche nginx-Anweisungen“ Folgendes ein und ersetzen Sie /test durch den exakten Namen der Webseite, auf die Sie das Limit anwenden möchten:

    location = /test {
        limit_req zone=country_code;
    }
    
  4. Klicken Sie auf OK.

Sie haben die Anfragen an die Webseite von IP-Adressen mit demselben ISO-Ländercode auf 5 pro Minute begrenzt.

(nginx bedient PHP direkt) Um ein bestimmtes PHP-Skript vor Brute-Force-Angriffen aus demselben Land zu schützen:

  1. Fügen Sie die Direktive nach folgendem Muster in die Datei /etc/nginx/conf.d/limit_req_zone.conf ein:

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

    Dadurch wird eine Speicherzone erstellt, die von den nginx-Arbeitsprozessen gemeinsam genutzt wird. Die Zone speichert den Status jeder IP-Adresse und die Häufigkeit, mit der sie auf eine URL mit Anfragebegrenzung zugegriffen hat. Die obige Direktive begrenzt Anfragen von IP-Adressen mit demselben ISO-Ländercode auf fünf pro Minute (rate=5r/m).

    Erfahren Sie mehr über die Ratenbegrenzung in nginx.

  2. Erstellen Sie eine benutzerdefinierte Konfigurationsvorlage nginxDomainVirtualHost.php mithilfe dieser Vorgehensweise.

  3. Suchen Sie den folgenden Text am Ende der kopierten Standardvorlage:

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

    Und fügen Sie die folgenden Direktiven vor dem Text ein, einschließlich limit_req und ersetzen Sie example.com durch Ihren Domainnamen und /test\.php durch das exakte PHP-Skript, auf das Sie das Limit anwenden möchten:

    <?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. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die geänderten Vorlagen gültige PHP-Dateien sind:

    php -l nginxDomainVirtualHost.php
    
  5. Führen Sie den folgenden Befehl aus, um neue Konfigurationsdateien zu erzeugen:

    plesk sbin httpdmng --reconfigure-all
    

Sie haben die Anfragen an das PHP-Skript von IP-Adressen mit demselben ISO-Ländercode auf 5 pro Minute begrenzt.