martes, 17 de enero de 2012

Firewall usando iptables Ubuntu 11.10



Qué es un firewall
Un firewall es un dispositivo que filtra el tráfico entre redes, como mínimo dos. El firewall puede ser un dispositivo profesional para este propósito o un software como es el caso de Netfilter o Iptables del que estaremos hablando a continuación. Debemos verlo como un dispositivo con DOS o mas interfaces de red en la que se establecen una reglas de filtrado con las que se decide si una conexión determinada puede establecerse o no.
NetFilter o Iptables
El Kernel de Linux trae consigo un sistema de filtrado de paquetes llamando Netfilter o Iptables el se encarga filtrar todo el trafico que llega a las interfaces de red de una PC o servidor. Este sistema de filtrado hace uso de una serie de reglas con las cuales podemos conformar un Firewall mas que potente para nuestros servidores o maquinas de escritorio.
En este tutorial veremos como trabajar con alguna de estas reglas a fin de tener un firewall que realmente nos brinde un nivel de seguridad alto para nuestros servidores o nuestras pc.
Tablas Iptables:
FILTER (filtrado)Es la tabla que se encarga del filtrado de paquetes. Las cadenas serán: INPUT OUTPUT y FORWARD.

NAT (Network Address Translation) Esta tabla se encarga del enmascaramiento de IP, se usa para re direccionar puertos o cambiar las :IPs de origen y destino a través de interface de red. Las cadenas serán :PREROUTING y POSTROUTING

MANGLE (Modificado de paquetes)Permite la modificación de paquetes como ToS (Type of Service), TTL (Time to live)o mark, marcar el paquete.

RAW Esta tabla se usa para configurar principalmente excepciones en el seguimiento de paquetes en combinación con la acción o target NOTRACK. Trabaja sobre la cadena PREROUTING Y OUTPUT y su única acción es Notrack. Puede evitar que iptables haga un seguimiento de los paquetes.

Parámetros:
Toda regla iptables esta definida por una serie de parámetros aquí veremos los parámetros mas usados.
-i Interfaz de entrada (eth0,eth1,eth2...)
 -o Interfaz de salida (eth0,eth1,eth2...)
 --sport Puerto de origen
 --dport Puerto destino -p El protocolo del paquete a comprobar, tcp, udp, icmp ó all.
Por defecto es all
-j Esto especifica el objetivo de la cadena de reglas, o sea una acción

Acciones:

Cada regla que se defina en un scrip iptables debe de llevar una serie de parámetros y además de esto se debe definir el tipo de acción a realizar una vez un paquete llegue a dicho filtro, ahora veremos cuales son las acciones que se pueden realizar.

ACCEPT---> Paquete aceptado.
REJECT---> Paquete rechazado con notificación mediante ICMP
DROP---> Paquete rechazado.
MASQUERADE--->Enmascaramiento de la dirección IP origen de forma dinámica. Esta acción es sólo válida en la tabla NAT en la cadena postrouting.
DNAT---> Enmascaramiento de la dirección destino, muy conveniente para re-enrutado de paquetes.
SNAT---> enmascaramiento de la IP origen de forma similar a masquerade, pero con IP fija.

Ya tenemos los conocimientos básicos ahora comenzaremos a instalar y configurar nuestro firewall.

Instalación de iptables en Ubuntu 11.10

1-     Creamos un fichero “iptables” con permisos de ejecución
sudo touch iptables
chmod 755 /etc/init.d/iptables
2-     Agregamos las siguientes líneas en el fichero creado anteriormente:

#!/bin/sh

case "$1" in
  start)
    echo -n "Starting Firewalling: Iptables"
    iptables-restore /etc/iptables/iptables.conf
    echo "."
    echo -n "Blocking hosts in Black List: Blocking"
    /etc/iptables/blocking
    echo "."   
        ;;
  stop)
    echo -n "Shutting Firewalling: Iptables"

    # Remove all existing rules belonging to this filter
    iptables -F

    # Delete all user-defined chain to this filter
    iptables -X

    # Reset the default policy of the filter to drop.
    iptables -P INPUT   DROP
    iptables -P OUTPUT  DROP
    iptables -P FORWARD DROP
   
    echo "."
        ;;
  restart|reload)
        $0 stop
        $0 start
        ;;
  status)
    echo "Iptables Status"
    iptables -n -L
    ;;
  *)
        echo "Usage: iptables {start|stop|restart|reload}"
        exit 1
esac
echo "done"

exit 0


3-     Adicionamos el demonio iptables en los rc del sistema operativo para que el proceso levante automáticamente cada vez que se encienda la maquina.
cd /etc/init.d
update-rc.d iptables defaults
4-     Creamos el directorio y el fichero donde vamos a guardar las reglas de nuestro iptables
mkdir /etc/iptables
touch /etc/iptables/iptables.conf
5-     Editamos el fichero iptables que esta en /etc/init.d/ modificamos la línea iptables-restore por la línea iptables-restore /etc/iptables/iptables.conf

Tenemos nuestro firewall instalado ahora podemos comenzar a configurar nuestras reglas. El firewall lo hemos instalado con políticas por defecto drop por lo que detendrá todo paquete que pase por el, así que tendremos que configurar nuestras reglas para que permita nada mas que el trafico deseado por nosotros. A continuación veremos una serie de reglas que podemos utilizar en nuestra configuración espero que les sean de mucha utilidad.

Solo vamos a permitir acceso a los servicios necesarios, correo, web, ftp y otros:


Permitimos el acceso al firewall o router solo desde nuestra ip:
-A INPUT -s  200.150.55.10 -j ACCEPT
-A OUTPUT -d  200.150.55.10 -j ACCEPT

Permitimos el trafico DNS:
-A OUTPUT -p udp -s 200.150.55.0/20 --sport 1024:65535 -d 210.44.149.1 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -p udp -s 210.44.149.1 --sport 53 -d 200.150.55.0/20 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT

-A OUTPUT -p tcp -s 200.150.55.0/20 --sport 1024:65535 -d 210.44.149.1 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
 -A INPUT -p tcp -s 210.44.149.1 --sport 53 -d 200.150.55.0/20 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
El resto del trafico hacia el firewall o router se bloquea:
iptables -A INPUT  -j DROP

Permitimos el trafico hacia nuestro servidor de correo usando los puertos 25,110 ,143 ,465 ,993 ,995. Los puertos 25, 110, 143  son los puertos normales de los protocolos pop3 y imap 465, 993, 995 son los puertos seguros de cada uno de esos protocolos vamos a usar el parámetro –mport  para agregar todo en una sola regla.


-A FORWARD -d 210.44.149.3 -p tcp -m mport --dports 25,110,143,465,993,995 -j ACCEPT
-A FORWARD -s 210.44.149.3 -p tcp -m mport --sports 25,110,143,465,993,995 -j ACCEPT

De lo contrario la reglas serian de la siguiente manera:

 -A FORWARD -d 210.44.149.3 -p tcp --dport 25 -j ACCEPT
 -A FORWARD -s 210.44.149.3 -p tcp --sport 25 -j ACCEPT
 -A FORWARD -d 210.44.149.3 -p tcp --dport 110 -j ACCEPT
 -A FORWARD -s 210.44.149.3 -p tcp --sport 110 -j ACCEPT
 -A FORWARD -d 210.44.149.3 -p tcp --dport 143 -j ACCEPT
 -A FORWARD -s 210.44.149.3 -p tcp --sport 143 -j ACCEPT
 -A FORWARD -d 210.44.149.3 -p tcp --dport 465 -j ACCEPT
 -A FORWARD -s 210.44.149.3 -p tcp --sport 465 -j ACCEPT
 -A FORWARD -d 210.44.149.3 -p tcp --dport 993 -j ACCEPT
 -A FORWARD -s 210.44.149.3 -p tcp --sport 993 -j ACCEPT
 -A FORWARD -d 210.44.149.3 -p tcp --dport 995 -j ACCEPT
 -A FORWARD -s 210.44.149.3 -p tcp --sport 995 -j ACCEPT
Permitimos el tráfico para el servidor Web por los puertos 80 y 443 http y https:
-A FORWARD -d 210.44.149.4  -p tcp -m mport –dports 80,443 -j ACCEPT
-A FORWARD -s 210.44.149.4 -p tcp -m mport –sports 80,443 -j ACCEPT
Permitimos el tráfico para el servidor FTP:
-A FORWARD -d 210.44.149.5 -p tcp --dport 20:21 -j ACCEPT
-A FORWARD -s 210.44.149.5 -p tcp --sport 20:21 -j ACCEPT
Permitimos el tráfico ssh de nuestra ip hacia la red de los servidores:
-A FORWARD -d 200.150.55.10 -p tcp --dport 22 –d 210.44.149.0/20 -j ACCEPT
-A FORWARD -s 200.150.55.10 -p tcp --sport 22 –s 210.44.149.0/20 -j ACCEPT
También podemos definir las reglas de la siguiente manera usando los nombres de los protocolos en caso de que no conozcamos que puerto esta usando:
-A FORWARD -d 210.44.149.4  -p tcp -m mport –dports http,https -j ACCEPT
-A FORWARD -s 210.44.149.4 -p tcp -m mport –sports http,https -j ACCEPT
Entre otras cosas que podemos hacer con iptables es permitir un determinado tráfico un día y una hora especifica ejemplo vamos a permitir el acceso a un ftp que se encuentra en nuestra maquina:
iptables -A FORWARD –d 200.150.55.10 -p tcp -m time –timestart 04:00 –timestop 06:30 –days Fri \
--syn –dport 20:21 -j ACCEPT
iptables -A FORWARD –s 200.150.55.10 -p tcp -m time –timestart 04:00 –timestop 06:30 –days Fri \
--syn –sport 20:21 -j ACCEPT
Otra de las cosas que podemos hacer con iptables es distribuir determinado tráfico entre 2 servidores que realizan la misma función:

-A PREROUTING -i eth0 -p tcp --dport 80 --syn -m random \--average 33 -j DNAT --to-destination 210.44.149.4:80
-A PREROUTING -i eth0 -p tcp --dport 80 --syn -m random \--average 50 -j DNAT --to-destination 210.44.149.5:80  

Además con iptables podemos cerrar o abrir rangos de puertos como muestra el ejemplo en que ya por último estamos cerrando todos los puertos excepto los que ya permitimos que permanecieran abiertos:

-A FORWARD -s 0.0.0.0/0 -p tcp --dport 1:1024 -j DROP
-A FORWARD -s 0.0.0.0/0 -p tcp --dport 1024:65535 -j DROP
-A FORWARD -s 0.0.0.0/0 -p udp --dport 1:1024 -j DROP
-A FORWARD -s 0.0.0.0/0 -p udp --dport 1024:65535 -j DROP

En próximos artículos sobre este tema abordaremos otros tipos reglas que nos pueden ser muy útiles a la hora de configurar un firewall usando iptables.

 













1 comentario: