IPTABLES I: Ejemplo firewall personal

En este post vamos a intentar generar un ejemplo de firewall con iptables en el que por una tarjeta podamos solo podamos salir a internet y por la otra solo podamos salir al correo (puerto 25 y 110)

Para realizar esto tendremos que utilizar única y exclusivamente nuestra Shell.

Empezaremos creando un fichero donde dentro podremos nuestro script de iptables

Teclearemos lo siguiente en la Shell:

Nano fwinmail

Como podemos ver en la captura inferior

clip_image002

Ahora pulsaremos intro para introducirnos dentro del programa nano y así poder editar nuestro script, podemos observarlo a continuación.

clip_image004

Ahora tendremos que comenzar a escribir nuestro script de iptables

Como en todo script tendremos que indicar con que Shell se ejecuta, así que empezaremos escribiendo lo siguiente tal y como se puede observar en la captura:

#!/bin/bash

clip_image006

Ahora y también por cortesía y buenas prácticas tendremos que escribir quien es el autor del script y que va ha hacer, escribiremos…

#Script creado por Komooo666
# Este script filtrara la salida a internet (puerto 80) por la tarjeta eth0
#y el correo (110 y 25) por la eth1

clip_image008

Ahora una vez presentados tanto el autor como el cometido del script nos meteremos de lleno en el.

Un script de iptables podemos dividirlo en 3 grande bloques como son el reseteo, las políticas y las reglas.

Empezaremos con el reseteo. En esta primera parte limpiaremos todo la configuración que pudiese haber y lo haremos de la siguiente manera:

#En esta parte resetearemos todo lo que pueda haber configurado
#-X borra las reglas, -Z borra los contadores de tramas, -F borra las reglas de usuario
#-t nat borra las configuración de nat,todo firewall es un router.

Estos son los comentarios que escribimos por si alguien quiere reutilizarlo sepa que hace cada cosa

clip_image010

Ahora sí que empezamos de verdad… (Pondremos echos después del comando de iptables para que cuando ejecutemos el script vayamos viendo que se está ejecutando, si tenemos un problema podremos detectarlo de una manera más rápida y cómoda

iptables -X && echo “Borrando reglas..”

iptables -Z && echo “Borrando contador tramas..”

iptables –F && echo “Borrando reglas usuario..”

iptables –t nat –F && echo “Haciendo nat..”

clip_image012

Ya hemos acabado de configurar el área de reseteo y vamos a comenzar a realizar el área de políticas.

En nuestro caso la política que vamos a utilizar para el firewall es Aceptar. Como ya sabemos podemos utilizar aceptar o denegar, siendo esta ultima la más recomendada.

Comenzamos esta nueva área escribiendo lo siguiente en el script:

#Estas son las políticas en nuestro caso abrimos todo

Iptables –P OUTPUT ACCEPT && echo “ Aceptamos salida…”
Iptables –P INPUT ACCEPT && echo “ Aceptamos entrada…”
Iptables –P FORWARD DROP && echo “Denegamos reenvío…”

Como podemos observar en la captura inferior, hemos escrito lo mismo y así acabaríamos el área de políticas. Pero antes vamos a explicar que quiere decir cada una de las líneas. En la primera estamos diciendo que por política (de ahí –P) aceptamos todo lo que salga de nuestro firewall hacia fuera (OUTPUT ACCEPT). En segundo lugar, aceptamos cualquier entrada (-P INPUT ACCEPT) y por ultimo como nuestro firewall es de nuestro PC y no vamos a tener reenvíos los podemos denegar (de ahí -P FORWARD DROP)

clip_image014
Tan solo nos quedaría el área de reglas, que vamos a comenzar a continuación

Empezaremos igual que con el resto de aéreas, con un comentario como el siguiente, podernos verlo en siguiente captura

#Estas son las reglas de usuario

clip_image016

A partir de aquí vamos a ir más despacio y explicaremos cada una de las líneas que vayamos escribiendo.

En primer lugar dejaremos salir tramas hacia cualquier dirección a través del protocolo tcp y cuyo puerto de destino, en la maquina a la que nos vamos a conectar sea el 80

Para ello tendremos que escribir lo siguiente:

Iptables –A OUTPUT –o eth0 –d 0.0.0.0/0 –p tcp –dport 80 –j ACCEPT

Paso a comentaros que el –A significa que la regla se añade al final de las que haya, como esta es la primera, se queda en primer lugar. –o significa que la trama saldrá por esa tarjeta de red, en nuestro caso la eth0. –d indica la dirección de destino, en nuestro caso es cualquiera, por eso la red es 0.0.0.0/0. –p indica el protocolo por el que se trasmite la trama, en nuestro caso es tcp. –dport es el puerto de la maquina a la que nos conectamos y por el que se recibirá la trama que enviamos nosotros, en este caso nuestro puerto de envio es aleatorio y es el sistema el que lo selecciona de manera aleatoria. En este caso es l puerto 80 y que nos va a servir para navegar por la web. Por último –j indica la acción a realizar por iptables. En nuestro caso dejamos que salgan las tramas.

Si pensamos un poco, cuando navegamos a través de internet estamos mandando peticiones a servidores para que nos devuelvan páginas que queremos leer. Estas páginas las recibiremos desde su puerto 80 así que tendremos que permitir esta entrada. Tendremos que escribir lo que aparece a continuación:

Iptables –A INPUT –i eth0 –s 0.0.0.0/0 –p tcp – -sport 80 –j ACCEPT
Con esta sentencia estamos indicando que todas las tramas que desde un maquina remota hayan salido por el puerto 80 y a través del protocolo tcp , su entrada sea aceptada por la eth0.

Para poder navegar además tendremos que saber resolver las direcciones, para eso permitiremos la salida y el paso del DNS. También tendrán que poder encontrar nuestra maquina.

Tendremos que escribir lo siguiente:

Iptables –A OUTPUT –o eth0 -d 0.0.0.0/0 –p udp – -dport 53 –j ACCEPT

Iptables – A INPUT –I eth0 -s 0.0.0.0/0 –p udp – – dport 53 –j ACCEPT

La primera sentencia indica que dejamos salir por la tarjeta eth0 las tramas que vayan por el protocolo udp y cuyo Puerto de destino en la maquina lejana sea el del DNS.

La segunda sentencia indica que deja entrar por la tarjeta eth0 y a través del protocolo udp todas las peticiones que vayan al puerto 53 de mi maquina.
Ahora mismo ya estaríamos en condiciones de navegar pero faltaría cerrar todas las demás conexiones que no hemos especificado, tenemos que tener en cuenta que las políticas permiten todos los accesos y que si nos olvidan estas reglas el acceso será total.

Para cerrar las conexiones tendremos que escribir lo siguiente

Iptables –A OUTPUT –o eth0 –j DROP
iptables –A INPUT –o eth0 –j DROP

De esta manera indicamos que todo lo que quiera salir o entrar por la tarjeta eth0 no tiene permiso para hacerlo.

Si recapitulamos un poco vemos que hemos escrito hasta el momento en el área de reglas

#Estas son las reglas de usuario

Iptables –A OUTPUT –o eth0 –d 0.0.0.0/0 –p tcp –dport 80 –j ACCEPT

Iptables –A INPUT –i eth0 –s 0.0.0.0/0 –p tcp – -sport 80 –j ACCEPT

Iptables –A OUTPUT –o eth0 -d 0.0.0.0/0 –p udp – -dport 53 –j ACCEPT

Iptables – A INPUT –I eth0 -s 0.0.0.0/0 –p udp – – dport 53 –j ACCEPT

Iptables –A OUTPUT –o eth0 –j DROP
iptables –A INPUT –o eth0 –j DROP

Como podemos observar en la imagen inferior nuestro script contiene lo mismo que este documento.

clip_image018

En el script hemos añadido echos al final para poder saber en qué línea vamos, por si alguna cosa falla.

Este script filtra por una tarjeta internet y por otra el correo, quiere decir que si una de las tarjetas no funciona podremos acceder a la funcionalidad que nos de la otra.

En este momento si aplicamos la configuración del script tan solo podremos salir a internet y nada más. Vamos a probarlo antes de meternos con la segunda tarjeta y el correo.

En primer lugar tendremos que guardar el documento con control + X y saldremos a la Shell

clip_image020

Una vez salvado hemos realizado un ifconfig para ver el estado de las tarjetas de red y nos ha aparecido la imagen inferior. Hasta ahora las tarjetas siempre habían sido eth0 y eth1, ahora han cambiado así que modificaremos el script y en vez de poner eth0 podremos eth2 y en vez de eth1 eth3.

clip_image022

clip_image024

 

Así nos quedaría el script una vez modificado, volvemos a guardarlo y ahora si le vamos a dar permisos de ejecución.

Para ello tendremos que ejecutar lo siguiente

Sudo Chmod +x fwinmail

clip_image026

Si pulsamos intro nos pedirá contraseña y realizara la acción

clip_image028

Si realizamos ls –l deberíamos de tener permisos de ejecución para todos los usuarios en este fichero

clip_image030

clip_image032

Para que veamos mejor el efecto vamos a dejar al equipo solo con una tarjeta, desconectaremos la otra.

Para hacer esto nos vamos a VMware y quitamos el check de conectado en la segunda tarjeta.

clip_image034

Como podemos apreciar en la imagen inferior al 2 tarjeta ya no luce

clip_image036

En este momento ejecutaremos el script, debería de funcionar la navegación normal,https tampoco debería e funcionar.

Tendremos que ejecutar la siguiente orden

Sudo ./fwinmail para ejecutar el script

clip_image038

Como podemos observar se ha ejecutado perfectamente

clip_image040

Ahora veremos si también funciona como nosotros queremos,

Si realizamos un ping, no debería de funcionar. Escribiremos ping www.google.es

clip_image042

Si pulsamos intro, vemos que ha funcionado correctamente y el trafico icmp está bloqueado como podemos comprobar en la imagen inferior

clip_image044

Intentaremos ahora conectarnos con un servidor pop.

Teclearemos telnet pop.mail.yahoo.com 110

En teoría no debería de funcionar

clip_image046

clip_image048

Se queda intentando conectar y no lo consigue, parece que funciona ok.

Intentaremos navegar ahora, iremos a www.marca.compara ver cómo van los partidos y así veremos si tenemos trafico por el puerto 80

clip_image050

Parece que si tenemos navegación por el puerto 80 de manera correcta.

Ahora lo intentaremos con páginas seguras como https://copia.servidorlinea.com:44371,

Veamos que ocurre, la teoría dice que no debería de funcionar.

clip_image052

Lo intenta pero se queda en la misma página, sin poder llegar a la web segura

clip_image054

clip_image056

Podemos comprobar con iptables –L –n que se estaba dejando pasar y que no,veamoslo

clip_image058

Buenos parece que esta primera parte la hemos completado sin problema así que vamos a intentar realizar la segunda parte.

Ahora intentaremos conducir el tráfico de correo por la tarjeta 2 cuyo nombre en este caso es eth3

Tendremos que empezar a insertar líneas en nuestro script antes de las 2 últimas

Tenemos que dejar pasar pop y smtp, estos puertos son tcp y sus números 110 y 25.

Tendremos que escribir estas líneas en nuestro script.

Iptables –A OUTPUT –o eth3 –d 0.0.0.0/0 –p tcp – -dport 110 –j ACCEPT
iptables –A INPUT –i eth3 –s 0.0.0.0/0 –p tcp – -sport 110 –j ACCEPT

Iptables –A OUTPUT –o eth3 –d 0.0.0.0/0 –p tcp – -dport 25 –j ACCEPT
iptables –A INPUT –i eth3 –s 0.0.0.0/0 –p tcp – -sport 25 –j ACCEPT

Dejaremos pasar DNS al igual que en la primera tarjeta

Iptables –A OUTPUT –o eth3 -d 0.0.0.0/0 –p udp – -dport 53 –j ACCEPT

Iptables – A INPUT –i eth3 -s 0.0.0.0/0 –p udp – – dport 53 –j ACCEPT

Además cerraremos todo el tráfico para esta tarjeta

Iptables –A OUTPUT –o eth3 –j DROP
iptables –A INPUT –i eth0 –j DROP

En este momento la parte de reglas del script quedaría de la siguiente manera

#Estas son las reglas de usuario

Iptables –A OUTPUT –o eth2 –d 0.0.0.0/0 –p tcp –dport 80 –j ACCEPT

Iptables –A INPUT –i eth2 –s 0.0.0.0/0 –p tcp – -sport 80 –j ACCEPT

Iptables –A OUTPUT –o eth2 -d 0.0.0.0/0 –p udp – -dport 53 –j ACCEPT

Iptables – A INPUT –I eth2 -s 0.0.0.0/0 –p udp – – dport 53 –j ACCEPT

Iptables –A OUTPUT –o eth3 –d 0.0.0.0/0 –p tcp – -dport 110 –j ACCEPT
iptables –A INPUT –i eth3 –s 0.0.0.0/0 –p tcp – -sport 110 –j ACCEPT

Iptables –A OUTPUT –o eth3 –d 0.0.0.0/0 –p tcp – -dport 25 –j ACCEPT
iptables –A INPUT –i eth3 –s 0.0.0.0/0 –p tcp – -sport 25 –j ACCEPT

Iptables –A OUTPUT –o eth3 -d 0.0.0.0/0 –p udp – -dport 53 –j ACCEPT

Iptables – A INPUT –i eth3 -s 0.0.0.0/0 –p udp – – dport 53 –j ACCEPT

Iptables –A OUTPUT –o eth2 –j DROP
iptables –A INPUT –o eth2 –j DROP

Iptables –A OUTPUT –o eth3 –j DROP
iptables –A INPUT –i eth0 –j DROP

En nuestro script añadimos echos para ver porque regla vamos, como se puede ver en la imagen inferior

clip_image060

Como antes vamos a intentar probarlo solo y ahora desactivaremos la tarjeta 1 dejando la tarjeta 2 activa en VMware

Tras realizar este paso guardaremos de nuevo el fichero

clip_image061

Y volveremos a ejecutarlo con la orden sudo ./fwinmail

clip_image063

Si pulsamos intro se ejecuta el script de manera correcta como podemos ver en la imagen inferior

clip_image065

Ahora solo tenemos activa la tarjeta 2,eth3, y tan solo deberíamos de poder conectar con los puertos de correo 110 y 25 y no deberíamos de navegar.

Para probarlo, deberíamos de escribir lo siguiente en la Shell
telnet pop.mail.yahoo.com 110

Si pulsamos intro debería de poder conectarse

Veámoslo

clip_image067

clip_image069

Parece que ahora si hemos conectado bien, lo intentaremos con el puerto 25,

Para ello tendremos que teclear:

Telnet smtp.mail.yahoo.com 25

clip_image071

Parece que está funcionando correctamente.

Ahora es el momento justo para probar si funciona la navegación, iremos de nuevo a marca.com

Como podemos observar no conecta, parece que nos está saliendo bien el script de iptables.

clip_image073

Ahora vamos a probar ambas tarjetas juntas para ver si funciona de manera correcta

Habilitamos la tarjeta que estaba desconectada y en el VMware tendremos que visualizar las dos tarjetas como aparecen en la imagen inferior.

clip_image075

Ahora una vez levantada la primera tarjeta volveremos a ejecutar el script

Sudo ./fwinmail para ejecutar el script

clip_image038[1]

Como podemos observar se ha ejecutado perfectamente

clip_image040[1]

Ahora comprobaremos ambas tarjetas.

Para ello intentaremos realizar un telnet al puerto 110 del servidor de yahoo.

Tendremos que teclear lo siguiente

Telenet pop.mail.yahoo.com 110

clip_image069[1]

Parece que nuestra segunda tarjeta está funcionando perfectamente.

Comprobaremos ahora la primera tarjeta, intentaremos navegar a través de ella. De esta manera comprobaremos que funciona de manera correcta o no.

clip_image050

Parece que nuestra practica nos ha salido correctamente

Espero que nos pueda servir 🙂

Una respuesta a “IPTABLES I: Ejemplo firewall personal”

Deja un comentario

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

Time limit is exhausted. Please reload the CAPTCHA.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.