# (Plesk для Linux) Настройка геолокации IP-адреса сайта

Геолокация IP-адреса позволяет соотнести IP-адрес посетителя сайта с реальным географическим положением (например, страной или городом).

Геолокация IP-адреса позволяет настроить отображение сайта для посетителя в зависимости от его местоположения. Например, можно перенаправлять посетителей на отдельные региональные страницы или блокировать доступ посетителям из определенной страны.

Здесь мы обсудим, как настроить геолокацию IP-адреса в Plesk и как использовать ее для таких целей, как:

- Блокировка доступа к сайту для посетителей из определенной страны.

- Блокировка доступа ко всем сайтам на сервере для посетителей из определенной страны.

- Перенаправление посетителей сайта на региональный URL.

- Определение действий, соответствующих географической позиции, для сайтов одного хостинг-плана.

- Защита сайта от атак методом полного перебора из одной страны.

## Настройка геолокации IP-адреса в Plesk

Настройка геолокации IP-адресов в Plesk осуществляется с помощью встроенного модуля nginx `ngx_http_geoip2_module` и баз данных геолокации MaxMind, которые вам потребуется загрузить.

### 1. Загрузка баз данных геолокации MaxMind

Компания MaxMind предлагает к использованию две базы данных: бесплатную GeoLite2 и платную и более точную GeoIP2.

Здесь в качестве примера мы возьмем бесплатную базу данных GeoLite2. Вы можете улучшить ее до GeoIP2 в любой момент.

Для загрузки базы данных геолокации GeoLite2 создайте бесплатный аккаунт GeoLite2 и выберите способ загрузки баз данных. Сделать это можно следующим образом:

- Загрузите архивы баз данных напрямую, а затем выгрузите их на свой сервер Plesk.

- Получите постоянные ссылки. Чтобы скачать базы данных, воспользуйтесь постоянными ссылками с помощью скриптов или команд `curl` and `get`. Также потребуется сгенерировать и использовать лицензионный ключ для учетной записи GeoLite2. Узнайте больше о том, как получить и использовать постоянные ссылки.

- (Рекомендуется) Используйте утилиту `geoipupdate`.

  Мы рекомендуем использовать этот способ загрузки баз данных геолокации, поскольку эта утилита доступна в репозиториях системных пакетов в наиболее часто используемых дистрибутивах Linux. С помощью утилиты `geoipupdate` вы можете как загрузить базы данных геолокации, так и обновить их.

Для загрузки базы данных геолокации GeoLite2 c помощью утилиты `geoipupdate`:

Примечание

Чтобы просмотреть, какая версия утилиты доступна, а также настройки утилиты, запустите `geoipupdate -v`.

1. Создайте бесплатную учетную запись GeoLite2.

2. Войдите в свой аккаунт GeoLite2 и сгенерируйте лицензионный ключ, затем скопируйте и сохраните его. По соображениям безопасности лицензионные ключи отображаются только при генерации.

   При генерации лицензионного ключа вы также увидите ID своей учетной записи. Для следующего шага вам потребуется лицензионный ключ и ID учетной записи.

3. Откройте файл `/etc/GeoIP.conf` для редактирования. Путь к файлу `GeoIP.conf` может отличаться в зависимости от вашего дистрибутива Linux.

4. Вставьте ID своей учетной записи, лицензионный ключ и ID издания баз данных, которые вы хотите загрузить. Если вы загружаете несколько изданий, разделите их пробелами. Сохраните внесенные изменения.

   Примечание

   Также можно загрузить частично заполненный файл GeoIP.conf отсюда.

5. Чтобы загрузить базы данных, выполните команды `sudo geoipupdate` или `sudo geoipupdate -v` (чтобы просмотреть информацию о том, какие базы данных загружаются и куда).

### 2. Включение ngx_http_geoip2_module в Plesk

In Plesk 18.0.46 and later, nginx is already compiled with `ngx_http_geoip2_module`. By default, the module is disabled.

Примечание

Чтобы проверить, есть ли этот модуль в nginx, выполните команду `nginx -V`. Если модуль есть, вы увидите `mod_geoip2` в выводе.

Для включения модуля ngx_http_geoip2_module:

1. Войдите на сервер Plesk по SSH.

2. Включите модуль, выполнив команду `plesk bin nginx -e geoip2`.

Модуль включен. Вы увидите его в списке включенных модулей nginx при выполнении команды `plesk bin nginx -s`.

### 3. Конфигурация переменных

Для использования данных о геопозиции и принятии соответствующих решений вам нужно привязать 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.

Настройка геолокации IP-адреса в Plesk завершена. Теперь вы можете использовать модуль `ngx_http_geoip2_module` в кейсах, описанных ниже.

Чтобы решить данные кейсы, нужно настроить директивы nginx соответственно следующим переменным:

Имя переменной | Значение переменной
--- | ---
`$geoip2_metadata_country_build` | Время сборки базы данных GeoLite2-Country
`$geoip2_data_country_code` | Двухбуквенный код ISO страны
`$geoip2_data_country_name` | Имя страны на английском
`$geoip2_data_city_name` | Имя города на английском

## Блокировка доступа к сайту для посетителей из определенной страны

Вы можете заблокировать доступ к сайту для посетителей из определенной страны. При попытке открыть сайт, появится страница с кодом 403: Доступ к запрашиваемому ресурсу запрещен.

Чтобы заблокировать доступ к сайту для посетителей из определенной страны:

1. Перейдите на страницу Сайты и домены > имя домена > вкладка «Хостинг и DNS» > Настройки Apache и nginx.

2. В окне «Дополнительные директивы nginx» введите следующее и нажмите ОК.

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

   Где `XX` — двухбуквенный код ISO страны, для посетителей из которой вы хотите закрыть доступ (например, код `AQ` — Антарктика).

Посетители из страны с указанным кодом ISO больше не смогут получить доступ к вашему сайту.

## Перенаправление посетителей сайта на определенный региональный URL

Вы можете перенаправить пользователей, которые воспользовались основным URL (например, `https://example.com/test`), на региональный URL (например, `https:// example.com/US/test`).

Чтобы перенаправить посетителей сайта на региональный URL:

1. Перейдите на страницу Сайты и домены > имя домена > вкладка «Хостинг и DNS» > Настройки Apache и nginx.

2. В окне «Дополнительные директивы nginx» введите следующее и нажмите ОК.

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

## Добавление региональных решений на сайты одного хостинг-плана

Например, вы можете заблокировать или перенаправить посетителей из определенной страны не только на одном сайте, но и на всех сайтах одного хостинг-плана. Этот кейс похож на два предыдущих, связанных с отдельным сайтом. Единственная разница заключается в том, что используются настройки nginx хостинг-плана, а не домена.

Давайте рассмотрим, как это сделать, на примере блокировки доступа к сайту.

Чтобы заблокировать доступ к сайтам одного-хостинг плана для посетителей из определенной страны:

1. Перейдите в раздел Тарифные планы и нажмите на название тарифного плана, доступ к сайтам которого вы хотите заблокировать.

2. В окне «Дополнительные директивы nginx» вкладки «Веб-сервер» введите следующее и нажмите ОК.

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

   Где `XX` — двухбуквенный код ISO страны, для посетителей из которой вы хотите закрыть доступ (например, код `AQ` — Антарктика).

Посетители из страны с указанным кодом ISO больше не смогут получить доступ к сайтам этого хостинг-плана.

## Блокировка доступа ко всем сайтам на сервере для посетителей из определенной страны

Есть два способа реализовать данный кейс: использование шаблонов конфигурации или настроек хостинг-плана. Ранее мы описали, как использовать настройки хостинг-плана, а теперь разберем, как использовать персональные шаблоны конфигурации.

Примечание

Нужно использовать шаблоны конфигурации или настройки хостинг-плана. Добавлением глобального файла конфигурации nginx в `/etc/nginx/conf.d` доступ ко всем сайтам на сервере заблокировать нельзя.

Чтобы заблокировать доступ ко всем сайтам на сервере для посетителей из определенной страны:

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` — двухбуквенный код ISO страны, для посетителей из которой вы хотите закрыть доступ (например, код `AQ` — Антарктика).

3. Запустите следующую команду, чтобы убедиться, что измененные шаблоны являются рабочими файлами PHP:

       php -l nginxDomainVirtualHost.php

4. Запустите следующую команду для создания новых файлов конфигурации:

       plesk sbin httpdmng --reconfigure-all

Посетители из страны с указанным кодом ISO больше не смогут получить доступ ко всем сайтам на этом сервере.

## Защита сайта от атак методом полного перебора из одной страны

Вы можете защитить сайт от атак методом полного перебора, ограничив запросы с IP-адресом, у которых совпадает код ISO страны. Применить эту защиту можно к:

- Одному сайту

- Всем сайтам одного хостинг-плана

- Всем сайтам на сервере

- Одной или нескольким веб-страницам (например, `example.com/test`)

Чтобы защитить один или несколько сайтов от атак методом полного перебора из одной страны:

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 с ограничением по запросам. Вышеуказанная директива ограничивает количество запросов с IP-адресов с одинаковым кодом ISO страны до пяти в минуту (`rate=5r/m`).

   Узнайте больше об ограничении количества запросов в nginx.

2. Во втором шаге действия зависят от того, какие сайты вы хотите защитить и в каком количестве:

   - Один сайт: перейдите в Сайты и домены > домен > вкладка «Хостинг и DNS» > Настройки Apache & nginx, введите в текстовое окно «Дополнительные директивы nginx» следующий текст и нажмите ОК:

         limit_req zone=country_code;

   - Все сайты одного хостинг-плана: перейдите в Тарифные планы, нажмите на название тарифного плана, сайты которого вы хотите защитить. Перейдите во вкладку «Веб-сервер», введите в текстовое окно «Дополнительные директивы nginx» следующий текст и нажмите ОК:

         limit_req zone=country_code;

   - Все сайты на сервере: добавьте следующее в файл `/etc/nginx/conf.d/limit_req.conf`:

         limit_req zone=country_code;

Так вы ограничите количество запросов с IP-адресов с одним кодом ISO страны до 5 в минуту для одного или нескольких сайтов.

Также вы можете защитить одну или несколько веб-страниц, ограничив количество запросов с IP-адресом с одинаковым кодом ISO страны. Порядок действий зависит от типа хостинга страницы:

- Хостинг Apache+nginx

- хостинг с использованием только nginx

- nginx с настройкой прямого обслуживания PHP

Хостинг 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 с ограничением по запросам. Вышеуказанная директива ограничивает количество запросов с IP-адресов с одинаковым кодом ISO страны до пяти в минуту (`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

Так вы ограничите количество запросов с IP-адресов с одним кодом ISO страны до 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 с ограничением по запросам. Вышеуказанная директива ограничивает количество запросов с IP-адресов с одинаковым кодом ISO страны до пяти в минуту (`rate=5r/m`).

   Узнайте больше об ограничении количества запросов в nginx.

2. Перейдите на страницу Сайты и домены > имя домена > вкладка «Хостинг и DNS» > Настройки Apache и nginx.

3. В окне «Дополнительные директивы nginx» введите текст ниже и вместо `/test` укажите точный адрес страницы, на которую хотите наложить ограничение:

       location = /test {
           limit_req zone=country_code;
       }

4. Нажмите OK.

Так вы ограничите количество запросов с IP-адресов с одним кодом ISO страны до 5 в минуту для веб-страницы.

(nginx обслуживает PHP напрямую) Для защиты определенного скрипта 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 с ограничением по запросам. Вышеуказанная директива ограничивает количество запросов с IP-адресов с одинаковым кодом ISO страны до пяти в минуту (`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

Так вы ограничите количество запросов с IP-адресов с одним кодом ISO страны до 5 в минуту для скрипта PHP.