Блокировка стран с помощью GeoIP2
Контролируйте доступ по странам с помощью точной базы данных геолокации MaxMind.
-
Блокировка недобросовестных пользователей
Остановите атаки из стран с высоким уровнем риска до того, как они достигнут вашего приложения
-
Соответствие требованиям
Применяйте географические ограничения для соблюдения GDPR, лицензирования или юридических требований
-
Нулевые накладные расходы
Поиск в базе данных в памяти — без внешних API-вызовов или задержек
-
Точные данные
Базы данных MaxMind GeoIP2 с точностью по странам 99.8%
Предварительные требования
Вам понадобится бесплатная учетная запись MaxMind для загрузки баз данных GeoIP2:
- Зарегистрируйтесь на maxmind.com/en/geolite2/signup
- Сгенерируйте лицензионный ключ в вашей учетной записи
- Сохраните его для настройки автоматического обновления
Быстрая настройка
Шаг 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
Связанные
-
Модуль GeoIP2
Полная справка по директивам
-
ModSecurity WAF
Полный веб-фаервол приложения
-
Ограничение по скорости
Защита от злоупотреблений