Asegurando tu red con Iptables – Proxy – NAT – IDS: PARTE 2

En el post anterior vimos la configuración de IPTables para que funcione como un Firewall. Ahora podemos ver como crear esos scripts para que se ejecuten las reglas automáticamente cuando se inicie el sistema, y también como podemos eliminar o detener esas reglas por un momento.

Antes de hacer el script y mostrarles como va quedando, hablemos un poco de NAT y del concepto de lo que queremos hacer con este equipo.

NAT y Contexto del ejemplo.

Cuando hablamos de NAT, podemos confundir esto con enrutamiento, y es que ambos se encargan de conectar dos redes diferentes entre sí. La diferencia realmente radica es que el enrutamiento se aplica para pasar de una red local a otra y esta otra red puede conectarse a un router y salir a Internet.

Mientras que, cuando hablamos de NAT, hablamos de enrutar paquetes de una red local o privada a una red pública o Internet. Esto lo hace enmascarando los paquetes poniéndole la ip pública con la que sale a Internet. Es decir, que no necesitamos un router, porque la ip pública la tiene directamente el ordenador con GNU/Linux.

Trabajaremos esto con la consigna de que estamos usando nuestro Linux como un router/firewall para salir a Internet desde una red local. Pero aquí pueden aparecer dos escenarios.

  • Que nuestro Linux esté entre el router del proveedor de servicio y la red local.

En este caso, entre el router y nuestro Linux habría una red, y entre el Linux y la red local habría otra red diferente. Esto significa que nuestro router no tendría que hacer NAT como tal, con un simple enrutamiento de tráfico como lo explique en post anterior estaría bien.

  • Que nuestro Linux tenga una interfaz conectada a la red local y por la otra interfaz reciba directamente una ip pública con la cual navega.

Esto significa que nuestro Linux debe hacer NAT para que los paquetes puedan llegar a Internet.

Para efectos de este pequeño laboratorio entonces, diremos que nuestro Linux recibe directamente una ip pública y así poder probar los efectos de la NAT.

Para hacer NAT usamos entonces la sintaxis

 iptables -t nat -A POSTROUTING -O eth1 -j MASQUERADE

Donde eth1 es la interfaz por donde recibimos la ip pública, osea por donde salimos a Internet.

se usa MASQUERADE cuando la ip es pública pero puede variar con el tiempo (dinámica). En caso contrario podemos usar SNAT –to-source ip

Creando script iptables

Supongamos entonces que: 172.26.0.0 es nuestra red local y 81.2.3.4 es la ip pública con la que salimos a Internet. (es una ip estática). Tengo las interfaces eth0 (Red local)

eth1 (Red pública).

Consiste básicamente en crear un script que pueda ser llamado desde /etc/init.d/cortafuegos (por ejemplo). y desde este script poder iniciar, detener o consultar el estado de nuestra configuración, tal y como hacemos con cualquier demonio del sistema.

Supongamos que mis reglas IPTABLES SON:

#! /bin/bash
# Firewall de mi hogar.
# Nombre de archivo /etc/cortafuegos_on
# By Jlcmux Twitter: @Jlcmux
#
# Política básica.
iptables -P INPOUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#
#NAT para compartir Internet desde eth0 a eth1
iptables -t nat -A POSTROUTING -O eth1 -j SNAT --to-source 81.2.3.4
#
# Permitir conexiones entrantes iniciadas por mi
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# Trafico saliente autorizado
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p udp --dport 53 -j ACCEPT
No olvidemos dar permisos de ejecución

Explicación:

El script básicamente hace lo siguiente:

  1. Primero restringe toda la navegación, conexiones y tráfico. (Políticas básicas de Firewall)
  2. Luego crea la NAT con el destino eth1. indicando le que tenemos una ip pública estática “81.2.3.4”
  3. Abre los puertos necesarios para recibir los paquetes de conexiones iniciadas por mi.
  4. Acepta el tráfico saliente de HTTP, HTTPS y DNS.
Las reglas tienen como destino el tráfico FORWARD porque estamos usando nuestro Linux como Router, entonces las políticas se usan para el tráfico que PASA por el Linux, osea, actúa como intermediario. Esto significa que nuestro Linux realmente no puede navegar ni recibir ningún dato directamente. Solo se aplica para los equipos conectados a él, pero no a él mismo

Si quisiéramos usar nuestro equipo para navegar deberíamos repetir las lineas y cambiar FORWARD por INPUT o OUTPUT según el caso.

Script anulación.

Ahora vamos a crear un script que anule todo lo anterior y deje el equipo limpio de todo esto. (Para efectos de pruebas o simplemente queremos apagar el firewall).

#! /bin/bash
# Firewall de mi hogar.
# Nombre de archivo /etc/cortafuegos_off
# By Jlcmux Twitter: @Jlcmux
#
#Borrando Reglas
iptables -F
#
#Aplicando politicas por defecto (todo tráfico aceptado)
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

Automatizando.

Ahora debemos crear el script dentro de /etc/init.d/ y el servicio se inicie automáticamente y lo podamos gestionar de una manera más cómoda.

#! /bin/bash
# Firewall de mi hogar.
# Nombre de archivo /etc/init.d/cortafuegos
# By Jlcmux Twitter: @Jlcmux
case $1 in
start)
/etc/cortafuegos_on
;;
stop)
/etc/cortafuegos_off
;;
status)
iptables -L
;;
*)
echo "Sintaxis erronea. Valido = /etc/init.d/cortafuegos start|stop|status
;;
esac

Explicación:

Este último script lo ponemos en /etc/init.d/ con el nombre cortafuegos. Entonces si queremos gestionar el firewall podemos usar el comando /etc/init.d/cortafuegos start. De la misma forma lo podemos parar o ver el estado.

Ahora vamos a editar el archivo /etc/rc.local y ponemos algo como: /etc/init.d/cortafuegos start para que se inicie con el sistema.

Pues bien. Este es la segunda parte. Espero que aporte algo a todos ustedes. En la próxima vemos Proxy e IDS.


7 comentarios

  1.   dhunter dijo

    Si es Debian lo que usas existe un paquete en el repo (iptables-persistent) que hace exactamente eso, te hace un dump de las reglas actuales en /etc/iptables/rules.v4 o v6 según lo que uses y luego te los aplica cuando levanta el sistema.

  2.   ocz dijo

    En la práctica, para limpiar la configuración de un cortafuegos iptables convencional (y usar NAT no lo sería desde mi punto de vista), en la mayoría de los casos bastaría con un “flush” de reglas y restablecer las políticas predeterminadas a ACCEPT.
    Pero en teoría, y hasta donde yo sé, además de esto también es necesario borrar las cadenas no predeterminadas y reiniciar los contadores. Acciones a realizar teniendo en cuenta que además de “filter” hay otras tablas, (de consulta obligada leer el archivo “/proc/net/ip_tables_names” para ello).

    Por cierto, la ortodoxia dice que un cortafuegos ya debe estar activo antes de que lo esté la red. No se como se logra en los demás sistemas Linux, pero en los de tipo Debian podría adaptarse y establecerse el script en el directorio “/etc/network/if-pre-up.d/”.

    Buen firewalling a todos. 😉

  3.   NauTiluS dijo

    Hola, esta muy bueno el post. Lo he leído completo los 2 tomos.

    Esperando los próximos 🙂

  4.   anonimo dijo

    Una pregunta desde mi ignorancia, seguimos con iptables, pero ya hace varias versiones de núcleo que tenemos nftables, yo ya estoy probando, las preguntas son ¿es algo beta nftables respecto a iptables? ¿se seguirá usando iptables por mucho tiempo mas?

    Gracias.

    1.    Yukiteru dijo

      nftables incluye todas las funcionalidades de iptables, ip6tables, arptables y ebtables, todo usando una nueva infraestructura tanto en kernelspace como en userspace, que asegura mejor rendimiento y una funcionalidad mejorada. nftables reemplazará iptables y todas las demás herramientas mencionadas pero no por los momentos, no al menos hasta que haya un uso más amplio de nftables como tal.

  5.   Alejandro dijo

    muy buen post, me quede con ganas de leer mas ya que esta muy bien explicado.. saludos gracias gran aporte

  6.   Avrah dijo

    Hola! Muy buenos ambos post.
    Como aporte podria agregar a final en esta parte:

    “Ahora vamos a editar el archivo /etc/rc.local y ponemos algo como: /etc/init.d/cortafuegos start para que se inicie con el sistema.”

    Agregar esto al rc.local.

    if [ -x /etc/init.d/cortafuegos ]; then
    /etc/init.d/cortafuegos start
    fi

    Lo que significa que si “cortafuegos” tiene permisos de ejecucion lo ejecute, sino no.
    Si queres que no se inicie el “cortafuegos” solo hay que sacar los permisos.

    Por ej: chmod +x /etc/init.d/cortafuegos
    para hacer que se ejecute en cada inicio o…
    chmod -x /etc/init.d/cortafuegos
    para desactivarlo totalmente.

    Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.