Гид по технологиям

nginx: блокировка по стране через GeoIP

• 4 min read • DevOps • Обновлено 26 Nov 2025
nginx: блокировка по стране через GeoIP
nginx: блокировка по стране через GeoIP

Краткое введение

Этот материал объясняет, как использовать модуль GeoIP с nginx, чтобы блокировать доступ по стране. GeoIP база сопоставляет IP-адреса странам. Для работы нужен nginx, собранный с модулем HttpGeoipModule.

Важно: я не даю гарантий, что инструкция сработает во всех окружениях.

1. Предварительная проверка модуля

nginx должен быть собран с HttpGeoipModule. Чтобы проверить, выполните:

nginx -V

В выводе должен присутствовать –with-http_geoip_module. Пример вывода:

root@server1:~# nginx -V
 nginx version: nginx/1.2.1
 TLS SNI support enabled
 configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-auth-pam --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-echo --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-upstream-fair --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-dav-ext-module
 root@server1:~#

Если модуля нет, потребуется установить nginx с поддержкой GeoIP (через пакет с модулем или сборку из исходников).

2. Установка базы GeoIP (Debian/Ubuntu)

Установите пакеты базы GeoIP:

apt-get install geoip-database libgeoip1

По умолчанию база окажется в /usr/share/GeoIP/GeoIP.dat.

Если хотите актуальную базу, можно скачать свежую версию от MaxMind (GeoLite Country):

mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bak
cd /usr/share/GeoIP/
 wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
 gunzip GeoIP.dat.gz

Примечание: URL и формат могут изменяться поставщиком баз, проверяйте источник перед скачиванием.

3. Настройка nginx

Откройте основной конфиг nginx:

vi /etc/nginx/nginx.conf

Вставьте в блок http {} (до include):

[...]
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default yes;
        FK no;
        FM no;
        EH no;
    }
[...]

Эта конфигурация разрешает всем странам доступ, кроме перечисленных кода стран (FK, FM, EH). Список кодов стран — коды ISO 3166-1 alpha-2.

Чтобы инвертировать логику (по умолчанию блокировать всех и разрешить только несколько стран), используйте:

[...]
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default no;
        FK yes;
        FM yes;
        EH yes;
    }
[...]

Важно: сам по себе блок map не блокирует трафик — он только задаёт переменную $allowed_country. Чтобы действительно блокировать, вставьте в server {} (вне или внутри location {}):

[...]
        if ($allowed_country = no) {
            return 444;
        }
[...]

Код 444 — нестандартный код nginx: соединение закрывается без отправки заголовков. При желании можно вернуть 403 (Forbidden) или другую страницу/код.

После изменения конфигурации перезагрузите nginx:

/etc/init.d/nginx reload

Когда это не сработает

  • Пользователь использует VPN/прокси/релэй из другой страны — GeoIP определит страну по конечному IP, а не по реальному местоположению человека.
  • Для IPv6 в старых базах GeoIP может отсутствовать покрытие; проверьте поддержку IPv6 в вашей базе.
  • Старые или кастомные сборки nginx без HttpGeoipModule не будут обрабатывать директивы geoip.

Альтернативные подходы

  • WAF/брандмауэр (Cloudflare, Sucuri): часто эффективнее и гибче, предоставляют геоблокировние на границе и защиту от ботов.
  • ipset + iptables/nftables: импортировать списки подсетей по странам и блокировать на уровне сети.
  • CDN с гео-правилами: offload-ить фильтрацию на CDN и уменьшить нагрузку на сервер.

Интеллектуальная модель (коротко)

GeoIP — это соответствие IP → страна. nginx читает это соответствие и выставляет переменную, по которой вы решаете допускать соединение или нет.

Чек-лист администратора перед развёртыванием

  • Убедиться, что nginx собран с –with-http_geoip_module.
  • Установить/обновить /usr/share/GeoIP/GeoIP.dat.
  • Добавить секцию geoip + map в блок http {}.
  • Добавить проверку if ($allowed_country = no) в server/ location.
  • Протестировать на нескольких IP из блокируемых и разрешённых стран.
  • Проверить логи nginx и доступность легитимных пользователей.
  • Автоматизировать обновление базы GeoIP (cron) при необходимости.

Критерии приёмки

  • Для тестового IP из заблокированной страны сервер возвращает 444 (или заданный код).
  • Для тестового IP из разрешённой страны контент доступен.
  • nginx успешно перезагружается без ошибок конфига.
  • Логи фиксируют события блокировки (если требуется, добавить access_log/ error_log с сопутствующими метками).

Тесты и примеры приёмки

  • Тест A: выполнить curl с прокси, эмулирующим IP из FK — ожидание: соединение закрывается (444) или 403.
  • Тест B: выполнить curl с IP из разрешённой страны — ожидание: HTTP 200 и содержимое страницы.
  • Тест C: проверить поведение при отключенной/отсутствующей базе GeoIP — ожидание: nginx не падает, но $geoip_country_code может быть пустым.

Глоссарий (1 строка)

  • GeoIP: база, связывающая IP-адрес с географической информацией; здесь использована для определения страны по IP.
  • 444: нестандартный код nginx — закрытие соединения без отправки заголовков.

Примечания по безопасности и приватности

  • GeoIP оперирует только с IP-адресами — это совместимо с минимальными требованиями приватности, но помните о возможных ошибочных определениях.
  • Если вы храните логи с деталями геопозиции, проверьте локальные требования по защите персональных данных (GDPR и пр.) для вашего региона.

Резюме

Использование модуля GeoIP в nginx — простой способ фильтровать трафик по странам. Подход хорош для грубой геофильтрации, но не заменяет комплексные решения при сильных угрозах или потребности в точном геолокационном контроле. Тестируйте правила и автоматизируйте обновление баз GeoIP.

Ссылки

Об авторе

Falko Timme — владелец Timme Hosting (ultra-fast nginx web hosting), ведущий поддерживающий HowtoForge (с 2005) и один из основных разработчиков ISPConfig (с 2000). Вкладчик в книгу O’Reilly «Linux System Administration».

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро