Блокировка доступа к сайту используя Nginx + GeoIP

Блокировка доступа к сайту используя Nginx + GeoIP

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

Занимаясь различного рода проектами, приходится столкнуться с тем, что необходимо запретить доступ к сайтам для определенных стран, городов или регионов.

Для этого мы настроем фильтр по IP-адресам. Конечно же пользователи всегда смогут использовать VPN или прокси из разрешенной страны, но для нас такой блокировки вполне хватит.

В самом начале хочу проинформировать, что доступен модуль ngx_http_geoip2_module и база GeoIP2, изучением и тестами с GeoIP2 еще не занимался, поэтому в статье будет использоваться стабильная реализация.

Для начала нам необходимо убедиться в том, что Nginx установлен с поддержкой GeoIP модуля.

1
nginx -V

В выводе команды найдем значение --with-http_geoip_module, если его нет, то необходимо установить GeoIP модуль.

Шаг. 1 Установим базу GeoIP

1
yum install geoip geoip-devel

База GeoIP находится в директории /usr/share/GeoIP/GeoIP.dat

Обновим базу до актуальной.

1
2
3
4
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

Шаг 2. Настроим Nginx

Открываем конфиг Nginx /etc/nginx/nginx.conf и добавляем в блок http перед всеми инклудами следующее:

1
2
3
4
5
6
7
8
9
  geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default yes;
CN no;
US no;
TW no;
KP no;
KR no;
}

Таким образом мы заблокировали доступ для США, Китая и Кореи.

Для того чтобы разрешить доступ к сайту только для определенных стран, немного модифицируем конфигурационный файл:

1
2
3
4
5
6
  geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default no;
RU yes;
UA yes;
}

В данном случае сайт будет доступен только пользователям России и Украины.

Последний штрих - запретить пользователям, которые попадают под правило, использовать сайт.

Для того, чтобы показывать заблокированным странам определенную ошибку, добавим в конфиг виртуального хоста в секцию server строки:

1
2
3
if ($allowed_country = no) {
return 404;
}

Или заменим на страницу с текстом блокировки и контактыми данными администрации сайта.

1
2
3
4
5
6
7
8
9
server {
...
error_page 503 @503;
...
location @503 {
try_files /503.html =503;
}
...
}

Перезагружаем Nginx

1
systemctl restart nginx

На этом настройка блокировки завершена.
Реализаций блокировки по геолокации в сети о-о-очень много! В данном примере показан самый простой вариант.