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_bakcd /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.
Ссылки
- nginx: http://nginx.org/
- nginx Wiki: http://wiki.nginx.org/
- HttpGeoipModule: http://wiki.nginx.org/HttpGeoipModule
Об авторе
Falko Timme — владелец Timme Hosting (ultra-fast nginx web hosting), ведущий поддерживающий HowtoForge (с 2005) и один из основных разработчиков ISPConfig (с 2000). Вкладчик в книгу O’Reilly «Linux System Administration».
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента