¿Que es un Firewall?
Básicamente podríamos decir que un Firewall es un dispositivo, ya sea por hardware o por software, que actúa de intermediario entre varias redes (al menos 2), dependiendo del tipo de configuración que posea, es que dejara pasar, salir o entrar determinado trafico. Es un elemento de seguridad importante, ya que con el mismo podremos especificar todo el trafico que deseemos denegar o permitir, y de esta manera tener un mejor control sobre lo que ingresa o sale de nuestra red.
¿Que es Netfilter e Iptables?
Netfilter es un Framework disponible en el núcleo linux, su principal función es el manejo de los paquetes ip, pudiendo manipular los mismos. Además bajo este nombre también se encuentra el proyecto que provee de herramientas libres para Firewalls basados en Linux, y aquí es donde aparece Iptables, una de las herramientas mas importantes, la misma permite filtrar paquetes, hacer NAT (Network Address Translation) y mantener registros (Logs), es una herramienta muy potenete. Anteriormente hasta el kernel 2.4, se encontraban las herramientas ipfwadm e ipchains, las cuales filtraban los paquetes y realizaban NAT, pero con la aparición de Netfilter se comenzó a realizar packet filtering (filtrado de paquetes), connection tracking (seguimiento de conexiones) y Network Address Translation (NAT o traducción de direcciones de red), mejorando notablemente el desempeño del firewall.
Políticas de creación de un Firewall:
Básicamente podemos decir que existen dos políticas para crear un Firewall:
1) Denegar todo: esta es quizás la manera mas segura, pero a su vez mas difícil de configurar, ya que tendremos que saber exactamente todo el flujo de datos que necesitamos aceptar, ya que al denegar todo, tendremos que colocar explícitamente regla por regla, según lo que necesitemos.
2) Aceptar todo: esta regla es mucho mas fácil de configurar, pero a su vez necesitamos tener mas cuidado, ya que al aceptar todo y solo denegar lo que deseemos, no se nos tendrá que escapar nada para no comprometer a la red.
Conceptos generales de Iptables
Tablas: aquí podemos encontrar 3 tipos de tablas:
Filter: Filtra los paquetes en general.
Nat: modifica direcciones o puertos de los paquetes, para permitir de esta manera el
enmascaramiento de los mismos.
Mangle: realiza acciones especiales sobre los paquetes.
Cadenas:
Input: Todo lo que entra.
Output: Todo lo que sale
Forward: Todo lo que pasa, pero tiene como direccion otro destino.
Prerouting: Lo que se va a realizar antes de enviar el paquete.
Postrouting: Lo que se va a realizar inmediatamente después de enviar el paquete.
Tablas y Cadenas:
Ahora vamos a ver que cadenas pueden contener cada tabla
TABLA CADENA
FILTER INPUT,OUTPUT y FORWARD
NAT PREROUTING, POSTROUTING y OUTPUT
MANGLE PREROUTING, POSTROUTING, INPUT, OUTPUT Y
Targets (Objetivos):
Todos los paquetes que son marcados o "Tageados" son manipulados de la siguiente manera
ACCEPT: el paquete es aceptado.
DROP: el paquete es automáticamente descartado.
REJECT: tiene una forma de actuar parecida a DROP, pero envía un mensaje de error a quien lo envío
Opciones en Iptables:
-A = append, esto coloca al final de la lista la regla
-I = insert. esto coloca la linea al comienzo
-I 10 coloca la nueva regla en el lugar de la linea 10 y la 10 pasa a ser 11
-A 10 coloca la nueva regra en la linea 10 y la que era 10 pasa a ser 9
-I = insert. esto coloca la linea al comienzo
-I 10 coloca la nueva regla en el lugar de la linea 10 y la 10 pasa a ser 11
-A 10 coloca la nueva regra en la linea 10 y la que era 10 pasa a ser 9
-t : tabla a utilizar, en el caso que no se especifique ninguna toma por defecto a filter.
-j : es la opción que generalmente se coloca al final, ya que especifica el objetivo (JUMP).
-p: se usa para indicar el protocolo. (tcp, udp, etc)
-s: ip origen. (ip "source")
-d: ip destino
--dport: puerto destino.
--sport: puerto origen (puerto "source")
Agregando y Borrando Reglas:
ejemplo de una regla que rechazara los paquetes enviados con el protocolo icmp y luego borraremos la misma:
iptables -A INPUT -p icmp -j DROP (esta regla no dejara entrar los paquetes ICMP)
iptables -D INPUT -p icmp -j DROP (esta linea borrara la regla antes creada)
Reemplazar regla:
iptables -R INPUT 1 -p icmp -j ACCEPT (lo que hará esta regla es fijarse en la tabla
filter (ya que es la por defecto, dentro de la cadena INPUT, la primer regla, y ahi
reemplazara el contenido por el que hayamos indicado nosotros, tiene que ser la linea
completa)
Y supongamos que necesitamos hacer un cambio pero de otra tabla como puede ser nat,
lo que habría que indicar es lo siguiente:
iptables -t nat -A POSTROUTING -i eth0 -s 192.168.1.0/24 -j MASQUERADE (regla
original)
iptables -t nat -R POSTROUTING 1 -i eth1 -s 192.168.1.0/24 -j MASQUERADE
(reemplazo)
Listar Reglas:
iptables -L (lista solo la tabla filter con cada una de sus cadenas)
Chain INPUT (policy ACCEPT)
target prot opt source
DROP
icmp -- anywhere
destination
anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source
destination
Chain OUTPUT (policy ACCEPT)
target prot opt source
destination
En este ejemplo podemos ver una de las reglas que creamos en INPUT, donde nos
indica el target (DROP), el protocolo (icmp), la fuente y el destino. Sino se llega aclarar
algunos de estos puntos al crear la regla, lo que pasara es que tomara la totalidad de las
opciones como validas, como podemos ver en fuente y destino, no especificamos y tomo
anywhere (cualquiera).
Continuación listar reglas:
ya vimos en el ejemplo anterior como listar las reglas de la tabla filter, ahora vamos a ver
como listar las otras dos:
iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source
destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source
destination
MASQUERADE 0 -- anywhere
anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source
destination
Continuación listar reglas:
iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target prot opt source
destination
Chain INPUT (policy ACCEPT)
target prot opt source
destination
Chain FORWARD (policy ACCEPT)
target prot opt source
destination
Chain OUTPUT (policy ACCEPT)
target prot opt source
destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source
destination
Borrar Reglas:
La forma de borrar reglas es parecida a listar, o sea hay que especificar con -t a que
tabla hacemos referencia, sino estaremos haciendo referencia únicamente a filter:
iptables -F (Borra las reglas para la tabla filter)
iptables -t nat -F (Borra las reglas para la tabla nat)
iptables -t mangle -F (Borra las reglas para la tabla mangle)
Resetear los contadores:
de la misma manera que la opción anterior pero con el parametro -Z:
iptables -Z (Resetea los contadores para la tabla filter)
iptables -t nat -Z (Resetea los contadores para la tabla nat)
iptables -t mangle -Z (Resetea los contadores para la tabla mangle)
Tipos de filtrados mas usados:
Por protocolo (TCP, UDP, ICMP)
Por Puerto (tanto de origen como destino)
Por dirección (tanto de origen como destino)
Por interfaz
Por estado de conexión
Por protocolo:
iptables -A INPUT -p TCP -j ACCEPT
iptables -A INPUT -p UDP -j DROP
iptables -A INPUT -p ICMP -j DROP
iptables -A OUTPUT -p all -j DROP
iptables -A FORWARD -p ! TCP -j DROP
Por Puerto:
iptables -A OUTPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport ! 22 -j DROP
Lo que estamos indicando acá es que todo lo que salga con destino a el puerto 80 del
protocolo tcp lo deniegue, y todo lo que entre con destino a todos los puertos, excepto el
puerto 22 del protocolo tcp lo deniegue.
Por dirección:
iptables -A FORWARD -d www.google.com.ar -j DROP
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source
destination
Chain FORWARD (policy ACCEPT)
target prot opt source
destination
DROP
0 -- anywhere
yw-in-f103.google.com
DROP
0 -- anywhere
yw-in-f104.google.com
DROP
0 -- anywhere
yw-in-f147.google.com
DROP
0 -- anywhere
yw-in-f99.google.com
Como se ve en la imagen anterior, automáticamente al ingresar el DROP para
www.google.com.ar, también lo ingreso para los servidores relacionados, en este ejemplo
convendría usar un Proxy como Squid directamente.
iptables -A FORWARD -s 192.168.1.101 -d 192.168.5.1 -j DROP
aquí tenemos otro ejemplo, en este caso se le esta denegando todo el trafico proveniente
de 192.168.1.101 con destino 192.168.5.1.
Por Interfaz:
iptables -A INPUT -i lo -p icmp -j DROP (aca estoy denegando el ping a la interfaz
localhost, -i para INPUT)
iptables -A OUTPUT -o eth0 -p icmp -j DROP (igual que arriba pero -o para OUTPUT)
Por estado:
Las opciones para filtrar las conexiones por estado son:
INVALID: una dirección desconocida.
ESTABLISHED: conexión ya establecida.
NEW: conexión que recién se esta creando.
RELATED: asocia una conexión a otra existente.
iptables -A FORWARD -m state --state NEW -s 192.168.30.102 -p tcp --dport 1:24 -j
DROP (se deniegan las conexiones nuevas para los puertos del 1 al 24)
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
(se aceptan conexiones relacionadas y establecidas)
Estableciendo políticas:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
Se establecen políticas ACCEPT para las tablas filter y nat.
Comandos de administración:
iptables-save > firewall (crea un archivo con la configuración actual)
iptables-restore < firewall (configura iptables con la configuracion guardada en firewall)
Ejemplo completo:
#!/bin/bash
# Activo el Ip Forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
#Flush de reglas y puesta a cero de contadores
iptables -F
iptables -Z
iptables -t nat -F
# Dejo pasar las conexiones de la interfaz tun creada por Openvpn
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
# Reglas para maquina de cortesía
iptables -A FORWARD -m state --state NEW -s 192.168.30.102 -p tcp --dport 1:24 -j
DROP
iptables -A FORWARD -m state --state NEW -s 192.168.30.102 -p tcp --dport 26:109 -j
DROP
iptables -A FORWARD -m state --state NEW -s 192.168.30.102 -p tcp --dport 111:442 -j
DROP
iptables -A FORWARD -m state --state NEW -s 192.168.30.102 -p tcp --dport 444:65535
-j DROP
iptables -A FORWARD -m state --state NEW -s 192.168.30.14 -p tcp --dport 1:65535 -j
ACCEPT
#Regla para compartir internet
iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -j MASQUERADE
#DEJO PASAR CONEXIONES ACTIVAS Y PERMITO EL PUERTO DE MAIL PARA
TODOS
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state NEW -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -m state --state NEW -p tcp --dport 110 -j ACCEPT
#iptables -A FORWARD -m state --state NEW -p tcp --dport 443 -j ACCEPT
# DEJO PASAR AL GRUPO DE GERENTES ASI PUEDEN TENER ACCESO A TODO SIN PROXY
iptables -A FORWARD -m state --state NEW -s 192.168.30.10 -p tcp --dport 1:65535 -j
ACCEPT
iptables -A FORWARD -m state --state NEW -s 192.168.30.11 -p tcp --dport 1:65535 -j
ACCEPT
iptables -A FORWARD -m state --state NEW -s 192.168.30.12 -p tcp --dport 1:65535 -j
ACCEPT
iptables -A FORWARD -m state --state NEW -s 192.168.30.13 -p tcp --dport 1:65535 -j
ACCEPT
SE AGREGA TERMINAL SERVER PARA QUE TENGA ACCESO A INTERNET POR
LAS DUDAS
iptables -A FORWARD -m state --state NEW -s 192.168.30.3 -p tcp --dport 1:65535 -j
ACCEPT
# Deniego el Msn
iptables -t mangle -A PREROUTING -d 207.46.0.0/16 -j DROP
iptables -t mangle -A PREROUTING -d 64.4.12.201 -j DROP
iptables -t mangle -A PREROUTING -d 63.208.13.126 -j DROP
iptables -t mangle -A PREROUTING -d 64.4.12.200 -j DROP
iptables -t mangle -A PREROUTING -d 65.54.131.249 -j DROP
iptables -t mangle -A PREROUTING -d 65.54.211.61 -j DROP
iptables -t mangle -A PREROUTING -d 65.54.194.118 -j DROP
# DENIEGO TODOS LOS PUERTOS PARA EL RESTO
iptables -A FORWARD -m state --state NEW -p tcp --dport 1:20 -j DROP
iptables -A FORWARD -m state --state NEW -p tcp --dport 22:24 -j DROP
iptables -A FORWARD -m state --state NEW -p tcp --dport 26:79 -j DROP
iptables -A FORWARD -m state --state NEW -p tcp --dport 81:109 -j DROP
iptables -A FORWARD -m state --state NEW -p tcp --dport 111:442 -j DROP
iptables -A FORWARD -m state --state NEW -p tcp --dport 444:65535 -j DROP
-----------------------------------------------------------------------
Un ejemplo de una regla que
firewall:#iptables -I INPUT 2 -s 200.0.0.100 -d 192.168.15.8 -p tcp --dport 3389 -j ACCEPT
firewall:# iptables -I INPUT 3 -d 200.0.0.100 -s 192.168.15.8 -p tcp --sport 3389 -j ACCEPT
-I = insert. esto coloca la linea al comienzo
2 y 3 es en la linea del archivo de configuración que agrega esa regla
-s es la ip asignada que tiene el usuario (Source)
-d es la ip a donde tendrá acceso permitido el usuario (Destination)
-j es jump es lo que va hacer, en este caso saltar a la regla ACCEPT (Jump)
-p tipo de puerto, en este caso tcp
-m tipo de match, en este caso machea con tcp
--dport DestinationPort número de puerto usado por el programa
--sport SourcePort número de puerto usado por el programa
-I = insert. esto coloca la linea al comienzo
2 y 3 es en la linea del archivo de configuración que agrega esa regla
-s es la ip asignada que tiene el usuario (Source)
-d es la ip a donde tendrá acceso permitido el usuario (Destination)
-j es jump es lo que va hacer, en este caso saltar a la regla ACCEPT (Jump)
-p tipo de puerto, en este caso tcp
-m tipo de match, en este caso machea con tcp
--dport DestinationPort número de puerto usado por el programa
--sport SourcePort número de puerto usado por el programa
algo muy interesante antes de agregar a mano las reglas es que estan en este archivo.
root:/# vim /var/lib/iptables/active
No hay comentarios:
Publicar un comentario