La seguridad siempre debe ser una de las premisas sobre la cual deben trabajar los administradores, personal de gestión y soporte y, en general todos los usuarios de cualquier sistema operativo actual debido a las múltiples amenazas que están presentes en la red.
En el caso de las distribuciones de Linux, la mayoría de ellas cuentan con las herramientas avanzadas para aplicar un filtro a los paquetes de red tanto a nivel de procesamiento de control de paquetes de red en ingreso, desplazamiento, control y salida de la pila de redes dentro del Kernel del sistema usado, por ello, a partir del kernel 2.4, se introdujeron las iptables, las cuales también son denominadas netfilter y estas poseen un mayor nivel de seguridad y funcionalidades prácticas para la protección del sistema.
iptables se encarga de gestionar el filtrado de IPv4 mientras que ip6tables maneja el filtrado de IPv6 en las redes actuales.
Solvetic hará un análisis sobre cómo funciona iptables y algunos de los comandos más prácticos que podemos tomar de él.
1. Filtrado de paquetes en Linux
El kernel de las distribuciones de Linux hace uso de la herramienta Netfilter para llevar a cabo el proceso de filtrado de paquetes, y con ello llevar a cabo las tareas de que estos sean recibidos o detenidos.
- filter: Hace referencia a la tabla predeterminada diseñada para la gestión de los paquetes.
- nat: Su función es alterar paquetes que han sido creados en una nueva conexión siendo usada primordialmente por NAT.
- mangle: Su uso aplica cuando se deben alterar paquetes de red específicos.
Ahora, cada tabla posee un grupo de cadenas incorporadas que están relacionadas a las acciones que pueden ser llevadas a cabo por netfilter, estas son:
- INPUT: Esta relacionada con los paquetes que han sido destinados al host.
- OUTPUT: Esta funciona sobre los paquetes de red que han sido generados localmente.
- FORWARD: Asocia los paquetes que han sido enrutados a través del host principal.
- PREROUTING: Su función es alterar los paquetes de redes tan pronto llegan.
- OUTPUT: Se ha diseñado para altera los paquetes de redes que son creados localmente y se activa antes de que estos sean enviados.
- POSTROUTING: Creada para alterar los paquetes antes de ser enviados de forma global.
- INPUT: Diseñada para modificar los paquetes de red destinados para el host principal.
- OUTPUT: Creada para alterar los paquetes de red creados localmente y funciona antes de que estos sean enviados.
- FORWARD: Altera los paquetes que han sido enrutados a través del host principal.
- PREROUTING: Su tarea es modificar los paquetes que están entrando antes de que sean enrutados.
- POSTROUTING: Altera los paquetes de redes antes que se lleve a cabo el proceso de envío.
Cada paquete de redes recibido o enviado desde el sistema operativo Linux siempre está sujeto al menos a una tabla. Ahora, vamos a comprender algunos de los comandos más útiles que podemos usar con iptables.
2. Desplegar el estado del firewall
Para conocer el estado actual del firewall ejecutamos la siguiente línea:
sudo iptables -L -n -v
Allí podemos validar cada cadena con sus respectivos niveles de paquetes gestionados, los parámetros usados en este comando son:
En caso de desear ve este resultado con número de líneas podemos ejecutar lo siguiente:
iptables -n -L -v --line-numbers
3. Detener, reiniciar o iniciar iptables en Linux
Los principales comandos para gestionar las tareas de iptables a nivel de arranque o detención son:
service iptables stop service iptables start service iptables restart
También será posible hacer uso del comando iptables para detener el firewall y eliminar todas las reglas así:
iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT
Los parámetros definidos son:
4. Añadir nuevas reglas de firewall en Linux
Una de las tareas más prácticas de iptables es crear determinadas reglas para la correcta gestión de los paquetes, para insertar una o más reglas en la cadena seleccionada usaremos la siguiente sintaxis donde primero se debe descubrir los números de línea:
iptables -L INPUT -n --line-numbers
por ejemplo, vamos a añadir la siguiente regla:
iptables -I INPUT 2 -s 192.168.0.50 -j DROP
Luego, veremos las reglas usando el comando arriba indicado. Allí vemos que la regla creada ha sido añadida en la línea 3 según se indicó.
5. Eliminar una regla del firewall en Linux
En primer lugar, debemos desplegar las reglas que están creadas para determinar con exactitud cuál debe ser eliminada, para obtener esta información contamos con las siguientes opciones:
iptables -L INPUT -n --line-numbers iptables -L OUTPUT -n --line-numbers iptables -L OUTPUT -n --line-numbers | less
Ahora, para borrar la regla 3 creada anteriormente, vamos a ejecutar lo siguiente:
iptables -D INPUT 3
6. Almacenar y restaurar las reglas de iptables en Linux
Cada vez que efectuemos algún cambio en las reglas de iptables debemos proceder a guardar esos cambios, para ello basta con ejecutar la siguiente línea:
service iptables sabe
Podremos restaurar de forma simple aquellas reglas que hemos almacenado ejecutando lo siguiente:
service iptables restart
7. Establecer las reglas por defecto en Linux
Con iptables será posible permitir o denegar las reglas por defecto que se han de aplicar a todo el sistema de la siguiente manera.
Para eliminar todo el tráfico ejecutamos:
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
Para eliminar todo el tráfico entrante:
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -m state -- NEW,ESTABLISHED -j ACCEPT
8. Bloquear una dirección IP en Linux
Con iptables será posible realizar el bloqueo de una dirección IP en particular para evitar que esta tenga acceso de paquetes de red al sistema. Para esta tarea contamos con las siguientes opciones:
iptables -A INPUT -s 192.168.0.14 -j DROP (IP específica) iptables -A INPUT -s 192.168.0.0/24 -j DROP (Rango de direcciones)
9. Bloquear solicitudes de puertos entrantes en Linux
Otra de las tareas típicas de seguridad es restringir el acceso de paquetes por un puerto especifico, con iptables tenemos las siguientes opciones:
iptables -A INPUT -p tcp --dport 80 -j DROP iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp -s 192.168.0.14 --dport 80 -j DROP iptables -A INPUT -i eth1 -p tcp -s 192.168.0.1/24 --dport 80 -j DROP
Es posible bloquear el tráfico saliente a un host o dominio especifico, por ejemplo Solvetic.com, para ello ejecutamos lo siguiente:
host -t a solvetic.com
Ahora, con esta dirección IP procedemos al bloqueo:
iptables -A OUTPUT -d 178.33.118.246 -j DROP
También será posible bloquear el dominio completo así:
iptables -A OUTPUT -p tcp -d www.solvetic.com -j DROP
10. Admitir o no tráfico de red usando la dirección MAC en Linux
Otra de las posibilidades a usar es restringir o permitir el uso de paquetes tomando como base la dirección MAC del dispositivo seleccionado. Para ello usaremos alguna de las siguientes opciones:
iptables -A INPUT -m mac --mac-source 00:2F:EF:85:04:09 -j DROP (Deniega el tráfico de la dirección MAC seleccionada) iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:2F:EF:85:04:09 -j ACCEPT (Admite los paquetes de la dirección indicada solo por el puerto 22)
11. Bloquear o permitir solicitudes ICMP en Linux
El protocolo ICMP (Internet Control Message Protocol - Protocolo de mensajes de control de Internet), es un protocolo desarrollado para administrar información relacionada con errores de los equipos en red local, de modo que con este protocolo se pueden hacer solicitudes remotas para verificar la disponibilidad de un equipo y esto en términos de seguridad puede llegar a ser delicado.
Podemos ejecutar las siguientes líneas para evitar las solicitudes ICMP en Linux:
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
Las respuestas de ping también las podemos limitar a ciertas redes o hosts así:
iptables -A INPUT -s 192.168.0.1/24 -p icmp --icmp-type echo-request -j ACCEPT
Podremos aceptar solo un tipo limitado de solicitudes ICMP así:
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
12. Abrir un rango de puertos y direcciones IP en Linux
Esto es útil si necesitamos habilitar un rango definido de puertos para llevar a cabo acciones administrativas o de ejecución de programas:
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 9000:9020 -j ACCEPTAsí hemos abierto el rango de puertos 9000 a 9020 para las conexiones TCP.
Otra de las alternativas es habilitar un rango de direcciones IP estableciendo un puerto especifico así. Allí hemos autorizado este rango para que use el puerto 80.
iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.0.70-192.168.0.80 -j ACCEPT
13. Restringir el número de conexiones paralelas a un servidor por IP de cliente en Linux
Podemos usar el módulo connlimit para definir estas restricciones, por ejemplo, para permitir 5 conexiones ssh por cliente, ingresamos lo siguiente:
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 5 -j REJECT
Para restringir a 10 el acceso por HTTP:
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP
Hemos indicado lo siguiente:
- --connlimit-above 5: Coincide si la cantidad de conexiones existentes es superior a 5.
- --connlimit-mask 24: Son los hosts de grupo que usan la longitud del prefijo. Para IPv4, debe ser un número entre (incluido) 0 y 32.
14. Restringir el número de conexiones paralelas a un servidor por IP de cliente en Linux
NAT (Network Address Translation) es un sistema para traducir las direcciones de red y así facilitar la navegación. Para listar estas vamos a ejecutar lo siguiente:
iptables -t nat -L -n -v
Será posible ver este resultado con sus respectivas líneas así:
iptables -t nat -v -L -n --line-number
15. Borrar las reglas de NAT en Linux
Si deseamos borrar las reglas establecidas de NAT vamos a ejecutar lo siguiente:
iptables -t nat -v -L -n --line-number iptables -t nat -v -L PREROUTING -n --line-number iptables -t nat -v -L POSTROUTING -n --line-number
Para borrar todas las reglas de "PREROUTING" ejecutamos la siguiente sintaxis:
iptables -t nat -D PREROUTING {Numero de regla}
Para borrar todas las reglas de "POSTROUTING" ejecutamos:
iptables -t nat -D POSTROUTING {número de regla}
16. Resetear los contadores de paquetes en Linux
En primer lugar, debemos ejecutar el comando “iptables -L -n -v”, el cual ya vimos anteriormente, para listar los contadores.
Para borrar estos contadores, basta con ejecutar lo siguiente:
iptables -Z
Para resetear los contadores de solo accesos ejecutamos:
iptables -Z INPUT
17. Validar el firewall en Linux
En primer lugar, debemos validar sil os puertos están abiertos o no con el siguiente comando:
netstat -tulpn
Para validar un puerto específico ejecutamos:
netstat -tulpn | grep :80
En caso de no encontrarse abierto el puerto ejecutamos:
service httpd start
Luego debemos asegurarnos qué iptables tenga acceso por dicho puerto:
iptables -L INPUT -v -n | grep 80
18. Permitir acceso de bucle con iptables en Linux
El acceso de bucle de retorno cuyo acceso es desde la IP 127.0.0.1 es importante y siempre debe dejarlo activo para tareas de administración y gestión de red. Para habilitarlo en iptables basta con ejecutar lo siguiente.
iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT
19. Definir nuevas cadenas de iptables en Linux
Con iptables tenemos la posibilidad de definir nuestra propia cadena y almacenar reglas personalizadas en ella. Para definir una cadena, ejecutamos lo siguiente:
iptables -N “Nombre cadena”
Luego ejecutamos "iptables -L" para listar las cadenas de iptables:
En el resultado veremos nuestra cadena creada:
20. Borrar las cadenas o las reglas del cortafuegos de iptables en Linux
Para realizar este borrado debemos ejecutar lo siguiente:
iptables -FComo podemos ver, iptables es una solución integral para gestionar de forma centralizada diversos aspectos de seguridad en las distribuciones de Linux para lograr mejoras en todo lo relacionado con la privacidad.