Hagamos un firewall casero con Iptables (I)

iptables

Como sabemos uno de los componentes más buenos que poseen las distribuciones de Linux son los* iptables, herramienta que nos permiten no solo realizar filtrado de paquetes, sino también implementar sistemas de traducciones de nombres (NAT) y mantener registro de todos los paquetes que pasan por nuestra máquina siendo este parte del proyecto *Netfilter.

Lo curioso es que me pareció muy interesante ver como en el espectáculo de revista hakin9, lo utilizan de manera muy particular,en un artículo escrito por el Ingeniero Antonio Fanelli y al cual se debe esta publicación, utilizaremos a iptables para construir un firewall muy económico por cierto y totalmente hecho por nuestros filtros.Esta será la primera parte del artículo para la creación de nuestro firewall casero.

Primero debemos tener en cuenta, cual es la acción que realiza un firewall (cortafuegos) dentro de nuestra máquina; este es un sistema que está diseñado para bloquear el acceso no autorizado, permitiendo al mismo tiempo comunicaciones autorizadas, los firewall que haremos trabajarán sobre la capa de red es decir sobre los campos que posee el protocolo IP y  también podrán trabajar sobre la capa de aplicaciones (software específico).

Obs:Realicen las modificaciones de los filtros con cautela y no ejecuten comandos si no saben lo que están haciendo, recuerden que iptables es un software que nos ayuda a filtrar nuestras transferencia en la red y puede dejarnos sin transferencia alguna, cualquier comando que utilicemos en este artículo puede ser revertido introduciendo  iptables -P INPUT ACCEPT en la consola.El staff de akashablog no se hace responsable de lo que pueda pasar si ejecutan comandos indebidos :D.

Ahora que ya sabemos el concepto de firewall empezaremos con los comandos así que vayamos a nuestras consolas, y escribamos lo siguiente:

iptables –-list

Lo que nos desplegará una lista de los filtros que ya tengamos agregado, probablemente, y si no tienen agregado ninguno:

Chain INPUT (policy ACCEPT)

Chain FORWARD (policy ACCEPT)

Chain OUTPUT (policy ACCEPT)

Estas son las políticas por defecto que posee iptables. Explicando un poco:

INPUT: Refiere a todos los paquetes entrantes.


FORWARD: Todos los paquetes que transitan desde la PC a otro host en la red.


OUTPUT: Todos los paquetes salientes desde nuestra PC.

Quiere decir que por ahora todos los paquetes entrantes se están aceptando.

Así que porqué no empezamos bloqueando todos los paquetes entrantes, algunas veces esta es una política de seguridad que se recomienda si por ejemplo estamos recibiendo un ataque y no conocemos por cual puerto o dirección está proviniendo, se filtran primero todos los paquetes, se analiza los log de acceso a nuestra red, se adhieren nuevos filtros para luego retomar la conexión.

iptables -P INPUT DROP

Utilizamos el argumento  -P para referirnos a una política en este caso la entrante INPUT y hacemos DROP para evitar cualquier paquete entrante. Con* iptables -P INPUT ACCEPT *revertimos el efecto que tenía el comando anterior, pero dejemos por el momento así para agregar más filtros.

Si ejecutas de vuelta list verás que la política de filtro se agregó a la lista. Podemos ver como ahora nuestra PC se encuentra invisible en la red, si probamos a hacerle ping desde otro host esta no responderá. Solo que existe un inconveniente, si probamos haciendo ping desde nuestra PC a otro host no podremos hacerlo, esto sucede porque el protocolo ICMP (Protocolo de Internet de mensajes de control) se especifica  que a una petición Eco (ping) le corresponde una respuesta Eco (RFC 792), que deberá entrar dentro de nuestra máquina por supuesto, como un paquete y como todos los paquetes entrantes se encuentran filtrados la respuesta no puede llegar. Así que agreguemos un filtro más con el que dejemos pasar la respuesta.

iptables -A INPUT -p icmp –-icmp-type echo-reply -j ACCEPT

El argumento –A indica que agregaremos una nueva regla al tráfico entrante INPUT, -p ICMP significa que trabajaremos sobre los paquetes ICMP, con –icmp-type definiremos el tipo de mensaje que queremos se agregue a la regla en este caso echo-reply (respuesta Eco), para más mensajes ver el (RFC 792) y con -j ACCEPT adherimos la regla.

Podemos probar haciendo ping a un host por su dirección IP, y veremos como las respuestas empiezan a llegar, pero si probamos haciendo por ejemplo ping a un nombre de dominio no obtenemos respuesta.

Resolveremos esto en la siguiente parte de la construcción de nuestro firewall y agregaremos muchos filtros más para hacer de este un firewall completo, así que esperen por la segunda parte del post. Hasta entonces. Recuerden volver su iptables a la normalidad con:

* iptables -P INPUT ACCEPT*

Enlaces:

-hackin9

-Wikipedia:Firewall

– Wikipedia: Iptables

-Wikipedia: Request for Comments (RFC)