En el mundo de la administración de sistemas, los cortafuegos son esenciales. Pero, ¿qué sucede cuando necesitas bloquear o permitir el acceso de cientos o miles de direcciones IP? Crear una regla para cada una de ellas no solo es tedioso, sino que puede ralentizar tu servidor. Aquí es donde entra en juego ipset.
Un ipset es un marco de trabajo dentro del kernel de Linux que te permite almacenar un conjunto de direcciones IP, redes, puertos o incluso combinaciones de estos (como IP y puerto) en una estructura de datos altamente eficiente. Piensa en él como una lista de invitados o una lista negra de direcciones, pero diseñada para que la consulta de «¿está esta IP en la lista?» sea prácticamente instantánea, sin importar el tamaño de la lista.
¿Por qué es tan importante usar ipset?
La principal ventaja de ipset no es solo su capacidad para agrupar direcciones, sino el impacto que tiene en el rendimiento de tu firewall. Tradicionalmente, con herramientas como iptables, las reglas se procesan en orden lineal. Si tienes 10,000 reglas para bloquear otras tantas direcciones IP, el sistema tiene que recorrerlas una por una hasta encontrar una coincidencia, lo que consume una cantidad significativa de CPU.
ipset resuelve este problema de dos maneras clave:
- Una regla para gobernarlas a todas: Permite crear una única regla en
iptablesque haga referencia a todo el conjunto. Por ejemplo, una sola regla como «bloquear todo el tráfico que provenga del conjunto ‘blacklist'». - Velocidad «relámpago»: El kernel utiliza estructuras de datos optimizadas (como tablas hash) para buscar en el conjunto. Esto significa que la comprobación es extremadamente rápida, incluso si tu
ipsetcontiene millones de entradas.
Tipos de ipsets
Un ipset puede ser de diferentes tipos, dependiendo del tipo de datos que quieras almacenar. Algunos de los más comunes son:
hash:ip: Almacena direcciones IP individuales (ej.192.168.1.10).hash:net: Almacena redes en notación CIDR (ej.192.168.0.0/24).hash:port: Almacena números de puerto (ej.22,443).hash:ip,port: Almacena combinaciones de dirección IP y puerto.
El poder de ipset + firewalld
Herramientas modernas como firewalld integran el soporte para ipset de una manera muy natural, simplificando su uso. Con firewalld, puedes crear y gestionar ipsets a través del comando firewall-cmd sin necesidad de lidiar directamente con la sintaxis de ipset.
# Crear el ipset de forma permanente (IPV4)
firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip
# Crear el ipset de forma permanente (IPV6)
firewall-cmd --permanent --new-ipset=blacklist6 --type=hash:ip --option=family=inet6
Ahora podemos recargar el firewall y verificar que se ha creado correctamente.
# Recargar para que esté disponible
firewall-cmd --reload
# Verificamos que se creó correctamente
firewall-cmd --get-ipsets
Podemos añadir ips en tiempo de ejecución, se borrarán cuando se reinicie el firewall.
# Añadir direcciones a la lista negra (en tiempo de ejecución)
firewall-cmd --ipset=blacklist --add-entry=192.168.1.100
firewall-cmd --ipset=blacklist --add-entry=10.0.0.50
Si queremos añadir la IP de forma permanente, hemos de añadir el flag permanent y recargamos el firewall.
# Añadir direcciones a la lista negra
firewall-cmd --permanent --ipset=blacklist --add-entry=192.168.1.100
firewall-cmd --permanent --ipset=blacklist --add-entry=10.0.0.50
firewall-cmd --reload
Podemos buscar una ip dentro del ipset
firewall-cmd --ipset=blacklist --query-entry=192.168.1.100
Crear una regla para indicar si denegamos (drop) o permitimos (accept), si hemos creado la regla sin el flag permanent, al reiniciar el firewall se borrará.
# Crear una regla para bloquear todo el tráfico de la lista negra (en tiempo de ejecución)
firewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
# Crear una regla para bloquear todo el tráfico de la lista negra, permanente
firewall-cmd --permanent --add-rich-rule='rule source ipset=blacklist drop'
firewall-cmd --reload
# Crear una regla para bloquear todo el tráfico de la lista negra, indicando la zona
firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist drop'
# Verificamos que se ha creado la regla
firewall-cmd --list-rich-rules
Otros comandos importantes de gestión del ipset
# Eliminar una ip dentro del ipset
firewall-cmd --permanent --ipset=blacklist --remove-entry=<ip_a_borrar>
# Listar ips añadidas a un ipset
firewall-cmd --permanent --ipset=blacklist --get-entries
En resumen: ipset es una herramienta fundamental para cualquier administrador que quiera construir firewalls robustos y de alto rendimiento. Permite manejar listas de direcciones masivas de forma eficiente, manteniendo la simplicidad de las reglas y la velocidad del sistema. Cuando trabajamos con firewalld, su integración es tan sencilla que se convierte en una pieza más de la caja de herramientas del administrador.
IMPORTANTE:
Para eliminar un ipset hay que hacerlo de la siguiente manera. Si hay una regla rica asignada al ipset hay que eliminarla antes. Orden de eliminación:
- Regla rica
- Ipset
- Recargar Firewalld