Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

GEOIP2_FILTER_SETUP Linux / DevOps

Настройка блокировки и фильтрации по странам (GeoIP2) в веб-сервере Nginx

Обновлено: 21.08.2026
  • Необходимость блокировки атак или парсеров из определенных стран и 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-geoip2

2. Настройка автоматического обновления баз 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
💡 Практика специалистов: Не используйте тяжелые конструкции с несколькими 'if' внутри одного 'location'. Формируйте всю логику сопоставления исключительно через директиву 'map' в контексте 'http'.

Частые вопросы (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 минут без перезагрузки сервиса.

Полезные материалы
Рекомендуем