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

Este post intenta esclarecer un poco de como funcionan las redes y como convertir nuestro equipo Linux en un Router que nos asegure un poco más nuestra red, ya sea de hogar e incluso empresarial.  Así que vamos al tema:

Este contenido es basado en el libro “Linux – Administración del sistema y explotación de los servicios de red” – Sébastien BOBILLIER

Enrutamiento y filtrado

Para hablar y entender sobre el enrutamiento podemos definir primero ¿cual es la función del router?. Para ello podemos decir que un router, además de crear una red y permitir conexión con otros equipos (sabiendo que esto lo podemos hacer con un AP, Switch, Hub u otros) tiene la capacidad de conectar dos redes diferentes entre si.

Como lo podemos ver en la imagen, existe una red local “10.0.1.0” que es creada por el router, y llega a una de sus dos interfaces.  Luego el router en su otra interfaz, tiene otra red, con su IP pública con la cual puede conectar a Internet. La función de enrutamiento básicamente es servir de intermediario entre estas dos redes para que puedan comunicarse.

Linux como router.

De forma natural, el Kernel de Linux ya tiene la capacidad de hacer “forwarding”,  pero por defecto viene desactivado, entonces si queremos que nuestro linux pueda hacer este trabajo debemos ir al archivo.

/proc/sys/net/ipv4/ip_forward

Allí encontraremos que es un archivo que lo único que contiene es un cero “0”, lo que debemos hacer es cambiarlo por un uno “1” para activar este comportamiento. Esto por desgracia se borra cuando reiniciemos el equipo, para dejarlo por defecto activado debemos utilizar el comando:

sysctl net.ipv4.ip_forward=1

O editarlo directamente en el archivo /etc/sysctl.conf. Dependiendo de la distribución esta configuración también puede estar en un archivo en  /etc/sysctl.d/.

Por defecto nuestro Linux debe tener una tabla de enrutamiento, que generalmente es la configuración de nuestra red lan y conexión con el router. Si queremos ver este enrutamiento podemos usar dos comandos:

route -n

o

netstat -nr

Ambos comandos deberían devolver lo mismo.

En general, esta configuración es suficiente para que tu Linux sirva como Gateway y otros equipos puedan navegar a través de nuestro equipo. Ahora bien, si queremos que por ejemplo, nuestro Linux conecte dos o más redes ya sean locales o no, podemos hacer uso de las rutas estáticas.

Supongamos que mi Linux tiene dos interfaces de red,  en la primera tiene salida a Internet cuya red es 172.26.0.0 y en la segunda (10.0.0.0) hay unos equipos de otra red local.  Si queremos enrutar paquetes a esa otra red podemos usar:

route add -net 10.0.0.0 netmask 255.0.0.0 gw 172.26.0.8

De forma general es:

route add -net REDDESTINO netmask MASCARA gw IPDELLINUX

si damos route -n independientemente de que esta red exista o no, estará fijado este enrutamiento en nuestra tabla.

Si queremos eliminar dicho enrutamiento podemos usar

route del -net 10.0.0.0 netmask 255.0.0.0

Iptables.

Básicamente iptables es usado para el filtrado de paquetes, salientes, entrantes u otros, esto hace que se convierta en una gran herramienta para administrar el tráfico de nuestra red. Pues iptables así como nos permite filtrar el tráfico del mismo equipo, también permite filtrar el tráfico que pasada a través de él. (Forwarding). Iptables puede dividirse en tablas, cadenas, y acciones.

  • Tablas:  básicamente pueden haber dos tablas, filter, para filtrar paquetes y  nat para traducir direcciones, es decir, para pasar de una red a otra.
  • Cadenas: La cadena se refiere al tipo de tráfico que deseamos filtrar o natear,  es decir, ¿a cual tráfico vamos aplicar las tablas?. y pueden ser:  INPUT: Tráfico entrante, OUTPUT: tráfico saliente o FORWARD: Tráfico que pasa a través de él, pero no es una conexión propia.
  • También puede aparecer POSTROUTING, que se usa para tratar el paquete de un modo determinado luego de haber sido enrutado.
  • Acciones: Las acciones básicamente es la acción que se va realizar con la cadena. Esta acción puede ser DROP, que simplemente destruye ese tráfico o ACCEPT. que permite al tráfico hacer dicha acción.

Las reglas de IPTABLES se guardan y ejecutan en el orden que fueron creadas, y si una regla suprime a una regla anterior, siempre queda aplicada la ultima regla en el orden.

Políticas de Cortafuegos.

En general, de forma natural los cortafuegos trabajan de dos maneras:

  1. Permitir todo el tráfico excepto, o
  2. No permitir ningún tráfico excepto…

Para aplicar politicas se usa IPTABLES – P CADENA ACCION

Donde la cadena representa el tipo de tráfico (INPUT, OUTPUT, FORWARD, POSTROUTING…) y la acción es DROP O ACCEPT.

Veamos un ejemplo.

 

Aquí vemos que en principio pude hacer ping, luego le dije a IPTABLES que todo el tráfico OUTPUT (Saliente) fuera DROP o no permitido. Luego le dije a IPTABLES que lo aceptara.

Si vamos a construir un cortafuegos desde cero debemos siempre aplicar las reglas de (No permitir ningún tráfico excepto…   Para esto entonces aplicamos las reglas

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
Si aplican estas políticas no tendrán ningún tipo de conexión
.

Para regresar escribimos lo mismo y reemplazamos DROP por ACCEPT.

En este punto, ya que todo el tráfico está denegado, comenzamos a decirle a nuestro IPTABLES cual es el tráfico que si puede tener.

La sintaxis es:

iptables -A cadena -s ip_orgigen -d ip_destino -p protocolo --dport puerto -j acción

Donde:

Cadena = INPUT, OUTPUT o FORWARD

ip_origen = Origen de los paquetes, esto puede ser una sola IP o una red y en este caso debemos especificar la mascara ).

ip_destino = hacia donde se dirigen los paquetes. esto puede ser una sola IP o una red y en este caso debemos especificar la mascara ).

protocolo = indica el protocolo que usan los paquetes (icmp, tcp, udp…)

puerto = puerto destino del tráfico.

acción = DROP o ACCEPT.

Ejemplo:

 

Se aplican las políticas de TODO restringido.

Luego añadimos las reglas para poder tener tráfico por el puerto 80 HTTP y 443 HTTPS, con el protocolo TCP.  Luego el puerto 53 Se aplica para que el cliente DNS pues a resolver los dominios, de lo contrario no navegarás. Esto funciona con protocolo udp.

La linea:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Es por lo siguiente: Cuando haces una petición HTTP por ejemplo, tu te conectas al puerto 80 del servidor, pero el servidor para devolverte la información necesita conectar contigo por un puerto cualquiera. (Generalmente superior a 1024).

Como todos nuestros puertos están cerrados esto no se logrará a menos que abramos todos los puertos superiores a 1024 (Mala idea). Lo que esto dice es que se acepta todo el tráfico entrante que provenga de una conexión que yo mismo establecí. Osea una conexión que en principio yo inicié.

Al poner OUTPUT en las reglas, esto solo aplica para el equipo en cuestión, si estamos usando nuestro equipo como router para permitir estas conexiones, debemos cambiar OUTPUT por FORWARD. Dado que el tráfico pasa por el equipo pero no es iniciado por él
Todas estas reglas se borran luego del reinicio, por eso hay que crear scripts para que se inicien por defecto.  Pero esto lo veremos en la próxima

Espero que esta información les haya gustado. En la próxima les hablaré de NAT, Proxy y scripts para el Firewal.

Comparte para difundir

Si te ha gustado nuestro contenido ahora puedes ayudar a difundirlo en las redes sociales de manera sencilla usando los siguientes botones:

Envía
Pinea
Print

12 comentarios

  1.   Rogelio Pinto dijo

    Esta es la base que toman muchos emprendedores para fabricar sus propios firewalls, por eso hay en el mercado tantas y tantas marcas de firewalls con linux embebido, algunas buenos y otras no tanto.

  2.   Heber dijo

    Excelente artículo. Espero ansioso la segunda parte.

  3.   Milton dijo

    Muy buena explicación, me sirvió para entender el proxy de mi trabajo. Gracias

  4.   faustod dijo

    Hola Jlcmux,

    Excelente, me gusto mucho, cuando estara disponible la otra parte?

    Un saludos y gracias por compartir

    1.    @Jlcmux dijo

      Gracias por el comentario.

      Yo mande la otra parte ayer, en el transcurso del día creo que la estarán publicando.

      Saludos.

  5.   Israel dijo

    Muy buen articulo amigo @Jlcmux,de veras q aprendi con el ya que me esclarecio algunas dudas que tenia desde hace algun tiempo,por cierto no te molestaria compartir el libro de la fuente del articulo,el de Sébastien BOBILLIER, bueno slau2s y ahora a ver la 2da parte, salu2s .

    1.    @Jlcmux dijo

      Hola Gracias por comentar Israel.

      Resulta que el libro lo tengo en físico. Pero encontré este link en Google Books. http://books.google.com.co/books?id=zxASM3ii4GYC&pg=PA356&lpg=PA356&dq=S%C3%A9bastien+BOBILLIER+Linux+%E2%80%93+Administraci%C3%B3n+del+sistema+y+explotaci%C3%B3n+de+los+servicios+de+red#v=onepage&q=

      Creo que está completo.

  6.   Ariel dijo

    Muy buen artículo, agrego una consulta: ¿Cuál sería la ventaja de utilizar linux como router, si es que existe alguna, con respecto a un hardware dedicado a ello? ¿O es solo a modo de ejercicio? Se que hay distros dedicadas pero no se si están para rescatar viejas pcs o provee una mayor flexibilidad en la configuración.

    1.    @Jlcmux dijo

      Bueno, pienso que las ventajas y desventajas dependen del escenario donde vayas a implementar esto. Porque seguramente no vas a comprar un UTM o algo así para tu casa? Y quizá para una empresa pequeña que no pueda pagarlo tampoco. Igualmente a modo de ejercicio es bueno, pues te ayuda a entender toda la logica de esto y puedes configurar mejor un FWall dedicado. Además de que casi todos estos aparatos realmente lo que tienen es Linux Embebido.

      Saludos.

  7.   Ariel dijo

    Hola, una pregunta, se puede generar una interfaz “artificial” en linux para similar enrutamiento entre redes? (al estilo packet tracer) para trabajar con máquinas virtuales? ej si tengo eth0 (porque tengo una sola placa claro) puedo crear eth1 para hacer otra red? Muy bueno el tuto!

    1.    elav dijo

      En Linux puedes crear interfaces virtuales, evidentemente. Si tienes eth0, puedes tener eth0:0, eth0:1, eth0:2… etc

  8.   chinoloco dijo

    Muy bueno, gracias por compartir

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.