Bloqueio por GEOIP no Nginx

As vezes por questões de negocio ou mesmo juridicas é preciso bloquear o acesso de nosso site por pais. Via GEOIP é possivel conseguir uma forma de identificar a origem do cliente e com isso o nginx consegue montar uma regra para bloquear o acesso por localidade.

A primeira coisa e verificar se o seu nginx foi compilado com essa opção, oque costuma ser padrão, mas caso a sua distribruição não forneça o nginx com suporte a GEOIP você vai ter que compilar. O comando para fazer a verificação é o seguinte:

# nginx -V
nginx version: nginx/1.8.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: –prefix=/opt/nginx/ –user=nginx –group=nginx –with-file-aio –with-ipv6 –with-http_ssl_module –with-http_realip_module –with-http_addition_module –with-http_xslt_module –with-http_image_filter_module –with-http_geoip_module –with-http_sub_module –with-http_dav_module –with-http_flv_module –with-http_mp4_module –with-http_gzip_static_module –with-http_random_index_module –with-http_secure_link_module –with-http_degradation_module –with-http_stub_status_module –with-debug –with-cc-opt=’-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector –param=ssp-buffer-size=4 -m64 -mtune=generic’ –with-ld-opt=-Wl,-E

 

Vamos por a mão na massa, primeiro precisamos fazer o download de um binario que possui a lista atualizada de ip’s por localização:

#wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

Descompacte o arquivo:

#gunzip GeoIP.dat.gz

Agora dentro do arquivo nginx.conf dentro da secção http colocamos o seguinte:

————

http {
geoip_country /etc/nginx/GeoIP.dat;
map $geoip_country_code $allowed_country {
#A regra diz que o padrão e desbloqueado
default yes;
#Abaixo diz que o USA sera bloqueado.
US no;

}

 

———

Agora dentro do arquivo do virtualhost nos colocamos a regra de bloqueio, dentro do location / :

location / {

if ($allowed_country = no) {
return 443;
}

———

Pronto , quem tentar acessar o site dos USA vai receber um erro 443 de não disponível, é possivel também fazer o contrario, por exemplo liberar apenas o brasil, nesse caso a regra seria:

—-

http {
geoip_country /etc/nginx/GeoIP.dat;
map $geoip_country_code $allowed_country {
#A regra diz que o padrão e bloqueado
default no;
#Abaixo diz que o Brasil  sera desbloqueado.
BR yes;

—–

Para saber o prefixo de cada país basta acessar o site dos desenvolvedores do GEOIP:

http://dev.maxmind.com/geoip/legacy/codes/iso3166/

No artigo abaixo tem instruções de como criar mensagens de erro customizadas, oque pode ser interessantes nesse caso:

https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-to-use-custom-error-pages-on-ubuntu-14-04

About The Author
admin Anakin Pendragon