Filtrado de
Paquetes
Necesidad
Filtrado de Paquetes
Reglas de Filtrado
Sintaxis Reglas
de Filtrado IPCHAINS
Sintaxis Reglas
de Filtrado IPTABLES
Masquerading
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.
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
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».
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