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

1 Предварительное примечание

Как упоминалось во введении, nginx должен быть скомпилирован с помощью HttpGeoipModule. Чтобы проверить, был ли ваш nginx скомпилирован с этим модулем, запустите:

nginx -V

Если вы увидите —with-http_geoip_module в выводе, вы готовы использовать базу данных GeoIP с nginx:

[email protected] :~# 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 

2 Установка базы данных GeoIP

В Debian / Ubuntu базу данных GeoIP можно установить следующим образом:

apt-get install geoip-database libgeoip1

Эта команда помещает базу данных GeoIP в /usr/share/GeoIP/GeoIP.dat .

Возможно, эта немного устарела. Поэтому мы можем при желании загрузить свежую копию с веб-сайта GeoIP:

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

3 Настройка nginx

Откройте /etc/nginx/nginx.conf …

vi /etc/nginx/nginx.conf

… и поместите в блок http {} перед строками включения :

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

Вход разрешен всем странам, кроме трех, для которых установлено значение no. Чтобы сделать  наоборот, т.е. заблокировать все страны и разрешить только несколько, вы должны сделать следующим образом:

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

На самом деле не блокирует ни одну страну, а просто устанавливает переменную $ allow_country . Чтобы фактически заблокировать страны, вы должны открыть конфигурацию vhost и поместить следующий код в контейнер сервера {} (это может идти как внутри, так и за пределами любого блока местоположения {} ):

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

Возвращает код ошибки 444 любому посетителю из заблокированной страны. Что происходит, закрывается соединение без отправки каких-либо заголовков. Вы также можете использовать другой код ошибки, например 403 («Запрещено»), если хотите.

Перезагрузите nginx для применения:

/etc/init.d/nginx reload