Cómo instalar Mod_GeoIP para Apache en RHEL y CentOS


Mod_GeoIP es un módulo de Apache que se puede utilizar para obtener la ubicación geográfica de la dirección IP del visitante en el servidor web Apache. Este módulo le permite determinar el país, la organización y la ubicación del visitante. Es especialmente útil para la publicación de anuncios geográficos, el contenido de destino, la lucha contra el spam, la detección de fraudes, la redirección/bloqueo de visitantes según su país y mucho más.

El módulo GeoIP permite a los administradores del sistema redirigir o bloquear el tráfico web de acuerdo con la ubicación geográfica del cliente. La ubicación geográfica se aprende a través de la dirección IP del cliente.

Mod_GeoIP tiene dos versiones diferentes, una es gratuita y otra es de pago y utiliza las bases de datos MaxMind GeoIP/GeoCity.

  1. Versión gratuita: en la versión gratuita, las bases de datos de ciudades geográficas y países están disponibles con una precisión del 99,5%.
  2. Versión de pago: en la versión de pago, obtendrá ambas bases de datos con una precisión del 99,8% con algunos detalles más avanzados sobre la dirección IP.

Si desea ver más diferencias entre la versión gratuita y la de pago, visite Maxmind.com.

Este artículo explica cómo configurar e instalar el módulo Mod_GeoIP para Apache en RHEL y CentOS usando el repositorio EPEL con la utilidad de administrador de paquetes YUM.

Suponemos que ya tiene un sistema RHEL y CentOS en ejecución con una configuración LAMP (Linux, Apache, MySQL y PHP) en funcionamiento. Si no es así, lea nuestros artículos donde mostramos la instalación de ambos sistemas operativos con LAMP.

  1. Instalación de CentOS 7 Minimal.
  2. Instalación de CentOS 8 Minimal.

  1. Cómo instalar LAMP (Linux, Apache, MySQL, PHP) en RHEL y CentOS 7
  2. Cómo instalar Apache, MySQL/MariaDB y PHP en RHEL y CentOS 8

De forma predeterminada, mod_Geoip no está disponible en el repositorio oficial RHEL/CentOS, por lo que debemos instalar y habilitar el repositorio EPEL de terceros.

# yum install epel-release
# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm  [On RHEL 8]

Una vez que haya habilitado el repositorio EPEL en su sistema, simplemente puede instalar mod_geoip ejecutando el siguiente comando con sus paquetes de dependencia.

# yum install mod_geoip GeoIP GeoIP-devel GeoIP-data zlib-devel

Es una buena idea descargar la base de datos de ciudades y países geográficos más reciente para mantenerse actualizado.

# cd /usr/share/GeoIP/
# mv GeoIP.dat GeoIP.dat_org
# wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz
# wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
# gunzip GeoLite2-Country.tar.gz
# gunzip GeoLite2-City.tar.gz

Una vez instalado el módulo, abra y edite el archivo de configuración principal del módulo, con un editor de texto de línea de comandos como vi, y active el módulo en todo el servidor, como se ilustra en el siguiente extracto.

# vi /etc/httpd/conf.d/geoip.conf

Configure la línea GeoIPEnable de Desactivado a Activado. Además, asegúrese de agregar la ruta absoluta al archivo de base de datos GeoIP.

<IfModule mod_geoip.c>
GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat MemoryCache
</IfModule>

Reinicie el servicio Apache para reflejar los cambios.

# systemctl restart httpd
OR
# service httpd restart

Sin embargo, no se recomienda activar el módulo GeoIP en todo el servidor. Debe habilitar el módulo GeoIP solo en los bloques o donde realmente realizaría la redirección o el bloqueo del tráfico.

Para probar que el módulo mod_geoip funciona correctamente con Apache, necesitamos crear un archivo PHP llamado testgeoip.php en el directorio raíz de Apache (por ejemplo,/var/www/html).

# vi /var/www/html/testgeoip.php

Inserte el siguiente fragmento de código php en él.

<html>
<head>
  <title>What is my IP address - determine or retrieve my IP address</title>
 </head>
<body>
 <?php
     if (getenv(HTTP_X_FORWARDED_FOR)) {
        $pipaddress = getenv(HTTP_X_FORWARDED_FOR);
        $ipaddress = getenv(REMOTE_ADDR);
        echo "Your Proxy IP address is : ".$pipaddress. " (via $ipaddress) " ;
    } else {
        $ipaddress = getenv(REMOTE_ADDR);
        echo "Your IP address is : $ipaddress";
    }
    $country = getenv(GEOIP_COUNTRY_NAME);
    $country_code = getenv(GEOIP_COUNTRY_CODE);
    echo "<br/>Your country : $country ( $country_code ) ";
?>
</body>
</html>

Ahora, intente llamar al archivo usando un navegador web (por ejemplo, http://localhost/testgeoip.php). Obtendrá su dirección IP y los detalles del país.

La base de datos GeoIP se actualiza a principios de cada mes. Por lo tanto, es muy importante mantener actualizada la base de datos de GeoIP. Para descargar la última versión de la base de datos, utilice el siguiente comando.

# cd /usr/share/GeoIP/
# mv GeoIP.dat GeoIP.dat_org
# wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz
# wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
# gunzip GeoLite2-Country.tar.gz
# gunzip GeoLite2-City.tar.gz

Hemos escrito un pequeño script de shell que descargará automáticamente la última versión de la base de datos GeoIP cada mes. Simplemente coloque cualquiera de las siguientes secuencias de comandos en /etc/cron.monthly.

# Automatic GeoIP Database Update
#!/bin/sh
cd /usr/share/GeoIP
mv GeoIP.dat GeoIP.dat_org
wget -q http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz
gzip -d -f GeoLite2-Country.tar.gz
#!/bin/sh

GEOIP_MIRROR="http://geolite.maxmind.com/download/geoip/database"
GEOIPDIR=/usr/share/GeoIP
TMPDIR=

DATABASES="GeoLiteCity GeoLiteCountry/GeoIP asnum/GeoIPASNum GeoIPv6"

if [ -d "${GEOIPDIR}" ]; then
        cd $GEOIPDIR
        if [ -n "${DATABASES}" ]; then
                TMPDIR=$(mktemp -d geoipupdate.XXXXXXXXXX)

                echo "Updating GeoIP databases..."

                for db in $DATABASES; do
                        fname=$(basename $db)

                        wget --no-verbose -t 3 -T 60 "${GEOIP_MIRROR}/${db}.dat.gz" -O "${TMPDIR}/${fname}.dat.gz"
                        gunzip -fdc "${TMPDIR}/${fname}.dat.gz" > "${TMPDIR}/${fname}.dat"
                        mv "${TMPDIR}/${fname}.dat" "${GEOIPDIR}/${fname}.dat"
                        chmod 0644 "${GEOIPDIR}/${fname}.dat"
                done
                [ -d "${TMPDIR}" ] && rm -rf $TMPDIR
        fi
fi

El siguiente código de ejemplo redirigirá a los usuarios según el código de país que establezcamos en AS (Asia). De esta manera, puede redirigir a los usuarios según el código de su condado.

GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat

# Redirect one country
RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^AS$
RewriteRule ^(.*)$ https://www.tecmint.com$1 [R,L]

Este ejemplo bloqueará a los usuarios según el código de país que establece GeoIP. El siguiente ejemplo bloqueará a los usuarios de países de AS (Asia) y EE. UU. (Estados Unidos).

GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat

SetEnvIf GEOIP_COUNTRY_CODE AS BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE US BlockCountry
# ... place more countries here

Deny from env=BlockCountry

El siguiente ejemplo solo permitirá a los usuarios de los países mencionados a continuación.

GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat

SetEnvIf GEOIP_COUNTRY_CODE AS AllowCountry
SetEnvIf GEOIP_COUNTRY_CODE US AllowCountry
# ... place more countries here

Deny from all
Allow from env=AllowCountry

Para obtener más información sobre mod_geoip y su uso, se puede encontrar en http://www.maxmind.com/app/mod_geoip. Si tiene algún problema para configurar un módulo mod_geoip, háganoslo saber a través de los comentarios y no olvide compartirlo con sus amigos.