Настройка блокировки и фильтрации по странам (GeoIP2) в веб-сервере Nginx
- Необходимость блокировки атак или парсеров из определенных стран и ASN.
- Ошибка компиляции
unknown directive geoip2при отсутствии динамического модуля. - Устаревшие базы данных GeoIP1 (.dat), не поддерживаемые современными версиями Nginx.
1. Установка libmaxminddb и модуля GeoIP2
# Ubuntu / Debian
apt-get install -y libmaxminddb0 libmaxminddb-dev mmdb-bin libnginx-mod-http-geoip2
# RHEL / Rocky (EPEL)
dnf install -y libmaxminddb nginx-module-geoip22. Настройка автоматического обновления баз MaxMind
Установите утилиту geoipupdate и поместите файл GeoLite2-Country.mmdb в каталог /var/lib/GeoIP/.
3. Подключение модуля и описание правил в /etc/nginx/nginx.conf
# Загрузка динамического модуля в начале файла nginx.conf
load_module modules/ngx_http_geoip2_module.so;
http {
# Чтение двухбуквенного кода страны из базы
geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {
auto_reload 60m;
$geoip2_data_country_code country iso_code;
}
# Создание карты доступа (Белый список)
map $geoip2_data_country_code $allowed_country {
default no;
RU yes;
BY yes;
KZ yes;
}
}4. Применение ограничений в блоке server
server {
listen 443 ssl;
server_name portal.itstm.ru;
# Блокировка доступа для запрещенных стран
if ($allowed_country = no) {
return 403 "Access denied from your country ($geoip2_data_country_code)";
}
location / {
# Передача страны бэкенду в HTTP заголовке
proxy_set_header X-Country-Code $geoip2_data_country_code;
proxy_pass http://backend;
}
}5. Проверка корректности работы
nginx -t && systemctl reload nginx
mmdblookup --file /var/lib/GeoIP/GeoLite2-Country.mmdb --ip 8.8.8.8 country iso_code Частые вопросы (FAQ)
Как сделать проверку реального IP за Cloudflare или CDN?
Используйте модуль ngx_http_realip_module и укажите set_real_ip_from с IP прокси, а также real_ip_header CF-Connecting-IP. Модуль GeoIP2 будет автоматически анализировать декодированный реальный IP клиента.
Нужно ли перезапускать Nginx при обновлении .mmdb файлов?
Нет, директива auto_reload 60m указывает модулю перечитывать файл с диска раз в 60 минут без перезагрузки сервиса.