Módulo GeoIp de nginx

Andrey_Photos / Pixabay

Nginx tiene un módulo llamado geoip que geolocaliza las ips de los visitantes de la web y asigna a unas variables los valores de la geolocalización, desde lo mas básico como el país hasta la ciudad, el código postal o incluso la latitud y longitud asignadas a esa ip.

Hay que remarcar que para geolocalizar las ips usa las bases de datos de maxmind, concretamente la versión GeoIP1. Desgraciadamente maxmind ya no tiene disponible gratuitamente esa versión de la base de datos, sólo tienen gratis las versiones nuevas que usan el formato GeoIP2 que no es compatible con el módulo que viene por defecto con nginx.

Desde maxmind avisan de que si deseas usar la versión GeoIP1 la puedes descargar con la versión de pago aunque no la van a mantener eternamente.

Probablemente lo más lógico sea usar la nueva versión pero eso implica recompilar nginx y no siempre es posible o recomendable. En kenkogeek.com tenéis una guía estupenda de como hacerlo, también tienes información mas concreta en la página del módulo geoip2. Si usáis nginx plus podéis añadir este módulo de forma dinámica

Si optáis por usar la versión antigua de la base de datos o si simplemente queréis actualizar la base de datos que ya estáis utilizando se puede pasar del formato GeoIP1 a GeopIP2 muy fácilmente con el script GeoIP_convert-v2-v1

Los pasos son muy sencillos:

git clone https://github.com/emphazer/GeoIP_convert-v2-v1
cd GeoIP_convert-v2-v1
chmod +x geoip_convert-v2-v1.sh
 
./geoip_convert-v2-v1.sh CustomName

Este script al final te genera el fichero GeoIP.dat que ya puedes usar directamente desde nginx. Te recomiendo echarle un ojo al script porque instala un par de programas para hacer la conversión.

Una vez que tienes el fichero GeoIP.dat solo tienes que copiarlo a un directorio y configurar el nginx para que lo use. Sólo hay que añadir la siguiente línea al fichero nginx.conf:

geoip_country /etc/nginx/geoip/GeoIP.dat;

Este fichero te proporciona las siguientes variables que puedes usar en la configuración de los dominios:

  • $geoip_country_code – Código de dos letras con país: RU, ES, US, etc.
  • $geoip_country_code3 – Código de tres letras del país: RUS, ESP, USA, etc.
  • $geoip_country_name – El nombre completo del pais: Russian Federation, Spain, United States, etc.

 

Si quieres comprobar que la instalación es correcta puedes añadir las variables a las cabeceras de la petición:

add_header  X-geoip_country_code $geoip_country_code always;
add_header  X-geoip_country_code3 $geoip_country_code3 always;
add_header  X-geoip_country_name $geoip_country_name always;

y con un curl -I https://dominio.com podrás verlos.