Registrar información más detallada en el log de exim

Exim va escribiendo en un archivo de log todas las peticiones de conexión que se realizan al servidor. Quedan registradas las IP’s, emails, y las sesiones que se crean y se cierran, así como si la conexión ha sido correcta o ha habido algún error. En general, es información más que suficiente. Aún así hay algo que no se guarda en el log y que puede sernos útil. En concreto, vamos a ver cómo guardar también un registro de los emails eliminados, o movidos de carpeta. Vamos allá:

El fichero en el que queda registro de toda actividad, en mi caso es /var/log/maillog y tiene una pinta parecida a esta:

Sep 11 11:37:06 servername dovecot: imap-login: Login: user=<user@example.com>, method=PLAIN, rip=123.456.789.123, lip=123.456.789.123, mpid=9007, TLS, session=<QVpx3dfsC1DU>

Sep 11 08:25:03 servername dovecot: pop3(user@example.com): Disconnected: Logged out top=0/0, retr=2/41769, del=1/47, size=15946098, bytes=50/43374

Sep 11 08:45:10 servername dovecot: imap(user@example.com): Logged out in=409, out=1405, bytes=409/1405

En la primera linea, el usuario se ha conectado y muestra la IP remota (rip), la IP local (lip), así como el tipo de conexión (TLS) y el identificador de la sesión al final. También nos indica que ha sido una conexión usando imap.

En la segunda línea, el usuario se ha desconectado de su sesión, su conexión era de tipo pop3 y hay un parámetro, que he resaltado en negrita que dice del=1/47. Esto nos indica que durante la sesión, ese usuario ha borrado 1 mensaje de los 47.

En la tercera linea, también se han desconectado de una sesión, en este caso imap, pero ahí sólo aparece los bytes que se han recibido/enviado (in/out) durante la conexión.

Para detallar más el log, hay que activar el plugin MailLog de exim. Esto nos dará detalles sobre los emails eliminados, movidos de una carpeta a otra, ¡perfecto!

Lo primero es editar el fichero de configuración de devecot

nano /etc/dovecot/dovecot.conf

Y buscaremos la linea que contiene mail_plugins, y añadiremos los plugins mail_log notify. En micaso quedará así

mail_plugins = quota quota_clone mail_log notify

Luego, buscaremos dentro de ese mismo fichero el apartado de Plugin settings y deberemos escribir estas lineas:

##
## Plugin settings
##

plugin {

  # Events to log. Defined in src/plugins/mail-log/mail-log-plugin.c - also available: flag_change save mailbox_create
  mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename

  # Also available: Defined in src/plugins/mail-log/mail-log-plugin.c - flags vsize from subject
  mail_log_fields = uid box msgid size
  (...)

Ya está, sólo tendremos que reiniciar el servicio

/etc/init.d/dovecot restart

Ahora, si borramos o movemos un email dentro de nuestro cliente de correo, quedará detallado en el log. Se verá algo así:

Sep 13 11:46:02 servername dovecot: imap(user@example.com): copy from INBOX: box=INBOX.Trash, uid=1433, msgid=<abc.123@example.com>, size=3143

Sep 13 11:46:02 servername dovecot: imap(user@example.com): expunge: box=INBOX, uid=4750, msgid=<abc.123@example.com>, size=3143

Sep 13 11:46:16 servername dovecot: imap(user@example.com): delete: box=INBOX.Trash, uid=1433, msgid=<abc.123@example.com>, size=3143

Eso sí, contad conque el log aumentará considerablemente de tamaño cada día.

Un saludo!

Localizar enlaces rotos con wget

Ahí van un par de comandos que te ayudarán a localizar los enlaces rotos de una web tales como imágenes que ya no existen, enlaces que nos llevan a un error 404, o archivos css que no están donde deberían. Sólo haremos uso del comando wget, para identificarlos de la siguiente manera:

wget --spider -r -l 5 -nd -nv -w 5 -o output.log http://example.com

Los parámetros del comando hacen lo siguiente:

  • –spider , no almacena nada, tan sólo actúa como si de un bot de Google se tratara.
  • -r , lo hace de manera recursiva, es decir, de cada página, buscará los links que existan para seguirlos y continuar
  • -l 5 , esto seguirá recursivamente hasta 5 niveles de links (podemos omitirlo, wget por defecto usa -l 5)
  • -nd , no creará los directorios en local al escaner la web
  • -nv , hará que no muestre nada por pantalla (lo estamos almacenando en output.log)
  • -w 5 , hará que wget espere 5 segundos entre cada petición, útil si quieres que tu servidor web no quede saturado durante el proceso
  • -o output.log , guardará todo el registro de la actividad en un fichero llamado output.log
  • http://example.com , la web que queremos auditar

Una vez haya terminado wget, podremos abrir el fichero ouput.log, para ver los resultados. Para localizar los enlaces rotos fácilmente, podemos usar grep de la siguiente manera:

grep "broken link!" -B1 output.log

Las opciones que aquí tenemos son:

  • «broken link!» , la cadena de texto a buscar, en este caso filtramos por los enlaces rotos. Si usas wget en otro idioma, quizás necesitarás filtrar por otra palabra.
  • -B1 , mostrará la linea que contiene la cadena buscada y justo la anterior (Before 1)
  • output.log, el fichero en el que vamos realizar la búsqueda

Con este sencillo proceso, podremos obtener un listado de enlaces rotos que nos ayudará a localizar problemas en cualquier web.

Uso práctico de GPG: cifrando y descifrando archivos

GPG es el acrónimo de GNU Privacy Guard, un sistema de cifrado de código abierto. Los usos más populares vienen de la mano de envío de emails cifrados o con firma digital, pero hoy vamos a ver cómo cifrar (que no encriptar) un archivo cualquiera, para poder enviarlo asegurándonos de que nadie más que el destinatario va a poder recibirlo. Eso sí, tanto remitente como receptor, deben conocer la clave de cifrado.

Cifrar un archivo

He creado un archivo de texto plano, en el que he escrito un mensaje.

user@my-laptop:~$ cat mi-archivo.txt
Shhhh... Este es un mensaje secreto...

Para cifrarlo, sólo tendremos que hacer lo siguiente:

user@my-laptop:~$ gpg -c mi-archivo.txt 
Enter passphrase: <poner aquí cualquier clave>
Repeat passphrase: <repetir aquí la misma clave>

El archivo cifrado se llamará igual que el original, pero añadiendo la extensión .gpg. Esto genera un archivo llamado, en mi caso, mi-archivo.txt.gpg. Veamos qué contiene:

user@my-laptop:~$ cat mi-archivo.txt.gpg
/�4G��`�H��J%,����0�er�]�&
>�^�*�[�s���(^���=SoUDZ��-y��pV>�4bˑE��=H

Perfecto, listo para enviar sin preocuparnos de nuestra privacidad.

Cabe decir, que es un buen sistema para guardar información (imágenes, backups, o cualquier archivo) de manera segura en servicios en la nube poco securos como Dropbox o Google. Si por algún motivo olvidas la contraseña, puedes olvidarte de recuperar el contenido.

Cómo descifrar el archivo

Descifrarlo es, si cabe, aún más facil que cifrarlo. Veamos como descifrar el arhivo de antes:

user@my-laptop:~$ gpg mi-archivo.txt.gpg 
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
Enter passphrase: <usar la misma clave de antes>
user@my-laptop:~$ cat mi-archivo.txt
Shhhh... Este es un mensaje secreto...

Yuhuuu! ya lo tenemos de vuelta 🙂

Cómo recuperar un archivo eliminado por SVN si usas Eclipse

Si has llegado hasta este post, es más que probable que hayas sufrido la pérdida de un archivo y quieras recuperarlo, así que ármate de paciencia (y suerte).

El otro día estaba yo tan alegre trabajando con mi Eclipse escribiendo en PHP cuando pensé: «Ahora es el momento de hacer un Commit». Así que lo hice.

Lo normal es que al hacer un Commit, el SVN gestione los archivos correctamente y todo se sincronice sin problemas ni conflictos con los ficheros modificados y acabe almacenándose como una modificación válida en un lugar seguro. Pero claro, cuando más de una persona toca el mismo fichero, es más que probable que eso empiece a dar problemas. Yo, perdí prácticamente todo el día de trabajo 🙁

Investigando por internet (no sé exactamente dónde) Gracias a la inestimable ayuda de Dani Bru, que encontró por internet el nombre de un directorio mágico donde se guardan backups automáticos, nos pusimos manos a la obra. Yo pensé, «ya… claro!» No tenía ninguna esperanza, pero era la única pista que tenía para ecuperar lo que se había perdido y estos son los pasos que dí para poder recuperarlo.

Por lo visto, además de la copia remota que se genera al hacer un Commit, en algún lugar oculto de la estructura de directorios que crea Eclipse en local (directorios ocultos y demás cosas), va guardando copias de (al menos) el estado anterior al Commit.

Primer paso

Abrimos el terminal y escribimos:

pedro@pedro-laptop:~$ updatedb

Es posible que tarde algunos segundos, especialmente si nunca antes lo habías ejecutado. Este comando actualiza el índice de directorios del sistema. De manera que en el siguiente paso nos permitirá realizar una búsqueda de manera más precisa. Cuando acabe el comando, no dará ningún mensaje, tan solo nos devolverá el control del terminal.

Segundo paso

Realizamos la búsqueda de la cadena org.eclipse.core.resources, que al parecer es el directorio mágico que puede salvarnos la vida (bueno, el día).

pedro@pedro-laptop:~$ locate org.eclipse.core.resources | grep history
/some/path/to/org.eclipse.core.resources/.history/24/109601fa0cd800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/24/e077e68009d7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/25/9095cb8d2bd7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/26/40fa905e2bd7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/27/80aeb1582bd7001017b898f7b25b1cbb
/some/path/to/org.eclipse.core.resources/.history/2a/20efb2cb11d800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/2a/80914b200ed800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/2d/f0acb5240fd800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/3/e060608410d800101a3dcfaf52c523eb
/some/path/to/org.eclipse.core.resources/.history/32/a0a33f8f0ad80010160af0d88658fae4
/some/path/to/org.eclipse.core.resources/.history/34/60374f474bd60010182b9a1ddb7c2773
/some/path/to/org.eclipse.core.resources/.history/34/c04a901b4ad60010182b9a1ddb7c2773
/some/path/to/org.eclipse.core.resources/.history/36/c0d19b430bd80010160af0d88658fae4
(…)

Tercer paso

Entramos en el directorio que haga referencia al proyecto que queremos recuperar información. Más concretamente en el directorio oculto .history. Yo en este ejemplo, buscaré algo del directorio android, en el que estoy trabando:

pedro@pedro-laptop:~$ cd /home/pedro/workspace/android/.metadata/.plugins/org.eclipse.core.resources/.history/
pedro@pedro-laptop:~$ ls
0 13 1c 2 24 28 2f 33 38 41 48 4e 52 60 6a 71 7a 7f 84 88 9 9b a3 a9 af b2 b6 be c2 c7 ce da e6 ec f f3 fd 1 16 1d 20 25 2a 3 34 3a 43 49 5 57 61 6e 72 7b 8 85 89 91 9d a4 ab b b3 b7 c c3 c8 d2 db e7 ed f0 f7 10 17 1e 22 26 2b 30 36 3c 44 4a 50 59 63 6f 75 7d 81 86 8a 94 9f a5 ad b0 b4 b8 c0 c5 ca d7 e2 e8 ee f1 f9 12 18 1f 23 27 2d 32 37 3d 45 4c 51 5f 64 7 77 7e 83 87 8d 97 a0 a8 ae b1 b5 b9 c1 c6 cd d9 e3 ea ef f2 fc

Cuarto paso

Al hacer ls, veremos un montón de directorios con nombres de dos caracteres, sin ningún tipo de orden aparente. Al menos, yo no se lo encontré, pero podemos ordenarlos por fecha de modificación con el siguiente comando:

pedro@pedro-laptop:~$ ls -tlahr

Ese comando listará los directorios de más antiguo a más actual. Por lo tanto, sólo deberemos revisar el contenido de los directorios de el más nuevo al más antiguo (de abajo a arriba). Es posible que algunos estén vacíos, pero otros contendrán archivos con nombres que parecen un hash MD5. La única manera de saber el contenido de estos ficheros es editándolos. Veamos cómo:

pedro@pedro-laptop:~$ cd e2
pedro@pedro-laptop:~$ ls -lah
total 20K
drwxr−xr−x   2 pedro pedro 4.0K 2011-09-06 00:30 .
drwxr−xr−x 147 pedro pedro 4.0K 2011-09-06 00:54 ..
−rw−r−−r−−   1 pedro pedro 1.9K 2011-09-06 00:27 1036c7a60ed800101a3dcfaf52c523eb
−rw−r−−r−−   1 pedro pedro  824 2011-09-04 21:14 108c03632ad7001017b898f7b25b1cbb
−rw−r−−r−−   1 pedro pedro 1.3K 2011-09-04 21:25 505f6baf2bd7001017b898f7b25b1cbb

pedro@pedro-laptop:~$ gedit * &

Ahora sólo queda examinar los ficheros para comprobar si este es el directorio que contiene los ficheros que hemos perdido. Si este no es, prueba con el anterior de la lista.

Si tienes algo de suerte, es posible que encuentres lo que necesitas. Yo la tuve y recuperé el trabajo del día. 😀

Suerte y gracias a Dani que hizo que la historia tuviera un final feliz!

Gtk-WARNING **: Locale not supported by C library

Hace ya algunos días que estoy usando Ubuntu 11.04, aunque es una versión beta, funciona muy bien… sólo hay dos cosas que me han hecho perder algo de tiempo mirando por internet cómo solucionarlo. Una de ellas, es un pequeño warning muy molesto que aparece cada vez que lanzo una aplicación gráfica desde el terminal. El error es el siguiente:

pedro@pedro-laptop:~$ ./cualquier-aplicacion

(process:10945): Gtk-WARNING **: Locale not supported by C library.
Using the fallback ‘C’ locale.

Esto me ha pasado por haber instalado el sistema operativo en inglés en_US, utilizando un teclado en español es_ES. Así que me puse a investigar cómo solucionarlo y siguiendo los siguientes pasos, he conseguido resolverlo:

Lo primero de todo, abrimos un terminal, nos hacemos root y vamos al directorio /var/lib/locales/supported.d/.

pedro@pedro-laptop:~$ sudo su
root@pedro-laptop:/home/pedro# cd /var/lib/locales/supported.d/
root@pedro-laptop:/var/lib/locales/supported.d# ls -lah
drwxr−xr−x 2 root root 4,0K 2011-04-25 20:00 .
drwxr−xr−x 3 root root 4,0K 2011-04-13 12:48 ..
−rw−r−−r−− 1 root root  270 2011-04-10 15:16 en
−rw−r−−r−− 1 root root   36 2011-04-25 20:09 local

Allí, en mi caso, existe un archivo llamado en y otro llamado local. Vamos a añadir manualmente el locale es_ES en un archivo llamado es, de la siguiente manera:

root@pedro-laptop:/var/lib/locales/supported.d# echo ‘es_ES.UTF-8 UTF-8’ > es

Comprobamos que se ha añadido bien haciendo un cat:

root@pedro-laptop:/var/lib/locales/supported.d# cat es
es_ES.UTF-8 UTF-8

Ahora añadiremos al locale es_ES en el fichero de locales por defecto. Para ello sólo tenemos que editar el archivo local y poner en la primera línea el locale que nos interesa, de modo que en mi caso queda de la siguiente manera:

root@pedro-laptop:/var/lib/locales/supported.d$ cat local
es_ES.UTF-8 UTF-8
en_US.UTF-8 UTF-8

Y ya está, ahora solo tenemos que reconfigurar el paquete de locales, para que lo reconozca:

root@pedro-laptop:/var/lib/locales/supported.d# dpkg-reconfigure locales
Generating locales…
en_AG.UTF-8… up-to-date
en_AU.UTF-8… up-to-date
en_BW.UTF-8… up-to-date
en_CA.UTF-8… up-to-date
en_DK.UTF-8… up-to-date
en_GB.UTF-8… up-to-date
en_HK.UTF-8… up-to-date
en_IE.UTF-8… up-to-date
en_IN.UTF-8… up-to-date
en_NG.UTF-8… up-to-date
en_NZ.UTF-8… up-to-date
en_PH.UTF-8… up-to-date
en_SG.UTF-8… up-to-date
en_US.UTF-8… up-to-date
en_ZA.UTF-8… up-to-date
en_ZW.UTF-8… up-to-date
es_ES.UTF-8… done
Generation complete.

Fin del problema! Ya no veremos más el molesto Gtk-WARNING 😀

Dropbox: Ahora hasta 10Gb gratis!

[30-sep-2010] UPDATE!! Ahora te duplican el espacio si eres estudiante, visita http://db.tt/edu e indica tu correo electrónico con extensión .edu y a disfrutar de hasta 20Gb!! 😀

Ríos de tinta se han escrito sobre esta genial herramienta: Dropbox. Para el que todavía ande un poco despistado os contaré qué hace este software. Se trata, a mi parecer, del más sencillo sistema de sincronización de archivos en la nube: eso que está tan de moda que ahora llaman cloud computing.

Personalmente utilizo Dropbox para:

  • Hacer backups automáticos de cosas importantes.
  • Compartir archivos (música, fotos, videos, documentos de texto, etc..) con mis amigos mediante un enlace.
  • Enviar archivos de gran tamaño directamente al disco duro de otros usuarios de Dropbox.
  • Restaurar copias de archivos antiguos. Algo así como el Time Machine de Apple, pero en la nube.
  • Generar documentos colaborativos. Un archivo compartido que cada usuario modifica cuando lo necesita.
  • Si cambias de PC o formateas no pierdes información. Sólo instalando Dropbox tendrás de nuevo todos los ficheros que hayas elegido.

Además, el programa te permite disponer de los archivos que quieras en cualquier ordenador (o dispositivo) del mundo en el que tengas instalado Dropbox!! Incluso entre distintos usuarios si compartes carpetas!! Y lo mejor es que puede utilizarse en Linux, Mac, Windows, Android, Blackberry, iPhone, iPad o simplemente a través de la web. Y con una capacidad de hasta 10Gb totalmente gratis. Empiezan ofreciéndote 2Gb, que se incrementa en +250Mb cada vez que invitas a algún amigo.

Cada vez que quieras compartir un documento o foto sólo tienes que copiarlo en tu carpeta Dropbox y aparecerá como por arte de magia, en todos los ordenadores en los que tengas Dropbox instalado. También podemos obtener un enlace que si lo enviamos a cualquier persona, podrá descargar el archivo sin que sea usuario de Dropbox. Otra funcionalidad que nos ofrece es poder recuperar versiones antiguas de ficheros que ya han sido modificados. Pudiendo restaurarlo en cualquier fecha, incluso si el fichero ya ha sido borrado de tu disco duro.

Lo mejor es que lo pruebes tú mismo y veas lo útil que resulta.

Para instalarlo, es tan sencillo como registrarse aquí introduciendo tus datos (el email es importante que sea válido). ¡Recuerda los datos introducidos porque luego los necesitaremos!

Tras registrarte comenzará automáticamente la descarga del programa. Al acabar, deberás instalar haciendo doble clic en el archivo para instalarlo.

Una vez instalado, preguntará si queremos crear una cuenta nueva o utilizar una existente. Haremos clic en utilizar una cuenta existente y después en Siguiente (Next).

Es en este paso donde rellenaremos el campo email y password con los datos que hemos utilizado al principio.

Nos preguntará qué tipo de cuenta queremos, en la mayoría de casos, al menos al principio para probarlo, utilizaremos la cuenta gratuita. Así que seleccionamos la primera opción, que nos ofrece 2Gb para empezar.

Para finalizar la instalación, nos pregunta si queremos añadir un acceso directo en el escritorio (por defecto viene marcado) y si queremos modificar la ubicación de la capeta Dropbox, que por defecto será Mis Documentos, hay que seleccionar la opción marcado en rojo.

Y ya tenemos el programa listo para usar. Una gran herramienta que desde hace más de un año se ha convertido para mi en imprescindible. Ahora es más fácil que nunca tener todos los documentos de la universidad en cualquier ordenador sin tener que cargar con un pendrive a todos lados. O subir los videos de las vacaciones para que cualquiera que queramos pueda descargarlo con un enlace (es mejor que megaupload!!!).

Fragmentación IP

La fragmentación IP es una técnica utilizada para dividir los datagramas IP en fragmentos de menor tamaño. Ésto es necesario ya que cuando los datagramas IP viajan de un lugar a otro, éstos pueden atravesar diferentes tipos de redes y el tamaño máximo -llamado MTU– de estos paquetes puede variar dependiendo del medio físico utilizado para la transmisión.

El valor máximo que técnicamente puede utilizarse para un datagrama IP es de 65536 bytes, aunque en la práctica se utilizan otros tamaños mucho más pequeños:

  • Ethernet: 1518 bytes (típicamente 1500 bytes).
  • PPPoE: 1492 bytes.
  • ATM: 8190 bytes.
  • FDDI: 4470 bytes.
  • PPP: 576 bytes.

Veamos cómo funciona esta técnica con más detalle. La cabecera IP, que suele tener un tamaño de 20 bytes, contendrá la siguiente información:

  • Identificador de fragmento. Cada Fragmento debe asociarse con un único identificador para que el reensamblaje en destino pueda realizarse correctamente.
  • Información sobre la posición en el paquete final.
  • Información sobre el tamaño de los datos que se transportan en el fragmento.
  • Cada fragmento debe contener el bit MF (More Fragments) para saber si el fragmento actual es el último o no.

Así que la figura de un paquete de máximo tamaño que no necesite fragmentación en una red típica Ethernet sería algo así:

Paquete de 1500 bytes
Paquete de 1500 bytes

Si sumamos la cabecera y los datos encapsulados, tenemos que en total hacen 1500 bytes, por lo que al viajar por una red Ethernet, no sería necesaria su fragmentación.

Los datos encapsulados pueden ser tanto un protocolo IP como TCP, UDP o ICMP. Veamos un ejemplo en el que se tenga que utilizar la fragmentación. Este es un ejemplo anormalmente grande, pero en el que podremos ver cómo se realiza el proceso de fragmentación. Se trata de una petición echo que pasa por una red Ethernet con MTU de 1500 bytes.

Proceso de fragmentación de un paquete de 4028 bytes
Proceso de fragmentación de un paquete de 4028 bytes

En el paquete original, la suma de las cabeceras y los datos ICMP suman 4028 bytes. Este paquete al ser transmitido en una red Ethernet deberá ser fragmentado, generandose así 3 paquetes de 1500 bytes o menos. Cada fragmento llevará obligatoriamente al menos la cabecera IP (necesaria para saber hacia dónde se dirige el fragmento), que en este caso ocupa 20 bytes, así que tendremos realmente 1480 bytes útiles.

El primer fragmento contendrá la Cabecera IP + la cabecera ICMP + la información restante para llegar a 1500 bytes, en este caso 1472 bytes. Puesto que es el primer fragmento, el valor de Offset valdrá 0 y el bit MF valdrá 1 ya que hay más paquetes.

El segundo fragmento contendrá la Cabecera IP + la información restante para llegar a 1500 bytes, en este caso 1480. Ahora el valor de Offset valdrá 1480, ya que es la posición que debe ocupar al ensamblar el fragmento (recordemos que el primer fragmento tenía 8+1472 = 1480). El bit MF valdrá 1 ya que no es el último paquete.

El tercer fragmento contendrá la Cabecera IP + la información restante, en este caso 1048 bytes (ya no hay más bytes). El valor de Offset valdrá 2960, ya que el primer y segundo fragmento ocupaban 1480 cada uno. El bit MF se establece a 0 porque es el último fragmento del paquete.

El campo Protocol sólo indica a qué tipo de protocolo corresponde el paquete original. ID fragmento indica un identificador que será igual para todos los fragmentos del paquete original, así se podrá reconstruir en destino sin confusión. El bit MF (more fragments) se establecerá a 1 siempre, excepto para el último paquete, que será 0. El Offset nos indica la posición que ocupa cada fragmento dentro del paquete original. El campo Tamaño, simplemente registra el tamaño del fragmento actual sin contar la Cabecera IP.

Una vez conocemos a grosso modo cómo funciona esto de la fragmentación, explicaré por encima, cómo un usuario malintencionado puede utilizar este procedimiento para realizar un ataque.

El ataque más conocido que explota la fragmentación IP se llama Teardrop. Este ataque usará información falseada en los fragmentos para poder confundir el reensamblaje en destino y colapsar así el sistema.

Imaginemos que tenemos un MTU de 512 bytes y un paquete que necesita ser dividido en N fragmentos y utilizamos los campos Tamaño y Offset de la siguiente manera:

Offset Tamaño
Fragmento 1 0 512
Fragmento 2 500 512
Fragmento N 10 100

Al reconstruir el paquete en destino se producirá un error de desbordamiento de buffer (buffer overrun), ya que el fragmento N apunta a un lugar en el que ya se había escrito previamente y obliga a sobreescribirse.

Otro ataque interesante es enviar cientos o miles de fragmentos manipulados con diferentes ID de fragmento contra la máquina que se desea atacar, de manera que agotemos los recursos de reensamblaje del equipo atacado; acabaremos colmando la pila en la que reconstruye estos paquetes, y no aceptará ninguno más, generando así un ataque de Denegación de Servicio (DoS).

Afortunadamente, a dia de hoy, este tipo de ataques no suelen ser efectivos. Los sistemas operativos vulnerables son Windows 3.1x, Windows 95, Windows NT y las versiones inferiores a Linux 2.0.32, así como la 2.1.63.

Otro día hablaré del famoso ping de la muerte! 🙂