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