29 de marzo de 2011

IPTABLES - Cortafuegos de Ubuntu (Tutorial)

En esta entrada explicaré una manera muy sencilla y completa de configurar un cortafuegos con Ubuntu.
Lo primero que hay que hacer es aprender un poco de teoría para saber lo que estamos haciendo:

Cortafuegos (Firewall): Es una parte de un sistema o una red que está diseñada para bloquear el acceso no autorizado, permitiendo al mismo tiempo comunicaciónes autorizadas. Se trata de un dispositivo o conjunto de dispositivos configurados para permitir, limitar, cifrar, descifrar, el tráfico entre los diferentes ámbitos sobre la base de un conjunto de normas y otros criterios.

Construcción de una regla: Para construir una regla es importante saber el contenido, la forma de escribirlo, los nombres de las directivas, etc. Para ello he creado una tabla dónde se explica cuales son las directivas, para qué sirven o en qué casos se deben usar.
(Para ver mejor la tabla hagan clik en ella)



Cosas que hay que tener en cuenta de la tabla

  • Cuando se quiere indicar que la tabla que se va a usar es la 'filter', no es necesario poner -t filter porque Ubuntu tiene tomado por defecto en la configuración que si no se indica nada es por que se refiere a la tabla 'filter'.
  • En los tipos ACCIÓN, las opciones REDIRECT y DNAT sólo lo usaremos con PREROUTING.
  • En los tipos ACCIÓN, la opción MASQUERADE sólo lo usaremos con POSTROUTING.
  • En las CONDICIONES, en PROTOCOLO/PUERTO, --to-port sólo lo usaremos para REDIRECT.
  • En las CONDICIONES, en PROTOCOLO/PUERTO, --to sólo lo usaremos para DNAT.

Cómo y dónde se indican las reglas

En primer lugar deberemos crear un script donde vayan a ir definidas todas las reglas.
Se crea un archivo con la extensión '.sh' por ejemplo 'iptables.sh' y dentro de él pondremos las normas.
Nota: No se os debe olvidar darle permisos de ejecución al archivo por que si no, no podría ser ejecutado.

A continuación se tiene que escribir la siguiente línea en el script para que el SO pueda entenderlo:

#!/bin/sh

También es necesario indicar al SO que permita ser atravesado (FORWARD) por paquetes a través de las distintas tarjetas de red. Ésto se hace escribiendo la siguiente línea:

echo 1 > /proc/sys/net/ipv4/ip_forward

Después se deben introducir (aunque no es necesario) una serie de reglas para borrar posibles reglas anteriores que podrían entrar en conflicto con la que se van a escribir a continuación. Ésto se consigue con las siguientes directivas:

-F --> Sirve para borrar las reglas de la tabla filter.
-X --> Sirve para borrar 'asociaciones' entre reglas (ésto no lo veremos pero es bueno ponerlo)
-Z --> Sirve para poner el contador de reglas que tiene Ubuntu para organizar la prioridad de cada una de ellas a cero

También es bueno indicar una política por defecto, es decir, para cuando no se indique nada en una regla, se tome como ACCEPT, REJECT o DROP. Ésto se consigue con la directiva -P.

Lo único que es obligatorio poner en cada regla es iptables al principio de cada una de ellas.

Nota Importante: Hay que respetar al máximo las 'MAYÚSCULAS' y 'minúsculas'. Ej.: La directiva -p sirve para indicar el protocolo, pero la directiva -P sirve para indicar la política por defecto.

Finalmente pondré la estructura que llevará cada regla:

iptables [TABLA] [REGLA] [CONDICIONES] [ACCIÓN]

Notas:
  • Puedes poner las condiciones que estimes oportunas.
  • El orden de las reglas es muy importante ya que una regla puede anular a la siguiente. Mi aconsejo es que el orden de las reglas sea de la más concreta a la más genérica.

Ejemplo de regla:
  • iptables -t filter -A FORWARD -i 192.168.1.0/24 -o eth0 -p tcp --dport 80 -j REJECT
Ésto quiere decir que ninguno de los equipos de la red local 192.168.1.0/24 puede atravesar el cortafuegos saliendo por eth0 hacia las páginas web (http = puerto 80)

De la teoría a la práctica
Una vez explicado todo lo 'Teórico' llega el momento de pasar a la práctica.
Ahora explicaré algunas reglas que pueden ser muy útiles:

Convertir tu Servidor en un Router
Con la siguiente línea puedes conectar una red con otra totalmente distintas para que se pueda producir comunicación entre sí.

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

La interfaz de red se sustituira por la que tengas en tu servidor.

Redireccionar puertos
La utilidad de esta regla es sencilla. Supongamos que tenemos un programa de red, es decir, que necesite tener unos puertos disponibles para poder interactuar con los hosts que se conecten al servicio, por ejemplo, Squid.
Squid es un servidor proxy que también sirve para administrar el flujo de datos entre diferentes redes. Como he dicho antes se sirve de su propio puerto que es el 3128.
Para que los equipos redundantes pasen por el proxy y no se enteren, es decir, quede como transparente, se ha de añadir ésta línea al script:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
...
y así con todas las tarjetas de red que van a ser filtradas por el Squid

Redireccionar IP
Esta utilidad es muy común para las zonas DMZ. Supongamos que aparte de la LAN conectada al cortafuegos, tenemos una serie de servidores conectados también a él mediante una tercera tarjeta de red. Éste conjunto de servidores componen la DMZ y para que estos estén protegidos también con el cortafuegos y al mismo tiempo estén disponibles en Internet, se debe añadir esta línea:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT -to 172.16.0.1:80

La interfaz de red se sustituira por la que tengas en tu servidor-cortafuegos que va hacia Internet.
El puerto que hay después de la IP tambien se sustituira por el puerto que usa el servidor de la DMZ.
Si tienes varios servidores en la DMZ que ofrecen distintos servicios, repetir la línea cambiando el puerto respectivamente.

Supuestos prácticos
Ahora pondré un enlace con 3 supuestos prácticos y otro enlace con las soluciones para que veais como se aplica la teoría a casos supuestamente reales.
Nota: El último paso de cada ejercicio no está incluido en la práctica.

Supuesto práctico

Soluciones

Espero haberles resultado de ayuda. Cualquier duda que les surja, no tengan reparo en comentar y yo intentaré resolver sus dudas.

11 de marzo de 2011

Configurar Apache2 en Ubuntu y en Windows

En esta entrada os mostraré ejemplos de practicas realizadas por mi a partir de los supuestos prácticos mandados por un profesor. Aquí les dejo los enlaces de los supuestos y de las prácticas ya solucionadas.

En Ubuntu

Supuesto práctico en Ubuntu

Practica en Ubuntu

En Windows

Supuesto práctico en Windows

Práctica en Windows

Espero haberles resultado de ayuda. Cualquier duda que les surja, no tengan reparo en comentar y yo intentaré resolver sus dudas.