🚧IPTables
iptables es una herramienta de línea de comandos que permite configurar reglas de filtrado de paquetes en Linux. Se utiliza para definir qué tráfico de red se permite o se bloquea, ayudando a proteger el sistema frente a conexiones no deseadas.
Aunque Ubuntu incorpora herramientas simplificadas como ufw para la gestión del firewall, aprender a usar iptables directamente proporciona un mayor nivel de control y flexibilidad.
Iptables es el sucesor del anterior ipfwadm e ipchains y esta disponible desde la versión 2.4 del kernel linux (2001) y ha sido desarrollado por el proyecto netfilter.
Para el uso de iptables en linux es necesario conocer algunos conceptos previos:
Más info: https://rlworkman.net/howtos/iptables/chunkyhtml/c962.html
La información de iptables la podemos ver en:
apt show iptablesSe puede hacer la siguiente clasificación del tipo de tráfico que lo relacionamos con las cadenas (chains):
Entrante con destino el equipo (INPUT)
Saliente, originado en el equipo (OUTPUT)
Que atraviesa el equipo (entra por una interfaz de red y sale por otra, FORWARD)
Esto, junto a lo que queramos hacer, nos permite agrupar las reglas que tienen la siguiente jerarquía:
Reglas por tráfico
Las reglas se agrupan en cadenas
Las cadenas se agrupan en tablas
Tablas y cadenas (chains)
iptables organiza las reglas en diferentes tablas según la función (ordenado de más común a menos):
filter
Es la tabla por defecto, si no especifico nada usa esta, usada para filtrar paquetes (cortafuegos).
sudo iptables -L -v -n
nat
Se usa para la traducción de direcciones (por ejemplo, redireccionamiento de puertos).
sudo iptables -t nat -L -v -n
mangle
Permite modificar ciertos campos de los paquetes, marcarlos y modificarlos.
sudo iptables -t mangle -L -v -n
raw
para depurar la conexión.
security
Usada para control de la MAC (por ejemplo con SELinux)
Cadenas de filter:
INPUT: Maneja paquetes entrantes dirigidos a mi máquina.
OUTPUT: Gestiona paquetes que se generan y salen de mi máquina.
FORWARD: Se utiliza para paquetes que pasan a través de mi máquina (enrutamiento).
Cadenas de nat:
PREROUTING: Pensada para hacer modificaciones de tipo NAT antes de tomar la decision de encaminamiento por ejemplo, cambiarle la dirección IP destino. Esto se ejecuta antes del FORWARD
INPUT y OUTPUT: Casos más específicos
POSTROUTING: Después de tomar la decisión de encaminamiento, es lo ultimo que se aplica, por ejemplo es donde se ponen las reglas de NAT.

Como se ve en el gráfico, básicamente se mira si el paquete esta destinado a la propia maquina o si va a otra. Para los paquetes (o datagramas, según el protocolo) que van a la propia maquina se aplican las reglas INPUT y OUTPUT, y para filtrar paquetes que van a otras redes o maquinas se aplican simplemente reglas FORWARD.
En nuestra máquina hay reglas aplicadas y empiezan a llegar/salir/pasar paquetes. Por ahora olvidemos la red, las reglas están a nivel de kernel, y al kernel lo que le llega es un paquete y tiene que decidir que hacer con él. El kernel lo que hace es, dependiendo si el paquete es para la propia maquina o para otra maquina, consultar las reglas de firewall y decidir que hacer con el paquete según mande el firewall. Por ejemplo:
Paquete del exterior con destino al equipo:
PREROUTING de nat e INPUT de nat y filter
Paquete originado en el equipo que sale:
OUTPUT de nat, OUTPUT de filter y POSTROUTING de nat
Paquete que atraviesa el equipo
PREROUTING de nat, FORWARD de filter y POSTROUTING de nat
INPUT, OUTPUT y FORWARD son los tres tipos de reglas de filtrado. Pero antes de aplicar esas reglas es posible aplicar reglas de NAT: estas se usan para hacer redirecciones de puertos o cambios en las IPs de origen y destino. E incluso antes de las reglas de NAT se pueden meter reglas de tipo MANGLE, destinadas a modificar los paquetes; son reglas poco conocidas y es probable que no las usen.
El ultimo concepto son las acciones (TARGETs), estas funcionan como una ACL. Cuando llega un paquete se leen secuencialmente todas las reglas al paquete hasta que se encuentra una regla aplicable a este, y ahora que hago con ella? Pues una vez se defina una regla hay que determinar qué hacer con el paquete:
ACCEPT: Se permite el paso del paquete si cumple la característica.
DROP: Se elimina silenciosamente el paquete.
RETURN: Cumple la regla y deja de leer más reglas y pasa a la siguiente cadena, esto ocurre cuando te interesa optimizar la lectura de reglas.
Si no se encuentra ninguna regla se aplica la política de la cadena.
Comandos Básicos de iptables
Listar reglas:
Este comando muestra las reglas actuales en todas las cadenas del filter con detalles, o bien por si quiero verlo de la forma que lo añado:
Agregar unas reglas por defecto:
Por ejemplo, bloquear todo el trafico por FORWARD:
Agregar reglas sencillas, se puede hacer con Append (
-A) o con Insert (-I) dependiendo si te interesa añadirla al final o al principio respectivamente:
Cuando hablamos de políticas DROP, debemos tener en cuenta:
Que cada regla INPUT le suele corresponder una regla OUTPUT, por pares (Para cortafuegos personales).
Que cuando las reglas son FORWARD también deben ser dobles (Para cortafuegos perimetrales):
Siguiendo con mas comandos:
Insertar una regla en una posición específica:
Esto es útil para que una regla se procese antes que otras, recuerda que el orden es importante.
Eliminar una regla: Puedes eliminar una regla especificándola exactamente o mediante su número:
O bien, listar las reglas con numeración y eliminarlas por posición:
Comprobar la existencia de una regla:
Esto nos permite comprobar la existencia de una regla así.
Limpiar reglas: Podemos limpiar directamente todas las reglas con:
O también nos puede interesar poner los contadores de paquetes a 0:
Guardar y restaurar reglas:
Para guardar las reglas en un archivo:
Para restaurar:
Para empezar de cero, ejecuta este script:
En Ubuntu es común usar el paquete iptables-persistent para que las reglas se carguen al iniciar el sistema.
Depuración de reglas
Antes de nada, para comprobar que las reglas están funcionando o no, debemos habituarnos a ciertos comandos para la comprobación, depende lo que quieras realizar:
✔ Ver reglas activas y contar paquetes
✔ Capturar paquetes rechazados por iptables
✔ Ver tráfico en un puerto específico en tiempo real
✔ Ver conexiones activas en la red (debe instalarse net-tools)
✔ Monitorizar tráfico en tiempo real con más detalles (debe instalarse)
Escenario de configuración
Crearemos una máquina virtual (Ubuntu server en mi caso) con la siguiente configuración de adaptadores:
Para este tipo de simulación recomiendo configurar tres adaptadores (o dos pero después añadiremos otro):
Uno o dos en "Red Interna" para conectarse con la LAN interna (donde se ubica el servidor interno) y posteriormente la DMZ.
El otro en "NAT Network" para simular la conexión al exterior. Con el adaptador en NAT Network, la VM podrá realizar conexiones salientes (y si lo configuras, recibir ciertas conexiones entrantes) que imitan el funcionamiento de una red pública.
Aunque también se podría conectar en modo adaptador puente si te es más fácil.
El escenario será el siguiente finalmente:

Los servidores y clientes tendrán la .100 por defecto.
PRÁCTICA: protegiendo la máquina con un script
A continuación, vamos a ver algunos ejemplos guiados para construir un script que satisfaga nuestras necesidades de IT, para ello usaremos un script que iremos modificando progresivamente.
Los scripts de iptables deberían tener este aspecto:
Saludo a la afición (echo)
Borrado de las reglas aplicadas actualmente (flush)
Aplicación de políticas por defecto para INPUT, OUPUT, FORWARD
Listado de reglas iptables
Ten en cuenta que cuando la política es DROP a cada regla de INPUT le suele corresponder una de OUTPUT.
Supongamos que tenemos un servidor contra una red entera, vamos a configurar algunas reglas sencillas:
Guardamos el script y le damos permisos de ejecución:
Firewall de una LAN con salida a internet
Ahora vamos a ver una configuración de firewall iptables para el típico caso de red local que necesita salida a internet.

Para este caso nos hace falta una regla que haga NAT hacia fuera (enmascaramiento en iptables), con lo que se haría dos veces NAT (en el firewall y en el router). Entre el router y el firewall lo normal es que haya una red privada (En nuestro caso enp0s3 como adaptador WAN en 89.67.45.23 y enp0s8 como adaptador LAN en 10.0.0.0), aunque dependiendo de las necesidades puede que los dos tengan IP pública.
El router se supone que hace un NAT completo hacia dentro, o sea que desde el exterior no se llega al router si no que de forma transparente se "choca" contra el firewall. Lo normal en este tipo de firewalls es poner la política por defecto de FORWARD en denegar (DROP), pero eso lo vemos más adelante.
Veamos como sería este firewall−gateway, vamos a usar el siguiente script:
De nuevo, no te olvides de darle permisos de usuario.
Vamos a complicar un poco mas el script, ahora supongamos:
El servidor de firewall también es un servidor de SMTP, pop3,
El jefe quiere entrar al servidor por PPTPD (VPN)
Añadimos una máquina Windows server que tenemos dentro de la red local con IIS
Nos han pedido que permitamos la gestión por terminal remoto (RDP) para esta máquina para una empresa externa que se encarga del mantenimiento de la web.
Tengamos en cuenta que ahora vamos a trabajar reglas de entrada del exterior para los servicios y con redirecciones de puertos (para el servidor windows):
Bueno ya tenemos montada la red, pero conviene insistir en que esta última configuración, con las redirecciones y los servicios de correo funcionando en el firewall es bastante insegura. ¿Qué ocurre si hackean el servidor IIS de la red local? Pues que el firewall no sirve de gran cosa, lo poco que podría hacer una vez se ha entrado en la red local es evitar escaneos hacia el exterior desde la máquina atacada, aunque para ello el firewall debiera tener una buena configuración con denegación por defecto.
Firewall de una LAN con salida a internet con DMZ
Vamos complicando la situación, ahora imaginemos que tenemos una red parecida a la anterior pero ahora hacemos las cosas bien y colocamos ese servidor IIS en una DMZ:

En esta configuración tenemos un servidor web expuesto (10.0.90.2/24) y una red LAN de clientes (10.0.80.0/24), por lo tanto, con este tipo de firewall hay que permitir.
Acceso de la red local a internet.
Acceso público al puerto tcp/80 y tcp/443 del servidor de la DMZ
Acceso del servidor de la DMZ a una BBDD mysql de la LAN
Obviamente bloquear el resto de acceso de la DMZ hacia la LAN.
Ten en cuenta que para filtrar el tráfico de la DMZ y la LAN solo podemos usar las reglas FORWARD, ya que estamos filtrando entre distintas redes, no son paquetes destinados al propio firewall, tienen que pasar a través de él, vamos con el script:
Con esto nos aseguramos de tener una DMZ aislada de la LAN y con las reglas correctas.
Hay que tener algo en cuenta, si el server de la DMZ tienen una ip pública hay que tener muchísimo cuidado de no permitir el FORWARD por defecto. Si en la DMZ hay ip pública NO ES NECESARIO HACER REDIRECCIONES de puerto, sino que basta con rutar los paquetes para llegar hasta la DMZ.
Este tipo de necesidades surgen cuando por ejemplo tenemos dos máquinas con servidor web (un apache y un IIS); ¿A cuál de las dos le redirigimos el puerto 80? No hay manera de saberlo (No, con servidores virtuales tampoco, piénsalo), por eso se deben asignar IPs públicas o en su defecto usar puertos distintos.
Por tanto hay que proteger convenientemente toda la DMZ. Tampoco haría falta enmascarar la salida hacia el exterior de la DMZ, si tiene una ip pública ya tiene una pata puesta en internet; obviamente hay que decirle al router como llegar hasta esa ip pública.
Firewall de LAN con DMZ con política de denegación por defecto
(imagen esquema)
Nos puede resultar interesante y útil ver y montar un esquema por defecto de denegación de paquetes pero, ¿Qué supone el hecho de establecer como política por defecto la denegación?
Se debe explicitar cada conexión permitida en los dos sentidos.
Se debe conocer perfectamente qué debe estar abierto y qué no.
Es muchos más difícil de mantener y si se hace conviene hacerlo desde el principio.
No todo es más trabajo: también supone un firewall mucho más seguro. En el ejemplo de la DMZ ya se presentaba esta situación en las reglas forward de una a otra red. Para ilustrar el DROP por defecto, vamos a mostrar la configuración del ejemplo anterior de firewall entre redes pero con política por defecto DROP.
(pagina 22)
Otros ejemplos prácticos
Te dejo a continuación más ejemplos para ir practicando:
Ejemplo 1: Permitir conexiones SSH (puerto 22)
Permite el tráfico entrante a través del puerto 22, esencial para administrar el servidor de forma remota:
Ejemplo 2: Bloquear todo el tráfico entrante y permitir solo conexiones establecidas y SSH
Este conjunto de reglas configura una política de “default deny” (rechazo por defecto) para el tráfico entrante, permitiendo únicamente conexiones ya establecidas y el acceso SSH:
Ejemplo 3: Redirigir el tráfico del puerto 80 al puerto 8080 (NAT)
Si tienes un servicio corriendo en el puerto 8080 y deseas que las conexiones al puerto 80 se redirijan automáticamente:
Ejemplo 4: Limitar conexiones ICMP (ping)
Para evitar ataques de ping o reducir la carga, puedes limitar la cantidad de paquetes ICMP:
Ejemplo 5: Evitar que el ping funcione
El objetivo es evitar que el ping funcione en el PC desde el que estamos. Para lograr esto en el nivel de protocolo, dejaremos caer todos los paquetes ICMP dentro y fuera de este PC. El diseño es:
Supongamos que la directiva predeterminada es ACCEPT
Supongamos que la tabla de filtros está vacía → Anexar (Append -A) una nueva regla
Paquetes recibidos → INPUT chain
Paquetes enviados → OUTPUT chain
El protocolo es ICMP
El objetivo (acción) es DROP
La implementación con iptables se logra con:
La forma de leer el primer comando de iptables es: "Append una regla a la cadena INPUT. La regla coincide con los paquetes que utilizan el ICMP. Cuando un paquete coincide, entonces jump a la acción DROP".
Ejemplo 5: Eliminar una regla específica
Si has agregado una regla que ya no deseas, primero lista las reglas con número y luego elimina la deseada:
Consideraciones Adicionales
Persistencia de las Reglas: Las reglas configuradas con iptables se pierden al reiniciar el sistema. Para mantenerlas, instala y configura iptables-persistent:
Durante la instalación, se te pedirá guardar las reglas actuales. Alternativamente, puedes guardar las reglas manualmente y restaurarlas en el arranque.
Pruebas y Monitoreo: Siempre es recomendable probar las nuevas reglas en una sesión que no desconecte inmediatamente la conexión remota, para evitar bloquearte. Además, puedes usar la opción LOG para registrar y monitorear tráfico sospechoso:
Resumen

Referencias:
Muchos de los apuntes han sido sacados directamente de Pello Xabier Altadill Izura (www.pello.info)
Última actualización

