El firewall por excelencia en Linux
Hola Fronters, Gabriel aquí. Espero que muy bien. Les cuento que hace dos semanas recibí un mensaje de un amigo que me pidió que le diera un curso de IPTABLES, que «quería saber saber como era eso y tal y Pascual!«. Luis, desde aquí un saludo. Yo le dije que estaba muy bien, que le explicaría y todo eso, pero el problema sería el tiempo. Pues su tiempo es limitado y el mío, pues también.
Entonces, fue cuando me dije «Gabriel, y por qué no haces un tutorial sencillo y en cristiano para explicar IPTABLES!?!?» Y me dije: «Vale. Lo haré, pero además del escrito, lo haré en video!«… Vaya locura esta!!!.
Pues me creé un canal de YouTube, como dirían mis compañeros «que quedó bien majo!» y entre tantas cosas, he comenzado a crear contenido, empezando por este video, y aunque no quedó perfecto, creo que quedó bastante bien, pese a mis limitaciones.
Entonces, este artículo se centrará en reforzar aquellas cosas que posiblemente no hayan quedado claras en el video, el cual puedes verlo al final de este artículo.
Que es IPTABLES
IPTABLES es una herramienta cuya utilidad es la de permitir al SysAdmin o administrador de sistemas, configurar reglas específicas de tratamiento de paquetes de red de datos (filtrado y re direccionamiento básicamente), en un sistema Linux o incluso un sistema operativo de tipo Unix-like.
Esta herramienta forma parte de un conjunto de herramientas que también forman parte del Framework Netfilter del Kernel de Linux, tales como ip6tables, ipset y arptables (en el caso de tablas con Mac Addresses (Capa 2) y su correlación con las direcciones IP asignadas (Capa 3).
Que son las Tablas (Tables), Cadenas (Chains) y Reglas (Rules)
Las Tablas (tables) son elementos que nos permiten organizar o categorizar las cadenas y reglas de nuestro IPTABLES.
Existen varios tipos de tablas, entre los cuales nombraremos:
Tabla de Filtrado (Filter Table): su función es la de controlar el flujo de tráfico de paquetes de red tanto en la entrada como en la salida del sistema. Esta es la tabla por defecto, puesto que es la que autoriza y rechaza el tráfico de datos.
Tabla de Traducción de Direcciones de Red (NAT Table): utilizada para permitir y redireccionar el acceso de paquetes de una red a otra, bien sea desde una red privada hacia Internet, o viceversa.
Y, por último, las Tablas modificadoras, cortadoras o mutiladoras (Mangle Table): cuya función es la de modificar las cabeceras de los paquetes. Literalmente modifican los paquetes, disectándolos, desmembrándolos y volviéndolos a unir. Tal cual como una especie de Dr. Frankestein.
Existen dos tablas más: una es la raw, por medio de la cual se manejan las excepciones de tracking o monitorización de las conexiones, y la última es la tabla security, que es la que trabaja con direcciones MAC (MAC Addresses), es decir: de capa 2.
Estas dos últimas tablas generalmente asisten al proceso de ejecución de las reglas creadas, bueno, en realidad todas se asisten entre sí.
Más sobre la Tabla de Filtrado
Es la tabla que se utiliza con mayor frecuencia y que además sirve de nexo o puente para todas las demás tablas, pues todos los paquetes de datos pasan por los filtros de estas tablas, por lo que son los filtros de esta tabla los que deciden si un determinado paquete entra o no y hacía donde se le es permitido llegar. Sus filtros son los siguientes:
- INPUT: para la entrada de paquetes.
- OUTPUT: para la salida de paquetes.
- FORWARD: para redireccionamiento de paquetes
Del mismo modo, es importante señalar que cada tabla posee sus propias reglas de filtrado.
Los paquetes entrantes suelen ser analizados por todas y cada una de las reglas en cada una de las cadenas, por eso es muy importante que cada una de las reglas estén en un orden adecuado, dado que, de no ser así, esto puede alterar el correcto funcionamiento de nuestro Firewall y comprometer nuestra infraestructura.
Las acciones disponibles correspondientes al tratamiento de los paquetes de datos son los siguientes:
- ACCEPT: permite el flujo de paquetes
- REJECT: Descarta el paquete y emite un feedback
- DROP: Descarta el paquete, lo elimina y no emite ningún tipo de feedback
- LOG: acepta el paquete y guarda su entrada en el archivo o fichero /var/log/messages.
Más sobre la Tabla de NAT
Las Tablas NAT permiten la utilización de una dirección IPv4 para múltiples accesos y / o protocolos, todo gracias a reglas que indiquen el manejo de dichos accesos. En este caso serán las Source NAT (SNAT) o IP masquerading para las direcciones de origen, mientras que para las direcciones de destino de tipo DNAT (NAT Dinámico) serán el Port Forwarding.
Para trabajar con estas tablas, podemos trabajar con tres parámetros fundamentalmente:
- PREROUTING: para modificar paquetes tan pronto como lleguen al equipo.
- OUTPUT: para la salida de paquetes que se generan localmente y van a ser enrutados para su salida.
- POSTROUTING: modificar paquetes que estén listos para salir del equipo.
Instalar IPTABLES
Generalmente Iptables viene instalado con la mayoría de distribuciones de Linux, sin embargo, en caso de no ser así, sólo se debe instalar de la siguiente manera, en el caso de Debian o Ubuntu:
apt install iptables
O si por el contrario se desea instalar en alguna distro derivada de RHEL, tal como CentOS, Rocky Linux, Almalinux:
yum install iptables-services
No sin antes detener o desinstalar cualquier otro Firewall existente, como es el caso de Firewalld.
En el caso de Debian / Ubuntu, encontraremos su archivo de configuración en la ruta /etc/iptables, mientras que en distribuciones basadas en RHEL o derivados, la ruta será en /etc/sysconfig/iptables.
Comandos básicos de manejo de IPTABLES como servicio
En el caso de Debian / Ubuntu, IPTABLES funcionará de manera automática. Hay formas de hacer que funcione como un servicio, pero no es materia de este tutorial.
En el caso de RHEL, se puede manejar el servicio de la siguiente manera:
Para iniciar el servicio:
systemctl start iptables
Para detener el servicio:
systemctl stop iptables
Para reiniciar el servicio:
systemctl restart iptables
Como leer un comando de IPTABLES
Suponiendo que deseamos bloquear el puerto del Secure SHell (SSH), que es el 22 tcp. Para ello utilizaremos la siguiente regla:
iptables -t filter -I INPUT -m tcp -p tcp --dport 22 -j REJECT
Pero… Cómo se supone que debo leer esa regla??? A ver, es más sencillo de lo que parece. solo debemos disectarla, observarla y analizarla adecuadamente:
iptables: por convención, siempre que se vaya a escribir un comando de IPTABLES se debe indicar que es un comando de IPTABLES. (Obvio, no??)
-t: Aquí especificaremos con cual tabla (table) trabajaremos: filter, si es la de filtrado; nat, si es la de NAT, y así.
-I: con este atributo (Insert) indicamos que agregaremos una regla, o también podemos utilizar -A (Append), si vamos a eliminar una regla (delete), utilizaremos el atributo -D. si fuesemos a reemplazar una regla (replace), utilizaremos el atributo -R, y luego especificaremos la cadena en la cual aplicaremos la regla, que en el caso de la tabla de filtrado es la cadena INPUT (entrada), pero podría ser la de OUTPUT (salida) o la de FORWARD (redirección), etc. Todo depende de la tabla, cadena que queramos trabajar y la acción a ejecutar.
-m: Coincidencia (match) que debe existir en los parámetros previos para poder ejecutar la regla a continuación.
–p: Especificamos el puerto (port) a ejecutar la acción de nuestra regla. Aquí los valores pueden ser: tcp, udp, icmp y otros.
–dport: Aquí especificaremos el puerto de destino (destiny port) en el firewall que sufrirá la acción. En este caso es el 22.
-j: Aquí le diremos al firewall que acción llevará a cabo (jump). Otras acciones podrían ser DROP , ACCEPT o REDIRECT.
Hay otros comandos con otro tipo de sintaxis, sin embargo cuando los veas ya te familiarizarás un poco más rápido con ellos.
NOTA: Diferencia entre -I (Insert) y -A (Append): es que con Insert se puede especificar un orden dentro de la cadena en la cual se está haciendo la inserción de la regla, mientras que con Append, simplemente se agregan las reglas al final de la cadena especificada.
Una pausa aquí no estaría nada mal. Diez minutos y un cafécito.
Comandos útiles de IPTABLES
Vamos ahora rápidamente con una serie de comandos que pueden ser absolutamente necesarios. Adáptalos a tus necesidades pero para ello es importante que comprendas bien lo que se explicó anteriormente. Te recomiendo, por si no lo hiciste antes, que te vayas tomando un cafecito antes de comenzar, porque iremos rápido… 😉
Comenzamos…
Si deseamos ver las reglas y cadenas en la tabla de filtrado:
iptables -L
Y mostrará todas las reglas de las cadenas INPUT, FORWARD, y OUTPUT, correspondientes a la Tabla de Filtrado (Filter Table).
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Si queremos ver las cadenas de otra tabla, debemos especificar, cual de ellas deseamos visualizar. Por ejemplo, si queremos ver las reglas de la tabla NAT:
iptables -t nat -L
O si queremos ver las reglas y cadenas de la tabla mangle:
iptables -t mangle -L
Si, deseamos tener más especificidad (rayos, eso se merece un Frapuccino!!!), con las reglas numeradas, en la tabla NAT:
iptables -L -n -v --line-numbers
Agrégale la tabla que deseas visualizar y te mostrará los valores numerados también.
Si queremos ver las reglas sin las cadenas:
iptables -S
Si queremos eliminar las reglas, en la tabla de filtrado:
iptables -F
Para limpiar las reglas y todas las cadenas, en la tabla de filtrado:
iptables -X
Para resetear los contadores respectivos, en la tabla de filtrado:
iptables -Z
Si queremos hacer lo mismo, pero en tablas distintas a la de filtrado:
# Limpiar tablas, cadenas y resetear contadores de la tabla NAT
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
# Limpiar tablas, cadenas y resetear contadores de la tabla mangle
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -Z
Política por defecto (Default Policy)
En una instalación inicial, no existen reglas predefinidas, por lo que, la regla predefinida será aceptar todos los paquetes por defecto.
Para especificar una política por defecto para cada una de las cadenas sólo se deben ejecutar los siguientes comandos:
Si es para aceptar tráfico (ACCEPT) en la cadena OUTPUT por defecto:
iptables --policy OUTPUT ACCEPT
# O también
iptables -P OUTPUT ACCEPT
Si queremos hacer DROP del tráfico entrante (INPUT), por defecto:
iptables --policy INPUT DROP
O también
iptables -P INPUT DROP
Si queremos rechazar (REJECT) de todo el tráfico entrante (INPUT):
iptables --policy INPUT REJECT
# O también
iptables -P INPUT REJECT
Algunas de las políticas que suelen utilizarse son las siguientes:
Para bloquear todo el tráfico de red, entrante y saliente, como política por defecto (NO RECOMENDADO):
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
Para permitir todo el tráfico entrante y saliente, como política por defecto (NO RECOMENDADO):
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
Permitir el tráfico de red saliente, denegando el tráfico entrante
iptables -p INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -m state –state NEW,ESTABLISHED -j ACCEPT
Aplicando reglas en IPTABLES
Bloqueando y permitiendo accesos desde una IP o Subred
Suponiendo que tenemos una red de tres nodos:
- 192.168.1.12
- 192.168.1.13
- 192.168.1.14
Bloquear todos los paquetes entrantes de la IP 192.168.1.11:
iptables -A INPUT -s 192.168.1.11 -j DROP
Bloquear todas las conexiones entrantes de una subred completa:
iptables -A INPUT -s 192.168.1.1/24 -j DROP
Para bloquear todas las conexiones salientes hacia una IP en particular o una subred completa, se agrega la regla en la cadena de salida (OUTPUT CHAIN):
iptables -I OUTPUT -s 192.168.1.12 -j DROP
Para aceptar conexiones en lugar de denegarlas, podemos cambiar DROP por ACCEPT
Bloqueando y permitiendo accesos a puertos
Para bloquear conexiones a puertos y servicios, se debe especificar el protocolo y el puerto. Por ejemplo, si deseamos bloquear el acceso al Puerto 22 (SSH):
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
Bloquear peticiones al Puerto 80:
iptables -I INPUT -p tcp --dport 80 -j DROP
Bloquear el acceso al Puerto 80 para una dirección IP específica:
iptables -I INPUT -p tcp --dport 80 -s 192.168.1.13 -j DROP
Si deseamos agregar una regla en un reglón específico de nuestra cadena de entrada, indicando que acepte las conexiones tcp en el puerto 8080:
iptables -I INPUT 7 -p tcp --dport 8080 -m state --state NEW -j ACCEPT
Redirigir conexiones de un puerto a otro, por ejemplo, del 8080 al 80 automáticamente:
iptables -A INPUT -i ens18 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i ens18 -p tcp --dport 8080 -j ACCEPT
iptables -A PREROUTING -t nat -i ens18 -p tcp --dport 8080 -j REDIRECT --to-port 80
o también:
iptables -t nat -A OUTPUT -o lo -p tcp --dport 8080 -j REDIRECT --to-port 80
Bloquear ICMP
iptables -A INPUT -j REJECT -p icmp --icmp-type echo-request
O también:
iptables -A INPUT -p icmp -j DROP --icmp-type echo-request
iptables -A OUTPUT -p icmp -j DROP --icmp-type echo-reply
Para aceptar conexiones a los puertos o servicios en lugar de denegarlas cambiar DROP por ACCEPT
Reemplazar una regla por otra
Suponiendo que tenemos una regla en la cadena INPUT en la cual indica que el log de los accesos denegados debe ser de cinco por minuto:
iptables -I INPUT 9 -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7
Pero deseamos sustituirla por otra que indique que el log de los accesos denegados debe ser de tres por minuto en vez de cinco, que es como estaba configurada la regla original, para ello reemplazamos la anterior de la siguiente manera, sin alterar su posición:
iptables -R INPUT 9 -m limit --limit 3/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7
Procedimiento para eliminar una regla específica
Si queremos borrar una regla, lo primero que debemos hacer es consultar en nuestras tablas y cadenas el número de la regla que deseamos eliminar:
iptables -L --line-numbers
o
iptables -t filter -L -nv --line-numbers
Y una vez identificada la línea que queremos eliminar, suponiendo que es la línea 3 de la cadena INPUT la eliminamos con el comando:
iptables -D INPUT 3
o
iptables -t filter -D INPUT 3
GUARDAR Y RESTAURAR REGLAS EN IPTABLES
Guardar reglas en Debian / Ubuntu:
iptables-save > /etc/iptables/rules.ipv4
Restaurar reglas en iptables en Debian / Ubuntu:
iptables-restore < /etc/iptables/rules.ipv4
Guardar reglas en RHEL y derivados:
service iptables save
Restaurar reglas en RHEL y derivados:
service iptables restore
NAT con IPTables
Si nuestro servidor linux va a tener capacidades de router, lo primero que debemos hacer es darle la capacidad de hacer redireccionamiento de paquetes de red, hacia adentro de la red. Para ello lo primero que vamos a hacer es :
echo 1 > /proc/sys/net/ipv4/ip_forward
O si queremos que el cambio sea permanente:
nano /etc/sysctl.conf
Buscar la línea que dice:
# net.ipv4.ip_forward
Descomentarla y poner su valor en 1, así como se ve:
net.ipv4.ip_forward=1
Guardamos, salimos del editor y luego ejecutamos el comando:
sysctl -p
SNAT con iptables
La regla que hay que poner para que se haga SNAT en el servidor 192.168.1.14/24 para hacer que el tráfico del mismo salga por la IP pública 185.205.103.6:
iptables -t nat -A POSTROUTING -s 192.168.1.14/24 -o eth0 -j SNAT --to 185.205.103.6
Port Forwarding a otro servidor y puerto
En este caso le diremos a IPTABLES que redirija todo el tráfico externo dirigido al puerto 443 hacia la dirección IP 192.168.1.12, puerto 443:
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.1.12:443
Por último, para natear las peticiones del servidor de origen:
iptables -t nat -A POSTROUTING -j MASQUERADE
Aquí te dejo el video con una breve explicación de todo lo conversado aquí hoy
Cierre y Palabras Finales
Bueno, como vimos, se pueden hacer un montón de cosas interesantes con IPTABLES. desde otorgar y restringir accesos hasta monitorizar tráfico de red. Mi recomendación es seguir practicando, aprendiendo, dado que es mucho lo que puede mejorar nuestra seguridad aplicando las reglas adecuadas.
Sin más nada que decir, me despido, no sin antes dejarles aquí el video tutorial de IPTABLES. Esperando que les guste. Por favor compartan el artículo y el video, dejar su comentario y así aprendemos todos. Hagamos de esta una bonita comunidad.
Hasta luego fronters!!!
Referencias
Todos estos enlaces sirvieron como fuente de inspiración y de consulta y los recomiendo ampliamente.