Bloquea países enteros (Rusia, Ucrania) con el módulo GeoIP de Apache
Llevamos un inicio del mes de septiembre increiblemente movido en lo que se refiere a intentos de ataque a servidores. Entre ellos el que ha afectado a OVH, hosting en el que tenemos alojadas nuestras páginas web, Apañados.es entre ellas, y los clientes de Telefónica no podían acceder a las diferentes páginas afectadas con la consiguiente pérdida de tráfico.
Tan importante fue el ataque de DoS que varios medios se hicieron eco de él en Internet. El director general de OVH nos mandó un correo electrónico explicando lo sucedido.
No se si estará relacionado con lo anterior pero desde hace unos días vengo observando errores en los logs de Apache en que el servidor rechaza la conexión:
[Fri Sep 09 01:07:18.915705 2016] [fcgid:warn] [pid 17634:tid 139621912528640] (32)Broken pipe: [client 134.249.232.160:2233] mod_fcgid: ap_pass_brigade failed in handle_request_ipc function, referer: http://laudit.ru/
[Fri Sep 09 01:07:19.282584 2016] [fcgid:warn] [pid 30829:tid 139621887350528] (104)Connection reset by peer: [client 134.249.232.160:3228] mod_fcgid: ap_pass_brigade failed in handle_request_ipc function, referer: http://laudit.ru/
En este caso es una página web de Rusia que no debería poder acceder ya que en Apañados.es, debido a algunos ataques de spam desde ese país, tengo bloqueado a través del módulo de Apache GEOIP tanto Ucrania como Rusia, de esta manera:
SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE UA BlockCountry
Deny from env=BlockCountry
Y si miramos en el whois vemos que la página está alojada en un servidor de Ucrania (parece que esta implementación no me funcionaba debido a una mala escritura de dirección del archivo GeoIP.dat - ver más abajo una instalación del módulo de Apache GEOIP)
inetnum: 134.249.128.0 - 134.249.255.255
netname: KYIVSTAR-NET-10
descr: Kyivstar GSM
descr: Ukrainian mobile phone operator
country: UA
A lo que vamos, para bloquear determinadas IP atacantes desde el archivo .htaccess debemos colocar las siguientes líneas:
order allow,deny
allow from all
deny from 204.79.180.0/24
deny from 178.137.95.240
deny from 178.137.17.180
deny from 134.249.65.0/24
deny from 134.249.232.0/16
deny from 46.119.115.59
Donde con deny from 134.249.232.0/16 bloqueamos un rango de IPs y con deny from 46.119.115.59 bloqueamos una dirección IP en particular.
Si colocas algún espacio o algún otro caracter, que puede que no aparezca en tu editor de texto, puede producirse un error "500 Internal Server Error" como este log de Apache: allow and deny must be followed by 'from'
Lo mejor es, si copias este código de esta página o alguna otra, es que hagas un copy/paste en un editor de texto plano como el blog de notas de Windows y luego en el archivo .htaccess.
Guía de instalación manual del módulo GEOIP para Apache 2.4.x en CentOS 7
1. Instalar los paquetes de datos GeoIP-zlib-devel y GeoIP y GeoIP-devel con yum
# yum install GeoIP GeoIP-devel GeoIP-data zlib-devel
2. Instalar httpd-devel y ARP-devel a través de yum, necesarios para poder compilar mod_geip después
# yum install httpd-devel apr-devel
3. Descargar y extraer el contenido del código fuente mod_geip2
La última versión de mod_geoIP actualmente es la 1.2.8, sin embargo en el momento en que estás tratando de instalar podría haber una versión más reciente así que consulta con un navegador en http://geolite.maxmind.com/download/geoip/api/mod_geoip2/ para asegurarte la que se tendrá que descargar.
En mi caso he descargado el archivo mod_geoip2-latest.tar.gz:
# wget http://www.maxmind.com/download/geoip/api/mod_geoip2/mod_geoip2-latest.tar.gz
# tar xvzf mod_geoip2-latest.tar.gz
# cd mod_geoip2_1.2.8
4. Utiliza apxs (instrumento de extensión Apache) para compilar el módulo mod_geoip:
# apxs -i -a -L/usr/lib64 -I/usr/include -lGeoIP -c mod_geoip.c
La consola te dará un mensaje de conformidad a la instalación:
Libraries have been installed in:
/usr/lib64/httpd/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/lib64/httpd/modules/mod_geoip.so
[activating module `geoip' in /etc/httpd/conf/httpd.conf]
Este comando debe instalar el módulo de mod_geoip.so en /usr/lib64/httpd/modules/mod_geoip.so y añadir una directiva LoadModule en el servidor Apache CentOS.
De todos modos yo recomiendo que compruebes que tu archivo /etc/httpd/conf/httpd.conf contiene la siguiente línea:
LoadModule geoip_module /usr/lib64/httpd/modules/mod_geoip.so
5. A continuación, tendrás que mover el archivo .dat a un directorio de datos:
# mv GeoIP.dat /usr/local/share/GeoIP/
6. Coloca la siguiente configuración de Apache de nuevo en /etc/httpd/conf/httpd.conf
<IfModule mod_geoip.c>
GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat Standard
GeoIPDBFile /usr/share/GeoIP/GeoLiteCity.dat Standard
<IfModule>
7. En tu archivo /etc/php.ini añade después de la última línea del archivo:
extension=geoip.so
Para añadir esta extensión deberás tener instalado el paquete geoip de perl, así:
# cd /tmp
# wget https://pecl.php.net/get/geoip-1.1.1.tgz
# tar -zxvf geoip-1.1.1.tgz
# cd geoip-1.1.1
# /usr/bin/phpize
# ./configure --with-php-config=/usr/bin/php-config
# make
# make install
Salida final de la consola:
Installing shared extensions: /usr/lib64/php/modules/
8. Reinicia el servidor httpd para que los cambios surtan efecto:
# systemctl restart httpd.service
Ahora ya podemos bloquear países añadiendo estas líneas en nuestro archivo .htaccess:
SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE UA BlockCountry
Deny from env=BlockCountry
Si deseas redirigir por país usando el mod_rewrite en combinación con mod_geoip, tu archivo .htaccess podría tener este aspecto:
RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(RU|UA)$
RewriteRule ^(.*)$ http://www.tudominio.com/nl/$1 [L]
Espero que con estas instrucciones os sea más fácil bloquear IPs no deseadas y países que no aportan tráfico a nuestras páginas pero si intentan efectuar ataques contra ellas.
NOTA: después de estos ajustes el módulo GEOIP ya está trabajando adecuadamente rechazando los intentos de conexión de Rusia y Ucrania, aquí algunos log de Apache:
[Fri Sep 09 16:52:57.480011 2016] [access_compat:error] [pid 8295:tid 140250940630784] [client 91.200.12.7:51775] AH01797: client denied by server configuration: /home/xnapaado/public_html/, referer: http://www.xn--apaados-6za.es/
[Fri Sep 09 10:03:23.031314 2016] [access_compat:error] [pid 2218:tid 140559314319104] [client 83.69.209.146:50419] AH01797: client denied by server configuration: /home/xnapaado/public_html/, referer: http://www.xn--apaados-6za.es/
[Fri Sep 09 17:40:39.178896 2016] [access_compat:error] [pid 8295:tid 140251165132544] [client 46.118.119.71:51446] AH01797: client denied by server configuration: /home/xnapaado/public_html/tenemos-que-apanar, referer: http://na-telefon.biz/po-imenam.html