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.
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
Explicación:
El script básicamente hace lo siguiente:
- Primero restringe toda la navegación, conexiones y tráfico. (Políticas básicas de Firewall)
- Luego crea la NAT con el destino eth1. indicando le que tenemos una ip pública estática «81.2.3.4»
- Abre los puertos necesarios para recibir los paquetes de conexiones iniciadas por mi.
- Acepta el tráfico saliente de HTTP, HTTPS y DNS.
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.
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.
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. 😉
Hola, esta muy bueno el post. Lo he leído completo los 2 tomos.
Esperando los próximos 🙂
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.
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.
muy buen post, me quede con ganas de leer mas ya que esta muy bien explicado.. saludos gracias gran aporte
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!