Перейти к содержанию

Блокировка стран с помощью GeoIP2

Контролируйте доступ по странам с помощью точной базы данных геолокации MaxMind.


  • Блокировка недобросовестных пользователей


    Остановите атаки из стран с высоким уровнем риска до того, как они достигнут вашего приложения

  • Соответствие требованиям


    Применяйте географические ограничения для соблюдения GDPR, лицензирования или юридических требований

  • Нулевые накладные расходы


    Поиск в базе данных в памяти — без внешних API-вызовов или задержек

  • Точные данные


    Базы данных MaxMind GeoIP2 с точностью по странам 99.8%


Предварительные требования

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

  1. Зарегистрируйтесь на maxmind.com/en/geolite2/signup
  2. Сгенерируйте лицензионный ключ в вашей учетной записи
  3. Сохраните его для настройки автоматического обновления

Быстрая настройка

Шаг 1: Установите модуль GeoIP2

# Установите репозиторий GetPageSpeed
dnf -y install https://extras.getpagespeed.com/release-latest.rpm

# Установите модуль GeoIP2 и автоматический обновлятор базы данных
dnf -y install nginx-module-geoip2 geoipupdate

Включите в /etc/nginx/nginx.conf:

load_module modules/ngx_http_geoip2_module.so;

Шаг 2: Настройте обновления базы данных

Отредактируйте /etc/GeoIP.conf:

AccountID YOUR_ACCOUNT_ID
LicenseKey YOUR_LICENSE_KEY
EditionIDs GeoLite2-Country GeoLite2-City

Скачайте базы данных:

geoipupdate

Включите автоматические еженедельные обновления:

systemctl enable --now geoipupdate.timer

Шаг 3: Настройте NGINX

Добавьте в ваш блок http в /etc/nginx/nginx.conf:

# Загрузите базы данных GeoIP2
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
    auto_reload 60m;
    $geoip2_country_code country iso_code;
    $geoip2_country_name country names en;
}

Шаг 4: Блокировка стран

# Блокировка России, Китая, Северной Кореи
map $geoip2_country_code $blocked_country {
    default 0;
    RU 1;
    CN 1;
    KP 1;
}

server {
    # ... ваша конфигурация сервера ...

    if ($blocked_country) {
        return 403;
    }
}
# Разрешить только США, Великобританию, Канаду, Австралию
map $geoip2_country_code $allowed_country {
    default 0;
    US 1;
    GB 1;
    CA 1;
    AU 1;
}

server {
    # ... ваша конфигурация сервера ...

    if ($allowed_country = 0) {
        return 403;
    }
}
map $geoip2_country_code $blocked_country {
    default 0;
    RU 1;
    CN 1;
}

server {
    error_page 403 /geo-blocked.html;

    location = /geo-blocked.html {
        internal;
        root /var/www/error-pages;
    }

    if ($blocked_country) {
        return 403;
    }
}

Перезагрузите NGINX:

nginx -t && systemctl reload nginx

Тестирование

# Тест с известным IP
curl -H 'X-Forwarded-For: 8.8.8.8' https://example.com
# Должно работать (Google DNS - США)

curl -H 'X-Forwarded-For: 77.88.8.8' https://example.com
# Должно быть заблокировано (Yandex DNS - Россия, если RU заблокирована)

Тестирование локально

Локальные/частные IP возвращают пустые коды стран. Тестируйте с реальными публичными IP.


Расширенное использование

Используйте реальный IP клиента за прокси/CDN

geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
    $geoip2_country_code source=$http_x_forwarded_for country iso_code;
}

Разные правила для разных путей

# Блокировка повсюду, кроме API
location / {
    if ($blocked_country) {
        return 403;
    }
    # ... обычная конфигурация ...
}

location /api/ {
    # API доступен отовсюду
    # ... конфигурация API ...
}

Логирование информации о стране

log_format geo '$remote_addr - $geoip2_country_code - $request';
access_log /var/log/nginx/geo.log geo;

Ограничение по скорости по странам

# Более строгие ограничения для стран с высоким риском
map $geoip2_country_code $limit_key {
    default $binary_remote_addr;
    RU $binary_remote_addr$geoip2_country_code;
    CN $binary_remote_addr$geoip2_country_code;
}

limit_req_zone $limit_key zone=geo_limit:10m rate=10r/s;

Общие коды стран

Код Страна Код Страна
US Соединенные Штаты DE Германия
GB Великобритания FR Франция
CA Канада AU Австралия
CN Китай RU Россия
IN Индия BR Бразилия
JP Япония KR Южная Корея
KP Северная Корея IR Иран

Полный список: ISO 3166-1 alpha-2


Устранение неполадок

Страна всегда пустая
  • Проверьте, существует ли путь к базе данных: ls -la /usr/share/GeoIP/
  • Убедитесь, что модуль загружен: nginx -V 2>&1 | grep geoip2
  • Проверьте, что IP не является частным/локальным
Неправильная страна определена
  • Обновите базу данных: geoipupdate
  • Проверьте, если за CDN/прокси (используйте X-Forwarded-For)
  • Точность MaxMind: ~99.8% для стран
База данных не обновляется
  • Проверьте таймер: systemctl status geoipupdate.timer
  • Проверьте учетные данные в /etc/GeoIP.conf
  • Запустите вручную: geoipupdate -v

Связанные