Блокировка доступа к сайту используя Nginx + GeoIP
Занимаясь различного рода проектами, приходится столкнуться с тем, что необходимо запретить доступ к сайтам для определенных стран, городов или регионов.
Для этого мы настроем фильтр по 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 | mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bak |
Шаг 2. Настроим Nginx
Открываем конфиг Nginx /etc/nginx/nginx.conf
и добавляем в блок http
перед всеми инклудами следующее:
1 | geoip_country /usr/share/GeoIP/GeoIP.dat; |
Таким образом мы заблокировали доступ для США, Китая и Кореи.
Для того чтобы разрешить доступ к сайту только для определенных стран, немного модифицируем конфигурационный файл:
1 | geoip_country /usr/share/GeoIP/GeoIP.dat; |
В данном случае сайт будет доступен только пользователям России и Украины.
Последний штрих - запретить пользователям, которые попадают под правило, использовать сайт.
Для того, чтобы показывать заблокированным странам определенную ошибку, добавим в конфиг виртуального хоста в секцию server
строки:
1 | if ($allowed_country = no) { |
Или заменим на страницу с текстом блокировки и контактыми данными администрации сайта.
1 | server { |
Перезагружаем Nginx
1 | systemctl restart nginx |
На этом настройка блокировки завершена.
Реализаций блокировки по геолокации в сети о-о-очень много! В данном примере показан самый простой вариант.