IP ジオロケーションは、ウェブサイト訪問者の IP アドレスを、その人が実際にいる地理的な場所(国や市町村)にマッピングします。

IP ジオロケーションにより、訪問者の居住地に応じてウェブサイトの表示を調整できるようになります。たとえば、訪問者を地域別のウェブページにリダイレクトすることや、特定の国からの訪問者がウェブサイトにアクセスできないようにブロックすることができます。

このトピックでは、Plesk で IP ジオロケーションをセットアップする方法や、次のような一般的なユースケースで IP ジオロケーションを使用する方法を説明します。

Plesk で IP ジオロケーションをセットアップする

Plesk で IP ジオロケーションをセットアップするには、ビルトインの ngx_http_geoip2_module nginx モジュールと MaxMind ジオロケーションデータベース(ダウンロードが必要)を使用します。

1. Downloading MaxMind Geolocation Databases

MaxMind 社が提供するジオロケーションデータベースは 2 種類あります。無料の GeoLite2 と、それより精度の高い有料の GeoIP2 です。

このトピックでは、例として GeoLite2 データベースを使用しますが、いつでも GeoIP2 にアップグレードできます。

GeoLite2 ジオロケーションデータベースをダウンロードするには、まず無料の GeoLite2 アカウントを作成してから、データベースのダウンロード方法を選択します。これは次の方法で行えます。

  • データベースのアーカイブを直接ダウンロードして、Plesk サーバにアップロードする。

  • パーマリンクを取得する。データベースをダウンロードするには、スクリプトまたは curl および get コマンドでこれらのパーマリンクを使用します。また、GeoLite2 アカウント用のライセンスキーを生成して使用する必要もあります。パーマリンクを取得して使用する方法はこちらをご覧ください。

  • (推奨)geoipupdate ユーティリティを使用する。

    このユーティリティは主要な Linux ディストリビューションのシステムパッケージリポジトリから利用できるため、ジオロケーションデータベースのダウンロードには、この方法を推奨します。geoipupdate ユーティリティでは、ジオロケーションデータベースをダウンロードできるだけでなく、更新も行えます。

geoipupdate ユーティリティを使用して GeoLite2 ジオロケーションデータベースをダウンロードするには:

注釈: 使用できるユーティリティのバージョンとユーティリティの設定を確認するには、geoipupdate -v を実行します。

  1. 登録して無料の GeoLite2 アカウントを取得します。

  2. GeoLite2 アカウントにログインしてライセンスキーを生成します。これが完了したら、キーをコピーして安全に保管しておきます。セキュリティ上の理由から、ライセンスキーは生成時にだけ表示されます。

    ライセンスキーを生成すると、アカウント ID も表示されます。次の手順では、アカウント ID とライセンスキーの両方が必要になります。

  3. /etc/GeoIP.conf ファイルを編集用に開きます。GeoIP.conf ファイルのパスは、使用している Linux ディストリビューションに応じて異なります。

  4. アカウント ID、ライセンスキー、およびダウンロードするデータベースのエディション ID を貼り付けます。複数のエディションを入力するにはスペースで区切ります。セットアップが完了したらフェイルを保存します。

  5. データベースをダウンロードするには、sudo geoipupdate または sudo geoipupdate -v を実行します(ダウンロードされるデータベースやダウンロード先に関する詳細情報が表示されます)。

2. Enabling ngx_http_geoip2_module in Plesk

Plesk 18.0.46 以降では、nginx は既に ngx_http_geoip2_module とコンパイルされています。デフォルトでこのモジュールは無効になっています。

注釈: nginx がこのモジュールとコンパイルされていることを確認するには、nginx -V を実行します。コンパイルされている場合、出力に mod_geoip2 が表示されます。

ngx_http_geoip2_module を有効にするには:

  1. Plesk サーバに SSH 経由でログインします。
  2. plesk bin nginx -e geoip2 を実行してモジュールを有効にします。

モジュールが有効になります。plesk bin nginx -s を実行すると、有効な nginx モジュールのリストにこのモジュールが表示されます。

3. Configuring variables

ジオロケーションデータを使用し、このデータに基づいて決定を下すには、ウェブサイト訪問者の IP アドレスをさまざまなプロパティ(国や市町村名など)にマッピングして、それらを nginx の構成ファイルに保存する必要があります。

変数を構成するには:

  1. /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;
    }
    

    <path-to-the-database> を実際のデータベースパスに置換します(たとえば /usr/share/GeoIP/GeoLite2-Country.mmdb)。

    CentOS、AlmaLinux、その他の Red Hat 系オペレーティングシステムにおけるデータベースのデフォルトの場所は次のとおりです。

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

    Debian と Ubuntu におけるデータベースのデフォルトの場所は /var/lib/GeoIP です。

  2. service nginx reload コマンドを実行して、nginx の構成ファイルをリロードします。

Plesk で IP ジオロケーションのセットアップが完了しました。以下に説明するさまざまなユースケースで ngx_http_geoip2_module を使用できます。

これらのユースケースを適用するには、以下の変数を参照して nginx ディレクティブを構成する必要があります。

変数名 変数の意味
$geoip2_metadata_country_build GeoLite2-Country データベース
$geoip2_data_country_code 2 文字の国 ISO コード
$geoip2_data_country_name 英語の国名
$geoip2_data_city_name 英語の市町村名

特定の国からの訪問者がウェブサイトにアクセスできないようにブロックする

特定の国からの訪問者がウェブサイトにアクセスすることを拒否できます。該当する訪問者がウェブサイトへのアクセスを試みると、ステータスコード HTTP 403 が表示されます。これは、要求されたリソースへのアクセスが禁止されていることを意味します。

特定の国からの訪問者がウェブサイトにアクセスできないようにブロックするには:

  1. [ウェブサイトとドメイン] > ドメイン > [ホスティングと DNS]タブ > [Apache と nginx の設定]の順に選択します。

  2. [nginx 追加ディレクティブ]テキストボックスに次のように入力して、[OK]をクリックします。

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

    ここで XX は、訪問者をブロックしたい国の 2 文字の ISO コードです(たとえば AQ は南極)。

指定した ISO コードの国からの訪問者は、貴社のウェブサイトにアクセスできなくなります。

ウェブサイトの訪問者をジオロケーションに固有の URL にリダイレクトする

一般の URL(たとえば https://example.com/test)にアクセスした訪問者を、国別の URL(たとえば https:// example.com/US/test)にリダイレクトできます。

ウェブサイトの訪問者をジオロケーションに固有の URL にリダイレクトするには:

  1. [ウェブサイトとドメイン] > ドメイン > [ホスティングと DNS]タブ > [Apache と nginx の設定]の順に選択します。

  2. [nginx 追加ディレクティブ]テキストボックスに次のように入力して、[OK]をクリックします。

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

    ここで <geolocation-specific-URL-part> は、ジオロケーションに固有の URL 部分です(たとえば test)。

たとえば、米国からの訪問者は https://example.com/US/test にリダイレクトされるようになります。

1 つのホスティングプランに属するすべてのウェブサイトに、ジオロケーションに基づく決定を適用する

特定の国からの訪問者をブロックまたはリダイレクトしたりできますが、その対象を 1 つのウェブサイトではなく 1 つのホスティングプランに属するすべてのウェブサイトにすることが可能です。このユースケースは、個別のウェブサイトを対象としていた前述の 2 つのケースと似ています。唯一の違いは、ドメインではなくホスティングプランの nginx 設定を使用する必要があるという点です。

ウェブサイトへのアクセスのブロックを例にとって、その手順を見てみましょう。

1 つのホスティングプランに属するすべてのウェブサイトにアクセスできないように、特定の国からの訪問者をブロックするには:

  1. [サービスプラン]に移動して、ウェブサイトへのアクセスをブロックしたいサービスプランの名前をクリックします。

  2. [ウェブサーバ]タブに移動して、[nginx 追加ディレクティブ]テキストボックスに次のように入力してから[OK]をクリックします。

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

    ここで XX は、訪問者をブロックしたい国の 2 文字の ISO コードです(たとえば AQ は南極)。

指定した ISO コードの国からの訪問者は、このホスティングプランに属するすべてのウェブサイトにアクセスできなくなります。

特定の国からの訪問者がサーバでホストされているすべてのウェブサイトにアクセスできないようにブロックする

このユースケースを実装するには 2 つの方法があります。構成テンプレートを使用するか、ホスティングプランの設定を使用します。ホスティングプランの設定の使用方法については既に説明しました。以下では、カスタム構成テンプレートの使用方法をご紹介します。

注釈: 構成テンプレートまたはホスティングプランの設定のいずれかを使用する必要があります。 /etc/nginx/conf.d にグローバル nginx 構成ファイルを追加しても、サーバ上でホストされているすべてのウェブサイトへのアクセスを拒否することはできません。

特定の国からの訪問者がサーバでホストされているすべてのウェブサイトにアクセスできないようにブロックするには:

  1. こちらの手順に従って、カスタム構成テンプレート nginxDomainVirtualHost.php を作成します。

  2. コピーしたデフォルトテンプレートの最後にある次のテキストを探します。

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

    次のように、右中括弧の前にアクセス制限ディレクティブを挿入します。

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

    ここで XX は、訪問者をブロックしたい国の 2 文字の ISO コードです(たとえば AQ は南極)。

  3. 次のコマンドを実行して、変更されたテンプレートが有効な PHP ファイルであることを確認します。

    php -l nginxDomainVirtualHost.php
    
  4. 次のコマンドを実行して、新しい構成ファイルを生成します。

    plesk sbin httpdmng --reconfigure-all
    

指定した ISO コードの国からの訪問者は、このサーバでホストされているすべてのウェブサイトにアクセスできなくなります。

同じ国からの総当たり攻撃からウェブサイトを保護する

同じ ISO 国コードを持つ複数の IP アドレスからのリクエストを制限することで、総当たり攻撃からウェブサイトを保護することができます。以下のものを対象に保護を適用できます。

  • 単一のウェブサイト
  • 1 つのホスティングプランに属するすべてのウェブサイト
  • サーバでホストされているすべてのウェブサイト
  • 1 つまたは複数のウェブページ(たとえば example.com/test

同じ国からの総当たり攻撃から 1 つまたは複数のウェブサイトを保護するには:

  1. /etc/nginx/conf.d/limit_req_zone.conf ファイルに、次のパターンでディレクティブを追加します。

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

    これにより、nginx ワーカプロセス間で共有されるメモリ領域が作成されます。この領域に、各 IP アドレスの状態と、リクエストが制限されている URL へのアクセス頻度が格納されます。 上記のディレクティブでは、同じ ISO 国コードを持つ複数の IP アドレスからのリクエストを、1 分あたり 5 回までに制限しています(rate=5r/m)。

    nginx でのレート制限について詳しくはこちらをご覧ください。

  2. 2 番目の手順は、保護したいウェブサイトの数と内容によって異なります。

    • (単一のウェブサイト)[ウェブサイトとドメイン] > ドメイン > [ホスティングと DNS]タブ > [Apache と nginx の設定]の順に移動して、[nginx 追加ディレクティブ]に次の内容を入力してから[OK]をクリックします。

      limit_req zone=country_code;
      
    • (1 つのホスティングプランに属するすべてのウェブサイト)[サービスプラン]に移動して、保護したいウェブサイトのサービスプランの名前をクリックします。次に、[ウェブサーバ]タブに移動して、[nginx 追加ディレクティブ]テキストボックスに次のように入力してから[OK]をクリックします。

      limit_req zone=country_code;
      
    • (サーバでホストされているすべてのウェブサイト)次の内容を /etc/nginx/conf.d/limit_req.conf ファイルに入力します。

      limit_req zone=country_code;
      

同じ ISO 国コードを持つ複数の IP アドレスから 1 つまたは複数のウェブサイトへのリクエストを、1 分あたり 5 回までに制限しました。

同じ ISO 国コードを持つ複数の IP アドレスからのリクエストを制限することで、1 つまたは複数のウェブページを保護することもできます。手順はウェブサイトのホスティングタイプに応じて異なります。

  • Apache+nginx ホスティング
  • nginx のみのホスティング
  • PHP を直接処理するように構成された nginx

(Apache+nginx ホスティング)特定のウェブページを同じ国からの総当り攻撃から防御するには:

  1. /etc/nginx/conf.d/limit_req_zone.conf ファイルに、次のパターンでディレクティブを追加します。

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

    これにより、nginx ワーカプロセス間で共有されるメモリ領域が作成されます。この領域に、各 IP アドレスの状態と、リクエストが制限されている URL へのアクセス頻度が格納されます。 上記のディレクティブでは、同じ ISO 国コードを持つ複数の IP アドレスからのリクエストを、1 分あたり 5 回までに制限しています(rate=5r/m)。

    nginx でのレート制限について詳しくはこちらをご覧ください。

  2. こちらの手順に従って、カスタム構成テンプレート nginxDomainVirtualHost.php を作成します。

  3. コピーしたデフォルトテンプレートの最後にある次のテキストを探します。

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

    次のように、その後にディレクティブを挿入して、example.com を実際に使用するドメイン名に、/test を制限を適用したいウェブページに置き換えます。

    <?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. 次のコマンドを実行して、変更されたテンプレートが有効な PHP ファイルであることを確認します。

    php -l nginxDomainVirtualHost.php
    
  5. 次のコマンドを実行して、新しい構成ファイルを生成します。

    plesk sbin httpdmng --reconfigure-all
    

同じ ISO 国コードを持つ複数の IP アドレスからウェブページへのリクエストを、1 分あたり 5 回までに制限しました。

(nginx のみのホスティング)特定のウェブページを同じ国からの総当り攻撃から防御するには:

  1. /etc/nginx/conf.d/limit_req_zone.conf ファイルに、次のパターンでディレクティブを追加します。

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

    これにより、nginx ワーカプロセス間で共有されるメモリ領域が作成されます。この領域に、各 IP アドレスの状態と、リクエストが制限されている URL へのアクセス頻度が格納されます。 上記のディレクティブでは、同じ ISO 国コードを持つ複数の IP アドレスからのリクエストを、1 分あたり 5 回までに制限しています(rate=5r/m)。

    nginx でのレート制限について詳しくはこちらをご覧ください。

  2. [ウェブサイトとドメイン] > ドメイン > [ホスティングと DNS]タブ > [Apache と nginx の設定]の順に選択します。

  3. [nginx 追加ディレクティブ]テキストボックスに次のように入力して、/test を制限を適用したいウェブページに置き換えます。

    location = /test {
        limit_req zone=country_code;
    }
    
  4. [OK]をクリックします。

同じ ISO 国コードを持つ複数の IP アドレスからウェブページへのリクエストを、1 分あたり 5 回までに制限しました。

(PHP を直接処理するように構成された nginx)特定の PHP スクリプトを同じ国からの総当り攻撃から防御するには:

  1. /etc/nginx/conf.d/limit_req_zone.conf ファイルに、次のパターンでディレクティブを追加します。

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

    これにより、nginx ワーカプロセス間で共有されるメモリ領域が作成されます。この領域に、各 IP アドレスの状態と、リクエストが制限されている URL へのアクセス頻度が格納されます。 上記のディレクティブでは、同じ ISO 国コードを持つ複数の IP アドレスからのリクエストを、1 分あたり 5 回までに制限しています(rate=5r/m)。

    nginx でのレート制限について詳しくはこちらをご覧ください。

  2. こちらの手順に従って、カスタム構成テンプレート nginxDomainVirtualHost.php を作成します。

  3. コピーしたデフォルトテンプレートの最後にある次のテキストを探します。

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

    limit_req が含まれるテキストの前に次のディレクティブを挿入して、example.com を実際に使用するドメイン名に、/test\.php を制限を適用したい PHP スクリプトに置き換えます。

    <?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. 次のコマンドを実行して、変更されたテンプレートが有効な PHP ファイルであることを確認します。

    php -l nginxDomainVirtualHost.php
    
  5. 次のコマンドを実行して、新しい構成ファイルを生成します。

    plesk sbin httpdmng --reconfigure-all
    

同じ ISO 国コードを持つ複数の IP アドレスから PHP スクリプトへのリクエストを、1 分あたり 5 回までに制限しました。