В последнее время участились автоматизированный вредоносный трафик из различных сетей, массовые запросы ботов и DDoS-подобные атаки на веб-сайты и сервисы. Кроме того, значительную нагрузку могут создавать различные индексаторы, AI-боты и другие автоматизированные клиенты.
В некоторых случаях также может потребоваться ограничить доступ к веб-сайту в зависимости от страны нахождения посетителя – например, если сервис предназначен только для пользователей из определённых стран или если необходимо уменьшить ненужный трафик из регионов, откуда реальные клиенты не ожидаются.
Для этого мы добавили на наши серверы возможность ограничения доступа по странам на основе GeoIP.
1. Добавление/активация GeoIP-ограничений и примеры
2. Активация GeoIP-ограничений с разрешением поисковых роботов из заблокированной страны
3. Серверное ограничение, добавляемое автоматическим монитором безопасности
Ограничение на основе GeoIP позволяет разрешать или запрещать доступ к веб-сайту в зависимости от страны, определённой по IP-адресу посетителя.
На наших серверах информация GeoIP о стране уже доступна веб-серверу Apache через следующую переменную окружения:
MM_COUNTRY_CODE
Её значением обычно является двухбуквенный ISO-код страны, например:
EE = Эстония FI = Финляндия SE = Швеция US = США CN = Китай
Более подробный список можно найти ЗДЕСЬ, а ISO-код страны указан в столбце “Alpha-2 code”!
Клиенту не требуется отдельно активировать базу GeoIP или модуль Apache. Ограничения можно добавить в файл .htaccess своего веб-сайта.
Например, для блокировки Китая, России и США:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{ENV:MM_COUNTRY_CODE} ^(CN|RU|US)$ [NC]
RewriteRule ^ - [F,L]
</IfModule>
В этом случае посетители из всех остальных стран смогут пользоваться веб-сайтом как обычно.
Например, если веб-сайт предназначен только для пользователей из Эстонии, Финляндии, Латвии, Литвы и Швеции:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{ENV:MM_COUNTRY_CODE} !^$
RewriteCond %{ENV:MM_COUNTRY_CODE} !^(EE|FI|LV|LT|SE)$ [NC]
RewriteRule ^ - [F,L]
</IfModule>
Первое условие:
RewriteCond %{ENV:MM_COUNTRY_CODE} !^$
является важным. Оно предотвращает ситуацию, при которой все посетители могут быть ошибочно заблокированы в случае отсутствия информации GeoIP или временного сбоя.
При желании заблокированным посетителям можно показывать собственную страницу ошибки вместо стандартного сообщения «Forbidden»:
ErrorDocument 403 /geo-blocked.html
Например:
# BEGIN GeoIP Block
<If "reqenv('MM_COUNTRY_CODE') != '' && reqenv('MM_COUNTRY_CODE') !~ m#^(EE|FI|LV|LT|SE)$#">
ErrorDocument 403 /geo-blocked.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/geo-blocked\.html$
RewriteRule ^ - [F,L]
</IfModule>
</If>
# END GeoIP Block
Файл geo-blocked.html должен находиться в корневом каталоге документов веб-сайта и сам должен быть доступен через веб-сервер.
Для заблокированного запроса по-прежнему возвращается HTTP-статус:
403 Forbidden
Определение GeoIP основано на базе геолокации IP-адресов и не является точным на 100%. При использовании VPN, прокси, мобильного оператора, облачного сервиса или другой промежуточной сети определённая страна может отличаться от фактического местоположения пользователя.
Поэтому блокировку по странам следует использовать как дополнительную меру ограничения трафика и безопасности, а не как абсолютное подтверждение физического местоположения пользователя.
При применении ограничений по странам необходимо учитывать, что поисковые роботы также могут выполнять запросы из стран, трафик которых заблокирован на веб-сайте.
Например, Googlebot может выполнять запросы из США. Если US заблокирован, это может помешать индексированию веб-сайта поисковой системой Google.
Не рекомендуется разрешать Googlebot только на основании заголовка User-Agent, поскольку это значение легко подделать.
Apache позволяет проверить происхождение Googlebot с помощью DNS. Например, можно разрешить трафик из Эстонии, Финляндии, Латвии, Литвы и Швеции, а также разрешить проверенный Googlebot:
<IfModule mod_authz_core.c>
<IfModule mod_authz_host.c>
<RequireAny>
# Разрешённые страны
Require expr "reqenv('MM_COUNTRY_CODE') =~ m#^(EE|FI|LV|LT|SE)$#"
# Если результат GeoIP отсутствует, не блокировать посетителя
Require expr "reqenv('MM_COUNTRY_CODE') == ''"
# Проверенный Googlebot
Require host googlebot.com
</RequireAny>
</IfModule>
</IfModule>
Require host googlebot.com не доверяет только имени, указанному браузером или роботом. Apache выполняет обратный DNS-запрос для IP-адреса, а затем повторно проверяет полученное имя хоста с помощью прямого DNS-запроса.
Поэтому для получения доступа недостаточно просто подделать заголовок User-Agent Googlebot.
ВНИМАНИЕ! Эту конфигурацию необходимо использовать вместо предыдущего правила GeoIP-блокировки RewriteRule ... [F], а не одновременно с ним.
Если требуется заблокировать только обычных пользователей из США, но разрешить Googlebot, можно использовать, например:
<RequireAny>
Require expr "reqenv('MM_COUNTRY_CODE') != 'US'"
Require expr "reqenv('MM_COUNTRY_CODE') == ''"
Require host googlebot.com
</RequireAny>
Помимо собственных правил клиента в .htaccess, серверный монитор безопасности может обнаружить необычно высокий или вредоносный трафик и при необходимости дополнительно применить временное ограничение на основе GeoIP.
Целью такого ограничения является уменьшение, например:
Серверное ограничение может быть применено к конкретному домену или сервису и не зависит от содержимого собственного файла .htaccess клиента.
Такое ограничение может быть временным и может быть изменено или удалено после прекращения проблемного трафика.
Если посетители веб-сайта неожиданно получают связанную со страной ошибку 403, следует проверить файл .htaccess в корневом каталоге домена или учётной записи и убедиться, не были ли туда добавлены следующие строки (содержимое “(FI|EE|LT|LV|SE)” может отличаться, однако будет присутствовать строка “# BEGIN automated GeoIP Block”):
# BEGIN automated GeoIP Block
<If "reqenv('MM_COUNTRY_CODE') != '' && reqenv('MM_COUNTRY_CODE') !~ m#^(FI|EE|LT|LV|SE)$#">
ErrorDocument 403 "<div style='text-align:center'><b>403</b> - Access to this website is restricted based on IP geolocation</div>"
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^ - [F,L]
</IfModule>
</If>
# END automated GeoIP Block
При необходимости содержимое между тегами BEGIN и END можно изменить или полностью удалить после устранения проблемы, если вы хотите вновь открыть доступ к веб-сайту также из стран, не указанных в соответствующих настройках.