jueves, 6 de mayo de 2010

Iptables + Ipalias

GNU/Linux es sinónimo de un mundo de posibilidades y en materia de administración de sistemas y servidores la ventaja con respecto a otros sistemas es muy significativa. Las distribuciones linux nos abren a los administradores, fanáticos y geeck un mundo de posibilidades limitado -casi únicamente- por nuestras habilidades....


Iptables + Ipalias es una de esas soluciones que engrosa la lista de lo antes comentado... Por qué ? ... Pues veamos.


Ya en una entrada anterior comente sobre iptables y sus bondades (aquí el articulo) pero ahora propongo ir un poco mas allá mostrando su uso con Ipalias...


En palabras muy sencillas se puede decir que ipalias es una implementación que nos permite configurar múltiples direcciones ip para una sola interfaz, de esta manera podemos hacer una suerte de virtualización (o simulación) de contar con mas interfaces de red.


Esta es una idea útil -en redes caseras o pequeñas- para realizar la implementación de un firewall y aumentar la seguridad, incluso la podemos utilizar para levantar maquinas virtuales que se conecten a internet.


Como ????


La verdad es que es un procedimiento sencillo, lo que debemos hacer primera mente es verificar haciendo uso de un ifconfig las interfaces disponibles y su nomenclatura ante el sistema...


# ifconfig


El resultado en un entorno de trabajo normal seria semejante al que muestro a continuación:


eth0    Link encap:Ethernet  HWaddr 08:00:46:16:BA:D0
          inet addr:192.168.0.103  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:46ff:fe16:bad0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:11889 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11310 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:8460330 (8.0 MiB)  TX bytes:1362059 (1.2 MiB)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:141 errors:0 dropped:0 overruns:0 frame:0
          TX packets:141 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:13091 (12.7 KiB)  TX bytes:13091 (12.7 KiB)



Aquí podemos ver que nuestro sistema cuenta con una tarjeta de red (eth0) y el loopback (lo) configurados - Configuración que lo normal -


Habilitar el ipalias es muy sencillo basta con ir al archivo de configuración de las interfaces en nuestra distro (/etc/network/interfaces) y agregar una interfaz con la misma nomenclatura de la que tenemos pero seguida de dos puntos (:) y un identificador.... Así:


auto eth0:1


Los demás detalles de como configurar la interfaz para recibir DHCP o Ip estática los podemos encontrar aquí


Una vez configurada la segunda dirección ip para la interfaz lo que debemos hacer es habilitar el ruteo de paquetes, para ello, cambiamos el valor del archivo que confirgura esta acción en el Kernel:


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


Ya teniendo el reenvio de paquetes, lo que nos queda simplemente es indicar al kernel como debe realizar el reenvio y para esto usamos Iptables....



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



La primera de las instrucciones hace un flush para limpiar posibles reglas anteriores de enmascaramiento .... y la segunda por su parte enmascara todos los paquetes que entren y salgan de eth0.


Listo, ahora lo que tenemos que hacer es configurar los host que queremos estén detrás del firewall, para ello podemos seguir este post.


Hay que tener ya que debemos asignar a los host tras el firewall una ip del rango de eth0:0 (interfaz virtual), además, tenemos que configurar que el gateway de estos apunte a la ip de la interfaz eth0:0

martes, 4 de mayo de 2010

Introducción a las Iptables -Entendiendo las Reglas-

iptables permite al administrador del sistema definir reglas acerca de qué hacer con los paquetes de red. Las reglas se agrupan en cadenas: cada cadena es una lista ordenada de reglas. 
 
Las cadenas se agrupan en tablas: donde cada tabla está asociada con un tipo diferente de procesamiento de paquetes.
 
Cada regla especifica qué paquetes la cumplen (match) y un destino que indica qué hacer con el paquete si éste cumple la regla. Cada paquete de red que llega a una computadora o que se envía desde una computadora recorre por lo menos una cadena y cada regla de esa cadena se comprueba con el paquete. Si la regla cumple con el datagrama, el recorrido se detiene y el destino de la regla dicta lo que se debe hacer con el paquete. Si el paquete alcanza el fin de una cadena predefinida sin haberse correspondido con ninguna regla de la cadena, la política de destino de la cadena dicta qué hacer con el paquete. Si el paquete alcanza el fin de una cadena definida por el usuario sin haber cumplido ninguna regla de la cadena o si la cadena definida por el usuario está vacía, el recorrido continúa en la cadena que hizo la llamada (lo que se denomina implicit target RETURN o RETORNO de destino implícito). Solo las cadenas predefinidas tienen políticas.
Bueno, ya tenemos las bases, ahora vamos a la practica....

Primero lo primero....

veamos como esta configurado nuestro iptales...

# iptables -L

El parametro -L lista las reglas que actualemente tenemos

Bien, ya sabemos nuestras reglas, hagamos un cambio sencillo, convirtamos nuestro equipo en un agujero negro algo asi como /dev/null

# iptables -P OUTPUT DROP

Con esto lo que hemos hecho es modificar la politica por defecto de todo el trafico saliente, y esto incluye aquel que no avandona la maquina por eso se afecta nuestro localhost... podemos probar esta regla simplemente haciendo un ping al localhost y/u otra dirección

Ahora, esto no es lo mas optimo... lo que hemos hecho, es incluso superior a desconectar nuestro cable de red.... asi que mejor coloquemos todo como estaba si....

# iptables -P OUTPUT ACCEPT

-P = nos permite modificar las politicas por defecto, estas pueden ser ACCEPT o DROP, con este especificamos si vamos a tener un firewall abierto o cerrado.

Creando nuestras primeras reglas...

Primero que nada una prueba, has ping al localhost.... hay trafico ???? bien vamos a cerrarlos, para ello simplemente ejecutamos:

# iptables -A input -i lo -j drop

Listo, ahora nuevamente un ping a localhost.... No funciona... Hummm probemos con un ping a otra pag... google.com funciona ?????

Ahora bien, Localhost es un lugar de pruebas útil, por lo que tenerlo cerrado no es la mejor de las ideas, vamos a restaurar todo, para ello ejecutemos:

# iptables -D input -i lo -j DROP

-A = Agregar una regla a la Iptables
-D = Eliminar una regla de la Iptables
-i = identifica el dispositivo objeto de la regla
-j = identificamos que vamos a hacer con el trafico que coincida con la regla

Pero esto es solo una pequeña muestra de lo que es posible hacer con iptables, en lugar de especificar un dispositivo, podemos ser mas detallados y aplios (por contradictorio que suene si es asi) al indicar protocolos y puertos como targets, pero mejor veamos una prueba...

Primero que nada ubiquemos otra maquina y probemos que podemos conectarnos vía ssh con ella:

$ ssh usuario@equipo

indicamos la contraseña para el usuario cuando el sistema nos lo solicite y listo, si todo va bien estamos dentro del otro equipo si.... bueno dejemos esa session alli..


ahora si, a lo que vamos, apliquemos una regla de iptables para el ssh:

# iptables -A INPUT -p tcp --sport 22 -j DROP

listo, bien.... Regresemos a nuestra consola con el ssh y probemos ejecutar cualquier comando, listemos archivos por ejemplo (ls)...

Que ocurrio ???? Tienes alguna idea ????

retornemos a la segunda consola (la que manejamos para iptables) y ejecutemos ahora:

# iptables -A INPUT -p tcp --sport 22 -j DROP

vamos a la consola con la sesion ssh y ejecutemos otro comando... que ocurre ????

Nota: el resultado puede verse afectado si hemos tardado mas de 1 minuto para ejecutar los pasos...

Entendamos la cosa: En este ejemplo hemos cerrado el trafico entrante (INPUT) del protocolo ssh, especificado el target de la regla con el -p (protocolo) + el --sport (puerto Origen), de esta misma forma, también es posible aplicar reglas para el trafico saliente (OUTPUT) y para cualquier otro servicio...

Con iptables, tambien es posible crear reglas que atiendan las direcciones de los paquetes, como ??? veamoslo de la manera mas sencilla... Un ejemplo:

Abramos un navegador y vallamos a la pagina mas usada en la actualidad google.com Si tenemos habilitadas las políticas por default's seguro tendremos acceso y nuestra pagina cargara.

Ahora, vamos a la terminal y cerremos el trafico a google:

# iptables -A OUTPUT -p tcp -d google.com --dport 80 -j DROP

Bien, regresa al navegador e intenta nuevamente acceder a google.com, funciona ????

Lo que hemos hecho es especificar una regla que descarta el trafico tcp saliente (OUTPUT) destinado (-d) al servidor google.com específicamente al puerto 80 (--dport 80), pero ocurre que esta regla no afecta a otro trafico similar destinado a otro servidor...

Es importante recordar, que estas reglas se van a mantener mientras dure la sesion actual salvo que elimines la regla, algo que ya hemos hecho antes y que estoy seguro puedes hacer tu solo verdad....

Con Iptables no solo es posible especificar reglas para descartar paquetes, podemos tambien llevar registros sobre el sistema los cuales se almacenaran en el /var/log/messages. Para habilitar reglas que habiliten la escritura en el registro lo que debemos hacer es especificar el -j LOG en la regla.

Veamos estas reglas en un ejemplo... Supongamos que queremos llevar un registro de conexiones a nuestro ssh, para ello ejecutamos:

# iptables -A INPUT -p tcp --dport 22 -j LOG

bien, ahora vamos a otra maquina y realicemos una una conexión ssh al sistema al cual le aplicamos la regla.... y listo, nuestro acceso ha quedado registrado...

Podemos aplicar esta regla a cualquier servicio o dispositivo, solo tenemos que tomar en cuenta que por cada transaccion que se este ejecutando al aplicar la regla de esta forma varias lineas se estan agregando en el log del sistema y esto puede no ser lo mas optimo, por ello, vamos a mejorar esta regla.

Veamos el registro en LOG para el servicio FTP...

# iptables -A INPUT -p tcp --dport 21 -j LOG

Una linea igual a la que ya habíamos introducido antes pero que nos registra los accesos a FTP, al igual que el caso anterior, nos generaría muchas lineas en el log por cada conexión... y además nos da la oportunidad de ir mas allá si no tenemos un FTP montado en nuestro sistema....

Si no contamos con un servidor ftp en nuestro sistema ejecutemos dmesg y veamos la ultima linea, la entienden.... El servicio de ftp también nos permite ver lo que ocurre si no somos lo suficientemente específicos al crear una regla de almacenamiento en log, una linea como la especificada en un acceso generaría cantidad de lineas que no son para nada útiles en un log (lo hacen muy largo y tortuoso de leer y no es la idea).

Lo ideal es que se registre el cliente una sola vez y no cada vez que este gestione un paquete, para lograr esto, lo que tenemos que hacer es considerar el comienzo del segmento de la conexion ya que este tiene activo el Flag SYN.

Al hacer esto, la linea queda así:

# iptables -­A INPUT -­p tcp --­­dport 21 --­­tcp-­flags ALL SYN -­j LOG

Nota: se debe eliminar la linea anterior.... (# iptables -D INPUT -p tcp --dport 21 -j LOG)

Pero como no tenemos un FPT activo en nuestra maquina no veremos nada.... salvo la misma alerta en nuestro dmseg y esta no es la idea... para poder ver como funciona la linea, vamos a quitarla y a cambiarla por una que nos registre cada vez que nos conectamos a ftp...

# iptables -A OUTPUT -p tcp --dport 21 --tcp-flag ALL SYN -j LOG

Lo primero que tenemos que notar es que cambiamos la regla para crear una entrada en log para la salida de paquetes... Ahora probamos la linea conectandonos a un ftp (ftp://debian.org -p.e-) y luego mirando el log de iptables.... Mejor verdad...

lunes, 3 de mayo de 2010

Otra alternativa para cambiar fondos -GNOME-

Una de las grandes ventajes del usar software libre es que contamos con multitud de paquetes para realizar una misma funcion, pero cada uno de ellos tiene sus caracteristicas propias y se adapta a los gustos y nocesidades de cada quien.

Ya anteriormente había comentado algunas opciones sobre paquetes para hacer los cambios automáticos de escritorios en Gnome (Wallpaper-tray, Drapes) pero me veo en la obligación de un nuevo articulo ya Gbackground tiene algunas particularidades que hacen necesario que lo comente:

1.-  El desarrollador del paquete es un conocido de la comunidad en venezuela....

2.-  Puedo configurar los intervalos de cambio en segundos (no en minutos como las opciones ya comentadas)

3.- No es que las opciones anteriores fueran pesadas, pero Gbackground realmente ni se nota en nuestro equipo.

El paquete en debian, se encuentra en los repositorios, por lo que para instalarlo basta simplemente con ejecutar:

# aptitude install gbackground

Aunque tambien se pude bajar de la pagina del proyecto:

 http://www.mogaal.com/gbackground

Iniciarlo es realmente muy sencillo solo hay que ejecutar gbackground y listo, incluso si queremos que inicie con nuestro sistema simplemente lo añadimos a las aplicaciones al inicio.