Configuracion Firewalls
 

Filtrado de Paquetes
Necesidad Filtrado de Paquetes
Reglas de Filtrado
Sintaxis Reglas de Filtrado IPCHAINS
Sintaxis Reglas de Filtrado IPTABLES
Masquerading



Filtrado de paquetes

Todo el tráfico a través de una red se envía en la forma de paquetes. En el comienzo de cada paquete dice donde va, de donde viene, el tipo del paquete, y otros detalles administrativos. Esta parte del paquete se llama encabezado. El resto del paquete, contiene los datos reales que se están transmitiendo, lo que normalmente es llamado cuerpo.

Un filtro de paquetes es una porción de software que analiza el encabezado de los paquetes cuando ellos lo atraviesan, y decide el destino del paquete entero. Podría decidir denegar el paquete (ie. deseche el paquete como si nunca lo hubiese recibido), aceptar el paquete (ie. permita que el paquete lo atraviese), o rechazar el paquete (parecido a denegar, pero le dice a la fuente del paquete que así lo ha hecho).

Bajo Linux, el filtrado de paquetes está implementado en el kernel, y hay unas cosas más complicadas que podemos hacer con paquetes, pero el principio general es el de mirar los encabezados y decidir el destino del paquete.

¿Porque necesitamos el filtrado de paquetes?


Control:
Cuando acostumbra una máquina Linux para conectar su red interna a otra red (digamos, Internet) usted tiene la oportunidad de permitir ciertos tipos de tráfico, y desaprobar otros. Por ejemplo, el encabezado de un paquete contiene la dirección del destino del paquete, así que usted puede prevenir paquetes que van a una cierta parte de la red externa. Como otro ejemplo, uso Netscape para acceder a los archivos de Dilbert. Hay anuncios de doubleclick.net en la página, y Netscape alegremente pierde mi tiempo descargandolos. Diciendo al filtro de paquetes que no permita ningún paquete hacia o desde las direcciones propiedad de doubleclick.net ese problema resuelve (aunque hay maneras mejores de hacerlo).
 

Seguridad:
Cuando su máquina Linux es la única cosa entre el caos de Internet y su agradable, ordenada red, es bueno conocer que puede restringir lo que viene a su puerta. Por ejemplo, usted podría permitir que algo salga de su red, pero podría preocuparse por el muy conocido 'Ping de la Muerte' que llega desde los intrusos malvados. Como otro ejemplo, usted podría no querer que los intrusos hagan telnet a su máquina Linux, aunque todas sus cuentas tengan contraseñas, telnetting de los forasteros a su Linux embala, a pesar de que todas sus cuentas tengan contraseñas; quizá desea (como la mayoría de las personas) ser un observador en la Internet, y no un servidor (en otro caso)--simplemente no permitirle a nadie conectarse, teniendo el filtro de paquetes rechazando los paquetes entrantes que levantan (inician) las conexiones.
 

Vigilancia:
A veces una máquina mal configurada en la red local decidirá arrojar paquetes al mundo externo. Es bueno decirle al filtro de paquetes que le permita saber si algo anormal ocurre, quizás pueda hacer algo, o simplemente quizás, usted es curioso por naturaleza.

Reglas de filtrado
El filtrado de paquetes utiliza la siguiente información que poseen los paquetes para definir las reglas de filtrado:
 


Filtrado por dirección

Esta es la forma más sencilla y más usada para realizar filtrado de paquetes. La restricción del flujo de paquetes se realiza basándose en la dirección origen y/o destino del paquete sin considerar qué protocolo está involucrado.

Generalmente existen tres acciones a tomar con un paquete de red:
 

Aceptar. Indica que este paquete pasó el criterio de filtrado y será reenviado tal como lo hace un enrutador cualquiera.
Denegar. Indica que este paquete no cumple con el criterio de aceptación y será descartado.
Rechazar. Indica que este paquete no cumple con el criterio de acetación y será descartado, pero a diferencia de Denegar, se envía un mensaje ICMP a la máquina origen informado lo ocurrido. Generalmente es un paquete ICMPde destino inalcanzable o destino administrativamente inalcanzable. De esta forma el que envía el paquete es avisado y no tratará de retransmitir el paquete.

Filtrado por Servicio
Este es un tipo de filtrado más complejo y más completo. Este filtrado permite definir reglas basadas en servicios tales como telnet, SNMP, SMTP, etc. El software de filtrado utiliza la información de los puertos, protocolo y tipo que contiene cada paquete para realizar filtrado por servicio.
 
 

El bit ACK de los paquetes TCP permite identificar si se trata de un paquete de solicitud de conexión (donde el ACK no está activado) o si es otro de los paquete de la conexión (donde sí está activado).

De la misma forma un paquete entrante de una conexión telnet saliente posee la siguiente información:
 


Herramientas configuracion firewalls en Unix 

Prácticamente toda computadora Unix es capaz de manejar reglas de firewall. El tener reglas de filtrado de paquetes para determinar a quién se le proporciona cada uno de los servicios añade un muy gran nivel de control a nuestro equipo.

Linux maneja para el filtrado de paquetes diferentes sistemas, dependiendo de la versión de kernel:

    Con la versión 2.0.x o anteriores, el sistema manejado era ipfwadm;
    Con la versión 2.2.x se cambió a ipchains,
    Con la versión 2.4.x se maneja iptables.

Toda nueva versión  soporta la sintaxis de la versión anterior, si bien agrega capacidades suficientemente interesantes para hacer que valga la pena aprender a manejar la propia.
 

Sintaxis de las Reglas de Filtrado para IPCHAINS:

La sintaxis de las reglas de firewall, desafortunadamente, no es tan simple como en la manejada por IPF, disponible para los demás Unixes, o PF, disponible en OpenBSD. Sin embargo, la sintaxis básica es muy simple.

Cuando el código de firewall del kernel está activo, hay tres cadenas principales por las que pasa un paquete: INPUT, OUTPUT y FORWARD. Además de esto, podemos crear cadenas definidas por el usuario.

Para definir a política que seguiremos con los paquetes que nos interesen, definimos reglas sobre cada una de las cadenas. Cada una de estas reglas especifica el criterio para que un paquete sea tratado de diferente manera, e indican cómo será tratado el paquete. Estas reglas pueden tener uno de los siguientes objetivos:
 

ACCEPT
Permite que el paquete pase
DENY
Evita que pase el paquete, soltándolo  -- No avisa al emisor que el paquete fue rechazado.
REJECT
Evita que pase el paquete, pero responde con un mensaje ICMP al emisor indicando que el paquete fue rechazado
MASQ
Sólo es válido para FORWARD y cadenas definidas por el usuario, y cuando el kernel fue compilado con la bandera CONFIG_IP_MASQUERADE. Los paquetes pueden pasar, pero aparentan haberse originado en este servidor y no en quien realmente los envió. Al recibir respuesta, pasa automáticamente por el desenmascaramiento.
REDIRECT
Sólo es válido para INPUT y cadenas definidas por el usuario, y cuando el kernel fue compilado con la bandera CONFIG_IP_TRANSPARENT_PROXY. Causa que un paquete sea ``secuestrado'' y redirigido al puerto y host especificado.
RETURN
Equivale a cuando un paquete llega al final de las reglas y no fue tratado explícitamente -- Será tratado con el objetivo default para esa cadena.
Al definir nuestras reglas podemos agregarlas (-A), eliminarlas (-D), reemplazarlas (-R), y otros varios métodos para los cuales los remito a la página del manual.
Y por último, los parámetros: Definimos cuándo se aplica cada una de las reglas cuando se cumple. Podemos negar uno de estos criterios con !:
 

Parametros Ipchains

-P chain policy. Especifica la politica a seguir por defecto. Las politicas disponibles son las anteriores.
-L [chain]. Lista las reglas. Si se especifica una chain solo lista las reglas de esa chain.
-F [chain]. Borra (Flush) las reglas. Si se especifica una chain solo borra las reglas de esa chain.
-I chain, -A chain. Ambos parámetros tienen la misma sintaxis, y se usan para añadir al principio (Insert) o al final (Append) de la cadena una regla. Esto tiene sentido puesto que las reglas se leen de arriba abajo, y en cuanto se encuentra una regla que coincide con el paquete a procesar, se le aplica y sanseacabó. En caso de no coincidir con ninguna regla, se aplica la politica por defecto de la cadena.

Algunos de  los subparámetros de ipchains son:

-s [!] ip[/mask] [puerto] , -d [!] ip[/mask] [puerto]:  Indica que la regla solo se aplica si la direccion origen (s) o destino (d) del paquete coincide con las suministradas. El ! delante de la IP indica que se aplica si es cualquier IP MENOS esa. Si se desea especificar un puerto, debe usarse tambien la opción -p. Además, se pueden indicar rangos de puertos; por ejemplo, 12:15 indicaría los puertos que van desde el 12 al 15.
-i interface. La regla se aplica a los paquetes que lleguen/salgan por esa interfaz, por ejemplo, eth0.
-j policy. Indica la politica a seguir en esta regla.
-p (-protocol) [!] Especifica el protocolo.
-source-port [!] [puerto[:puerto]]
-d (-destination) [!] dirección[/máscara] [!] [puerto[:puerto]]
-destination-port [!] [puerto[:puerto]]
-icmp-type [!] tipo

Ejemplos

Permitir que las tramas lleguen a mi máquina, todas de mi misma máquina, añado la regla:
    ipchains -I input -j ACCEPT -s 127.0.0.1
Descartar los paquetes que vengan desde 123.34.22.XXX :
    ipchains -I input -j DENY -s 123.34.22.0/255.255.255.0
Denegar TODO acceso al puerto de netbios, menos para la IP 111.222.123.221::
    ipchains -I input -j DENY -p tcp -s ! 111.222.123.221 -d 0/0 139
Bloquea todos los paquetes provenientes de la red 192.168.0.0/24 al puerto de Web (80):
    ipchains -A INPUT -p tcp -s 192.168.0.0/24 -destination-port 80 REJECT
Y el siguiente permite que llegue a este puerto únicamente la computadora 192.168.0.25:
    ipchains -A input -p tcp -s 192.168.0.25 -destination-port 80 ACCEPT
 

Masquerading

El ip masquerading se usa por ejemplo, si tienes una red local en casa, y tienes un modem y quieres que cuando conectas a internet se pueda acceder a internet desde las máquinas de la red local. En dicho caso, linux lo que hace es mapear las conexiones de la red local y salen a internet a traves de la IP que tiene el interfaz que usamos para acceder a internet en la maquina con modem, en este caso, ppp0.

Para hacer esto añadimos la siguiente regla en ipchains, suponiendo que la red local sea 192.168.1.0/0

    ipchains -I forward -j MASQ -s 192.168.1.0/0 -d ! 192.168.1.0/0

En las máquinas de la red local  tendríamos que decirles que el gateway por defecto es la máquina con el modem.
En el kernel debe estar puesto la opción de ip masquerading.
 

Sintaxis de las Reglas de Filtrado para IPTABLES:

Diferencias IPCHAINS - IPTABLES

Diferencias entre ipchains e iptables, podemos nombrar muchisimas,todas ellas tecnicas, pero a nivel usuario solo es necesario saber que las
cadenas ('chains') pre-armadas ahora se tipean en MAYUSCULAS. Por lo que si empezamos a utilizar iptables viniendo de una configuracion ipchains, y no nos acordamos de esta minima diferencia, los resultados que obtengamos no van a ser los que deseamos. O sea, ahora escribimos: INPUT, OUTPUT y FORWARD. Por supuesto, podemos crear nuestras propias chains con el nombre que queramos.

Otras diferencias son:

La sintaxis cambia pero no mucho con respecto a Ipchains
La orden DENY no existe, ahora sería DROP.
Las ordenes MASQ y REDIRECT no existen como destinos de paquetes.
La orden REJECT esta extendida con mas opciones:
    Tiene el mismo efecto que «DROP», excepto que al remitente se le envía un mensaje de error ICMP «port unreachable».

    REJECT también admite un argumento opcional «--reject-with» que altera el paquete re respuesta a usar: vea la página de manual.

La orden LOG  útil para monitorizar y depurar
    Este módulo proporciona un registro de paquetes coincidentes mediante el núcleo. Dispone de estas opciones adicionales:

    --log-level
    Seguido de un número (o nombre) de nivel. Los nombres válidos son (distingue mayúsculas/minúsculas) «debug», «info», «notice», «warning», «err», «crit»,          «alert», «emerg», que corresponden a los números 7 a 0. Vea la página de manual de syslog.conf si necesita una explicación de estos niveles.

    --log-prefix
    Seguido de una cadena de hasta 30 caracteres, que corresponden a un texto que se escribe al comienzo de cada «log» (registro), para permitir que sean     identificados unívocamente.

    Este módulo es más útil junto a un objetivo «limit», de manera que no se inunden los archivos de registro.

Parámetros  IPTABLES

-N: Crear una nueva cadena
-X: Borrar una cadena vacia
-P: Modificar la politica para una cadena pre-armada
-L: Listar las reglas de una cadena
-F: Vaciar las reglas de una cadena
-Z: Resetear los contadores de paquete y byte de todas las reglas de una cadena

Comandos manipulación  reglas de cadenas:

-A: Agregar una nueva regla a una cadena
-I : Insertar una nueva regla en cierta posicion de una cadena
-R: Reemplazar una regla de cierta posicion de una cadena
-D: Borrar una regla a cierta posicion de una cadena

Algunos de  los subparámetros de ipchains son:

-j  target: Destino de un paquete,donde target puede ser ACCEPT, DROP o el nombre de otra cadena definida por el usuario.
-s IP[/BASE]: Origen de un paquete,donde IP es una direccion IP y lo que se encuentra entre corchetes es un parametro OPCIONAL en el que podemos hacer una especificacion por clase. O sea, 192.168.1.0/24, /16 . Tambien la base puede ser otra direccion IP, entonces definimos un rango que comienza en IP y termina en BASE.
-d IP[/BASE]: Destino de RED de un paquete ,al igual que -s, solo que esta regla habla de paquetes generados en NUESTRA red con destino IP[/BASE]).
-p PROTOCOLO (icmp, udp, tcp, etc). Protocolo de un paquete

Muchas de estas opciones pueden estar precedidas de simbolo '!'. Significa que se tomaran los paquetes DISTINTOS de los que especifiquemos. Por
ejemplo, '-s ! localhost' es cualquier paquete que NO VENGA de localhost.O '-p ! icmp' es cualquier paquete que no sea del protocolo ICMP.

Ejemplos

Esencialmente, debemos concentrarnos en saber armar y manipular reglas. Osea, utilizar los comandos -A y -D de iptables. Una regla son las condiciones que debe cumplir un paquete, y que accion realizar con los que las cumplan.

Entonces, la regla basica para filtrar paquetes desde cierta IP:
     iptables -A INPUT -s IP -j accion
Donde accion sera DROP, con lo que esos paquetes seran descartados, o ACCEPT, por lo que esos paquetes seran aceptados en nuestro sistema.

Si creamos una regla, y queremos eliminarla, la mejor forma es simplemente volver a escribir la regla que queremos eliminar, pero reemplazando -A por
-D.
     iptables -D INPUT -s IP -j accion

Filtrar paquetes HACIA cierta IP (o rango, o clase):
     iptables -A OUTPUT -d IP -j accion

Para que nadie pueda hacernos ping:
     iptables -D INPUT -p icmp -j DROP