Saltar al contenido principal
Volver a proyectos

Proyecto personal / laboratorio

Firewall con Debian 12 y nftables

Laboratorio práctico para entender cómo funciona un firewall a bajo nivel. Implementación de nftables en Debian 12 con configuración de reglas de filtrado de tráfico y políticas de red.

Debian 12nftablesLinuxNetworking
2024-02-01 → 2024-02-15Completado

Introduccion

El principal objetivo de este proyecto es entender a bajo nivel como funciona un firewall , de manera que la idea es crear un firewall utilizando nftables en Debian 12, con el propósito de gestionar y filtrar eficazmente el tráfico de red entrante y saliente de una máquina con Windows 10. Este sistema busca proporcionar una solución robusta y configurable para mejorar la seguridad de la red, minimizando posibles amenazas y ataques externos.

Entorno del Laboratorio

Debian 12 (Firewall)

Esta maquina va a tener dos interfaces de red, una conectada a la red interna, hacia la maquina Windows. La segunda interfaz de red va a estar conectada hacia la WAN.

Se configurará através de nftables para poder establecer distintas politicas, reglas de entrada y salida.

Windows 10

Esta maquina va a tener una interfaz de red, donde esta va a estar en la red interna conectada hacia la maquina Debian 12 que va a actuar como firewall. El fin de esta máquina es emular ser un usuario final que interactua normalmente.

Diagrama de red

Configurando el Laboratorio

Una vez instalados ambos sistemas operativos, procedemos a configurar las interfaces de red de cada uno, para el caso del debian agregué las dos interfaces, una interna la cual se conecta con Windows y el otro como adaptador puente, por donde saldría el trafico. \

Ahora procedemos a conectar la maquina Windows a la red interna, hacia nuestro Debian

Ahora procedemos a configurar nuestro Debian, para ello primero vamos a asignar nuestra IP como estatica, tambien vamos a asignar una ip estatica a nuestra segunda interfaz de red que se conecta con la red interna, para ello vamos a editar el archivo interfaces que se encuentra en /etc/network/interfaces\

La interfaz enp0s3 es la que está conectada a internet y la interfaz enp0s8 es la que proviene de nuestro Windows. \

Vemos que lo configuramos correctamente, por lo que procedemos a testear la conexión entre Debian y Windows

Hay conectividad entre ambas máquinas, ahora toca configurar nftables y establecer nuestras reglas, para ello vamos a editar el archivo nftables.conf, que se encuentra en /etc/nftables.conf. Desde allí podremos implementar nuestras politicas por defecto, como asi también establecer reglas de salida y de entrada

Para ello establecí las siguientes configuraciones.\

#!/usr/sbin/nft -f

flush ruleset

table inet firewall {
    chain input {
        type filter hook input priority 0; policy drop;

        iifname "lo" accept
        ct state established,related accept
        tcp dport { 80, 443, 53 } accept
        udp dport 53 accept
        drop
    }

    chain forward {
        type filter hook forward priority 0; policy drop;

        iifname "enp0s8" oifname "enp0s3" tcp dport { 80, 443, 53 } accept
        iifname "enp0s8" oifname "enp0s3" udp dport 53 accept
        oifname "enp0s8" ct state established,related accept
        drop
    }

    chain output {
        type filter hook output priority 0; policy drop;

        oifname "enp0s3" tcp dport { 80, 443, 53 } accept
        oifname "enp0s3" udp dport 53 accept
        ct state established,related accept
        drop
    }
}

table ip nat {
    chain prerouting {
        type nat hook prerouting priority -100; policy accept;
    }

    chain postrouting {
        type nat hook postrouting priority 100; policy accept;

        oifname "enp0s3" ip saddr 192.168.56.0/24 masquerade
    }
}

Explicación del las reglas :

flush ruleset Esta línea elimina todas las reglas existentes en nftables. Es importante para asegurarse de que estás comenzando desde cero y que no haya reglas previas interfiriendo con las nuevas reglas que vas a crear.

&#xNAN;Creación de una tabla inet llamada firewall

La tabla inet es capaz de manejar tanto IPv4 como IPv6. En este caso, la tabla se llama firewall y contendrá las cadenas (chains) que definen las reglas del firewall.

Cadena input dentro de la tabla firewall

type filter hook input priority 0; policy drop;

Aquí se define una cadena de tipo filter, que está vinculada al hook de entrada (input). El hook input captura todo el tráfico entrante. La prioridad 0 establece el orden de esta cadena frente a otras posibles cadenas de filtro. La política por defecto (policy) es drop, lo que significa que, si un paquete no coincide con ninguna de las reglas de esta cadena, será descartado.

iifname "lo" accept

Esta regla permite todo el tráfico a través de la interfaz de red de loopback (lo). La interfaz lo se usa para comunicaciones internas en la máquina, por lo que es necesario aceptarla.

ct state established,related accept

Se permite el tráfico que ya está establecido o relacionado con una conexión previamente establecida. Esto es esencial para que las respuestas de conexiones salientes sean aceptadas, ya que solo se permite el tráfico nuevo entrante si está relacionado con una conexión existente.

tcp dport { 80, 443, 53 } accept

Permite tráfico TCP entrante a los puertos 80 (HTTP), 443 (HTTPS) y 53 (DNS).

udp dport 53 accept

Permite tráfico UDP entrante al puerto 53, que es utilizado por el protocolo DNS.

drop

Todo el tráfico que no coincida con las reglas anteriores será descartado debido a esta regla.

Cadena forward dentro de la tabla firewall

type filter hook forward priority 0; policy drop;

La cadena de tipo filter está vinculada al hook de reenvío (forward), capturando el tráfico que pasa a través del firewall hacia otra interfaz de red. La política por defecto es drop, lo que significa que todo el tráfico no autorizado será descartado.

iifname "enp0s8" oifname "enp0s3" tcp dport { 80, 443, 53 } accept

Permite el tráfico TCP que entra por la interfaz enp0s8 y sale por la interfaz enp0s3 hacia los puertos 80, 443 y 53.

iifname "enp0s8" oifname "enp0s3" udp dport 53 accept

Permite el tráfico UDP que entra por enp0s8 y sale por enp0s3 hacia el puerto 53 (DNS).

oifname "enp0s8" ct state established,related accept

Permite el tráfico que sale por enp0s8 si está en un estado established o related. Esto es importante para que las respuestas a conexiones existentes sean aceptadas en el reenvío.

drop

Como en la cadena input, todo el tráfico que no coincide con las reglas anteriores será descartado.

Cadena output dentro de la tabla firewall

type filter hook output priority 0; policy drop;

Esta cadena captura el tráfico saliente, y la política por defecto es drop, lo que significa que cualquier tráfico que no coincida con las reglas será descartado.

oifname "enp0s3" tcp dport { 80, 443, 53 } accept

Permite el tráfico TCP saliente que usa los puertos 80, 443 y 53 hacia la interfaz enp0s3.

oifname "enp0s3" udp dport 53 accept

Permite el tráfico UDP saliente hacia el puerto 53 (DNS) a través de la interfaz enp0s3.

ct state established,related accept

Permite el tráfico saliente que está en un estado established o related, asegurando que las respuestas a conexiones ya existentes sean permitidas.

drop

Como en las otras cadenas, cualquier tráfico que no coincida con las reglas anteriores será descartado.

Creación de una tabla NAT

Esta tabla es de tipo ip, lo que significa que solo funciona con tráfico IPv4. Contendrá las reglas para hacer NAT (Network Address Translation).

Cadena prerouting dentro de la tabla nat

type nat hook prerouting priority -100; policy accept;

Esta cadena intercepta los paquetes antes de que sean enrutados por el sistema. La política por defecto es accept, lo que significa que los paquetes que no coinciden con las reglas serán aceptados. Al establecer la prioridad en -100, nos aseguramos que las reglas NAT se apliquen antes que cualquier otra regla.

Cadena postrouting dentro de la tabla nat

type nat hook postrouting priority 100; policy accept;

Define una cadena de tipo NAT, que está vinculada al hook de post-enrutamiento (postrouting). Intercepta los paquetes después de que hayan sido enrutados pero antes de que salgan por la interfaz de red.

oifname "enp0s3" ip saddr 192.168.56.0/24 masquerade

Esta regla aplica NAT a todos los paquetes que salen por la interfaz enp0s3 y tienen una dirección de origen en el rango 192.168.56.0/24. El objetivo de la acción masquerade es cambiar la dirección IP de origen del paquete a la dirección IP pública de la interfaz saliente, permitiendo que las máquinas de la red interna usen la IP pública del servidor para acceder a Internet.

Luego para aplicar los cambios usamos el comando:

sudo nft -f /etc/nftables.conf

Aplicamos los cambios sobre nftables y procedemos a verificar si la configuración esta funcionando, usando el siguiente comando:

sudo nft list ruleset\

Vemos que la configuración se ha establecido correctamente. Por ultimo procedemos a habilitar el reenvio de paquetes a nivel kernel de nuestro Debian, para que de esta manera pueda actuar como un puente y funcione correctamente la traducción de direcciones NAT

Para ello vamos a editar el archivo /etc/sysctl.conf con nano y vamos a sacar el comentario de la linea que dice "net.ipv4.ip_forward=1"

Una vez hecho todo esto, nuestro firewall está funcionando en nuestra máquina Windows \

Poniendo a prueba el firewall

Primero vamos a observar el trafico sobre el puerto 443, el cual es https y tenemos habilitado, para ello vamos a ingresar a una pagina como facebook y a su vez controlamos el trafico de salida en la interfaz enp0s3 con tcpdump

Vemos que carga correctamente la pagina, por lo que procedemos a ver con tcdump el trafico de salida a través del siguiente comando

tcpdump -i enp0s3 port 443

De esta manera verificamos que el firewall está funcionando correctamente en uno de los puertos a los cuales le dimos permiso.

Para poner a prueba el firewall, voy a buscar una página cualquiera en shodan la cual esté corriendo sobre el puerto 8080, puerto el cual no estaría permitido según nuestras reglas establecidas en nftables, así que para ello me dispongo a probar la página desde una máquina la cual NO tiene el firewall aplicado, por lo que deberíamos ver lo siguiente:

Ahora nos vamos a dirigir a nuestra maquina virtual Windows en la cual Debian esta funcionando como firewall y vamos a intentar acceder a la misma página y a la vez vamos a controlar el trafico con tcpdump, observando la interfaz enp0s3, la cual es la que nos conecta con internet.

Para ello usé el comando tcpdump -i enp0s3 port 8080

Vemos que la página no cargó correctamente, por lo que procedemos a ver los resultados de tcpdump

Vemos que no sale nada de trafico por el puerto 8080 hacia afuera, por lo que nuestro firewall esta funcionando de manera correcta

Conclusiones

La elaboración de este proyecto de configuración de un firewall utilizando nftables en Debian, me ha brindado un conocimiento más completo sobre la seguridad de redes y el poder del kernel de Debian para filtrar tráfico. Aprendí cómo implementar reglas estrictas que permiten únicamente el tráfico necesario, como HTTP, HTTPS y DNS, mientras bloqueo cualquier otro intento de conexión no autorizado.

Esta experiencia me ha permitido comprender mejor la importancia de segmentar redes utilizando diferentes interfaces de red y cómo un firewall actúa como línea de defensa para proteger una red interna de posibles amenazas externas.

\

¿Te interesa colaborar en seguridad defensiva?

Estoy abierto a conversaciones sobre roles y proyectos en SOC, incident response y mejora de detección.

Contactar