Fijo que a muchos nos ha pasado que tengamos que bloquear un listado de IPs o rangos de red que están intentando atacar un servidor. La forma más sencilla y habitual de hacerlo, no es otra que emplear IPTables para realizar el trabajo. Algo similar a lo que sigue, para cada una de las IPs a bloquear,
shell> iptables -A INPUT -s 192.168.0.16 -p TCP -j DROP
O si lo necesitas hacer para una red,
shell> iptables -A INPUT -s 192.168.0.0/24 -p TCP -j DROP
Esto funciona perfectamente, pero si hay que repetir este paso para unas 1000 IPs/redes, quizás la forma de hacerlo ya no sea tan sencilla de aplicar, y mucho menos, tan gustosa de hacer. Para solucionar esto, IP Sets simplifica este proceso.
Qué es IP Sets
IP Sets es una feature del kernel de Linux que permite definir múltiples y diferentes IPs, redes, direcciones MAC o puertos y cargarlas desde IPTables. La ventaja es que para almacenarlas y usarlas emplea estructuras bitmap/hash, lo que lo hace muy eficiente en acceso. Esta es la principal ventaja, la otra es que puedes meter en dicha tabla miles de direcciones y cargarlas todas con una única regla de IPTables.
Instalación
Lo primero que vamos a ver es cómo instalar este software.
shell> apt-get install ipset
Uso
Tras la instalación del mismo, únicamente nos queda por crear la tabla que después cargaremos. Para ello, emplearemos el siguiente comando,
shell> ipset create bannet hash:ip
El primer argumento (
bannet) es el nombre de la tabla que vamos a crear. El segundo (
hash:ip) es el tipo de tabla a crear. Este tipo puede ser diferente según nuestros propósitos y puedes ver
aquí todos los métodos soportados. En este caso, nos interesa un tipo
hash:ip, ya que vamos a almacenar en ella un listado de IPs aisladas.
Con la tabla creada, ya sólo nos queda meterle las IPs que deseamos. Para ello, y este proceso sí que debe ser manual,
shell> ipset add bannet 1.1.1.1
shell> ipset add bannet 1.1.2.2
shell> ipset add bannet 1.1.3.3
shell> ipset add bannet 1.1.4.4
Y para ver un listado de las IPs introducidas,
shell> ipset list
Name: bannet
Type: hash:ip
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16568
References: 0
Members:
1.1.3.3
1.1.4.4
1.1.2.2
1.1.1.1
Llegados a este punto, sólo nos queda cargar este IPSet en IPTables. Para hacerlo emplearemos la opción "-m set --match-set", quedando la regla tal que así,
shell> iptables -I INPUT -m set --match-set bannet src -p TCP -j DROP
Cómo veis, una única regla para manejar todas aquellas IPs bloqueadas.
Guardado y restauración
Las tablas creadas van a necesitar un mantenimiento, e IPSet está preparado para ofrecerlo, incorporando opciones de borrado, restauración, testeo, destrucción y un largo etcétera. Se recomienda leer la página man de IPSet. De todas formas, quizás una de las tareas más importantes sea la de guardar las reglas de un tabla, por tener un backup, y volver a restaurarlas en caso de necesidad.
Para hacer un backup de un conjunto de reglas,
shell> ipset save bannet > /backup/bannet.list
Para destruir un conjunto de las mismas,
shell> ipset destroy bannet
Y para restaurarlas, en caso de necesidad,
shell> ipset restore < /backup/bannet.list
En la próxima entrada veremos cómo aprovechas las listas disponibles en la red para mejorar la seguridad de nuestra red. Pero por el momento, quizás con esta opción, muchas de las reglas que tenéis en IPTables puedan ser reducidas de forma muy eficiente.
Referencias