GeoIP con Shorewall Centos 7

En este post, nos enfocaremos en robustecer nuestro sistema firewall a tráves de la incorporación de xtables-addons en el kernel de linux, permitiendo de está manera, potenciar la seguridad con bloqueos o permisologías específicas basadas en GeoIP.

Pasos a seguir:

yum update
Con este comando, nos aseguramos tener las últimas versiones de los paquetes, así como la compabilidad del 100% de kernel-devel and kernel-headers.

yum install kernel-devel-`uname -r` iptables-devel kernel-headers-`uname -r` 

A través de esta instrucción, nos aseguramos de tener las mismas versiones compatibles de kernel e iptables.

Adicionamos el repositorio epel-releaese, a los fines de tener la disponibilidad de paquetes de compilación que vamos a requerir.

yum install -y epel-release

yum -y install gcc gcc-c++ make automake unzip zip perl perl-Text-CSV_XS xz wget vim

Una vez obtenido todos los componentes necesarios para la implementación de xtables-addons, procedemos a crear un directorio, donde descargaremos los archivos. En lo particular, lo ejecuto en la siguiente ubicación:

mkdir -p /usr/src/software
cd /usr/src/software

wget https://newcontinuum.dl.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.14.tar.xz

tar -xvf xtables-addons-2.14.tar.xz && cd xtables-addons-2.14.

Durante el proceso de compilación, existe un error que es generado por la linea build_TARPIT=m, por lo cual procemos a comentarla.

vim mconfig

– Makefile –

#
build_ACCOUNT=m
build_CHAOS=m
build_DELUDE=m
build_DHCPMAC=m
build_DNETMAP=m
build_ECHO=m
build_IPMARK=m
build_LOGMARK=m
build_SYSRQ=m
# build_TARPIT=m

Luego de ejecutados el paso anterior, procedemos a compilar, en la cual debemos tener una salida como la siguiente, sin errores.

./configure
checking for a BSD-compatible install… /usr/bin/install -c
checking whether build environment is sane… yes
checking for a thread-safe mkdir -p… /usr/bin/mkdir -p
checking for gawk… gawk
checking whether make sets $(MAKE)… yes
checking whether make supports nested variables… yes
checking whether make supports nested variables… (cached) yes
checking for gcc… gcc
checking whether the C compiler works… yes
checking for C compiler default output file name… a.out
checking for suffix of executables…
checking whether we are cross compiling… no
checking for suffix of object files… o
checking whether we are using the GNU C compiler… yes
checking whether gcc accepts -g… yes
checking for gcc option to accept ISO C89… none needed
checking whether gcc understands -c and -o together… yes
checking for style of include used by make… GNU
checking dependency style of gcc… gcc3
checking for ar… ar
checking the archiver (ar) interface… ar
checking build system type… x86_64-pc-linux-gnu
checking host system type… x86_64-pc-linux-gnu
checking how to print strings… printf
checking for a sed that does not truncate output… /usr/bin/sed
checking for grep that handles long lines and -e… /usr/bin/grep
checking for egrep… /usr/bin/grep -E
checking for fgrep… /usr/bin/grep -F
checking for ld used by gcc… /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld… yes
checking for BSD- or MS-compatible name lister (nm)… /usr/bin/nm -B
checking the name lister (/usr/bin/nm -B) interface… BSD nm
checking whether ln -s works… yes
checking the maximum length of command line arguments… 1572864
checking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu fo rmat… func_convert_file_noop
checking how to convert x86_64-pc-linux-gnu file names to toolchain format… fu nc_convert_file_noop
checking for /usr/bin/ld option to reload object files… -r
checking for objdump… objdump
checking how to recognize dependent libraries… pass_all
checking for dlltool… no
checking how to associate runtime and link libraries… printf %s\n
checking for archiver @FILE support… @
checking for strip… strip
checking for ranlib… ranlib
checking command to parse /usr/bin/nm -B output from gcc object… ok
checking for sysroot… no
checking for a working dd… /usr/bin/dd
checking how to truncate binary pipes… /usr/bin/dd bs=4096 count=1
checking for mt… no
checking if : is a manifest tool… no
checking how to run the C preprocessor… gcc -E
checking for ANSI C header files… yes
checking for sys/types.h… yes
checking for sys/stat.h… yes
checking for stdlib.h… yes
checking for string.h… yes
checking for memory.h… yes
checking for strings.h… yes
checking for inttypes.h… yes
checking for stdint.h… yes
checking for unistd.h… yes
checking for dlfcn.h… yes
checking for objdir… .libs
checking if gcc supports -fno-rtti -fno-exceptions… no
checking for gcc option to produce PIC… -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works… yes
checking if gcc static flag -static works… no
checking if gcc supports -c -o file.o… yes
checking if gcc supports -c -o file.o… (cached) yes
checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libr aries… yes
checking whether -lc should be explicitly linked in… no
checking dynamic linker characteristics… GNU/Linux ld.so
checking how to hardcode library paths into programs… immediate
checking whether stripping libraries is possible… yes
checking if libtool supports shared libraries… yes
checking whether to build shared libraries… yes
checking whether to build static libraries… no
checking linux/netfilter/x_tables.h usability… yes
checking linux/netfilter/x_tables.h presence… yes
checking for linux/netfilter/x_tables.h… yes
checking for pkg-config… /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0… yes
checking for xtables >= 1.4.5… yes
checking Xtables module directory… /usr/lib64/xtables
checking kernel version that we will build against… 3.10.0.0 in /lib/modules/3.10.0-957.1.3.el7.x86_64/build
checking that generated files are newer than configure… done

configure: creating ./config.status
config.status: creating Makefile
config.status: creating Makefile.iptrules
config.status: creating Makefile.mans
config.status: creating geoip/Makefile
config.status: creating extensions/Makefile
config.status: creating extensions/ACCOUNT/Makefile
config.status: creating extensions/pknock/Makefile
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing libtool commands

Una vez validado que todos los componentes requeridos estan OK, procedemos a generar el archivo y posterior instalación. Con este proceso, implementaremos las funciones requeridas en el kernel, para realizar configuraciones a nivel de GeoIP en nuestro sistema Linux.

make && make install

Luego, nos posicionamos en el direccion “geoip” (cd /usr/src/software/xtables-addons-2.14/geoip/) y ejecutamos las descargas de la base de datos.

./xt_geoip_dl
--2019-01-09 16:18:37-- http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz
Resolving geolite.maxmind.com (geolite.maxmind.com)… 104.16.37.47, 104.16.38.47, 2606:4700::6810:252f, …
Connecting to geolite.maxmind.com (geolite.maxmind.com)|104.16.37.47|:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 1935725 (1.8M) [application/octet-stream]
Saving to: ‘GeoIPv6.csv.gz’

100%[============================================================>] 1,935,725 –.-K/s in 0.01s

2019-01-09 16:18:38 (134 MB/s) – ‘GeoIPv6.csv.gz’ saved [1935725/1935725]

–2019-01-09 16:18:38– http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
Reusing existing connection to geolite.maxmind.com:80.
HTTP request sent, awaiting response… 404 Not Found
2019-01-09 16:18:38 ERROR 404: Not Found.

FINISHED –2019-01-09 16:18:38–
Total wall clock time: 0.05s
Downloaded: 1 files, 1.8M in 0.01s (134 MB/s)
unzip: cannot find or open GeoIPCountryCSV.zip, GeoIPCountryCSV.zip.zip or GeoIPCountryCSV.zip.ZIP.

Lamentablemente como se puede observar, ya no está disponible la versión Free de GeoIPCountryWhois.csv a través de  https://www.maxmind.com/es/home, sin embargo, podemos descargarlo de la siguiente dirección para seguir con el procedimiento. 

http://jaist.dl.sourceforge.net/project/neustarwebtop/GeoIPCountryWhois.csv
Una vez descargado el archivo .csv, contentivo de la información IPv4, procedemos a estructurarlo para que sea entendible por el Kernel de Linux. 

./xt_geoip_build GeoIPCountryWhois.csv

Finalizado el proceso, tendremos 2 carpetas dentro del directorio (xtables-addons/geoip, llamadas  BE - LE, las cuales debemos copiarlas hacia la siguiente destino:
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/
Seguidamente, procedemos a reiniciar los servicios de firewall, a los fines de que se cargen los modulos y tener disponible los xtables para su aplicación, como por ejemplo en iptables:

iptables -I INPUT -m geoip --src-cc CN -j DROP

En el caso que este montando el servicio sobre shorewall, quedaría como se muestra a continuación, permitiendo solo el tráfico de IPs provenientes a EEUU.

ACCEPT          net:^[US]      $FW     tcp     22

Espero que sea de utilidad, agredaciendo los comentarios al respecto.