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 😀

Terminal para Gnome: guake

Hace un tiempo escribí sobre terminales para Gnome en el que hablé de Terminator y Nautilus-terminal, que son dos terminales realmente cómodos para trabajar en modo consola. Aún así, despues del post, seguí probando alguno más y encontré otro que, para mi gusto, es el que más cómodo me resulta de todos. El terminal en cuestión se llama guake y está inspirado en aquellos terminales de míticos juegos como Quake o Doom en los que aparecían desde arriba.

Con tan solo presionar F12, se despliega el terminal y se sitúa por encima de las demás ventanas del escritorio. El terminal es semitransparente por lo que es posible utilizarlo y seguir viendo el contenido del escritorio, muy cómodo cuando necesitas copiar algún texto.

guake screenshot
guake screenshot

Además puedes configurar fácilmente desde los colores del terminal hasta el tipo de shell (sh, dash, bash…) que ejecutará, desde su menú de propiedades para que quede a tu gusto. Incluso tener múltiples pestañas de terminal abiertas a la vez, para realizar diferentes tareas. Me he acostumbrado tanto a este terminal que ahora me resulta imprescindible.

guake múltiples pestañas
guake múltiples pestañas
propiedades de guake
propiedades de guake
propiedades de guake
propiedades de guake

Para instalarlo, como siempre sencillísimo en Ubuntu, tan solo debes ejecutar el siguiente comando:

pedro@pedro-laptop:~$ sudo apt-get install guake

Comandos para comprimir y descomprimir archivos en linux

En Linux hay diversas herramientas para empaquetar y comprimir archivos, tomando en cuenta que empaquetar es juntar dos o más archivos en un solo archivo (paquete) y comprimir es tomar este archivo-paquete y comprimirlo a continuación te muestro un resumen de las más comunes, de acuerdo a la extensión que comunmente se acostumbra ponerles.
.tar (tar)
Empaquetar
tar cvf archivo.tar /archivo/mayo/*
Desempaquetar
tar xvf archivo.tar
Ver el contenido (sin extraer)
tar tvf archivo.tar
.tar.gz – .tar.z – .tgz (tar con gzip)
Empaquetar y comprimir
tar czvf archivo.tar.gz /archivo/mayo/*
Desempaquetar y descomprimir
tar xzvf archivo.tar.gz
Ver el contenido (sin extraer)
tar tzvf archivo.tar.gz
.gz (gzip)
Comprimir
gzip -q archivo
(El archivo lo comprime y lo renombra como «archivo.gz»)
Descomprimir
gzip -d archivo.gz
(El archivo lo descomprime y lo deja como «archivo»
Nota: gzip solo comprime archivos, no directorios
.bz2 (bzip2)
Comprimir

bzip2 archivo

bunzip2 archivo
(El archivo lo comprime y lo renombra como «archivo.bz2»)
Descomprimir

bzip2 -d archivo.bz2

bunzip2 archivo.bz2
(El archivo lo descomprime y lo deja como «archivo»)
Nota: bzip2 solo comprime archivos, no directorios
.tar.bz2 (tar con bzip2)
Comprimir
tar -c archivos | bzip2 > archivo.tar.bz2
Descomprimir

bzip2 -dc archivo.tar.bz2 | tar -xv

tar jvxf archivo.tar.bz2 (versiones recientes de tar)
Ver contenido
bzip2 -dc archivo.tar.bz2 | tar -tv
.zip (zip)
Comprimir
zip archivo.zip /mayo/archivos
Descomprimir
unzip archivo.zip
Ver contenido
unzip -v archivo.zip
.lha (lha)
Comprimir
lha archivo.lha /mayo/archivos
Descomprimir
lha -x archivo.lha
Ver contenido

lha -v archivo.lha

lha -l archivo.lha
.zoo (zoo)
Comprimir
zoo -a archivo.zoo /mayo/archivos
Descomprimir
zoo -x archivo.zoo
Ver contenido

zoo -v archivo.zoo

zoo -L archivo.zoo
.rar (rar)
Comprimir
rar -a archivo.rar /mayo/archivos
Descomprimir
rar -x archivo.rar
Ver contenido

rar -v archivo.rar

rar -l archivo.rar

Fuente original: Sergio González Durán (http://www.linuxtotal.com.mx/index.php?cont=info_admon_004)

Usando SQLite

SQLite
SQLite

¿Qué es SQLite?

SQLite es un pequeño – pero genial – Sistema Gestor de Bases de Datos, como MySQL, Oracle, dBase o FileMaker. Las principales ventajas respecto a otros sistemas de gestión de bases de datos son:

  • Es un proyecto de dominio público.
  • Tamaño muy reducido, menos de 300Kb, que lo hace perfecto para ser utilizado junto con otras aplicaciones.
  • Las bases de datos se guardan en forma de ficheros, por lo que es posible trasladar sin problemas una base de datos (o fichero) a cualquier dispositivo que tenga instalado sqlite.
  • Es multiplataforma.
  • Estabilidad. Despues de más de 10 años de desarrollo, muchas aplicaciones como Firefox, OpenOffice o incluso Android confían en esta herramienta para gestionar sus datos.

Instalación

Instalarlo es muy sencillo, puedes descargarlo de su página oficial o bien ejecutar el siguiente comando en cualquier distribución basada en Debian:

pedro@pedro:~$ sudo apt-get install sqlite

para instalar la versión 2.x o bien

pedro@pedro:~$ sudo apt-get install sqlite3

para instalar la versión 3.x.

Voy a publicar algunos comandos que me han resultado útiles para preparar una base de datos a la que accede una pequeña aplicación en hecha en Mono.

Importar ficheros CSV a SQLite

Supongamos que tenemos el siguiente archivo:

pedro@pedro:~/prueba$ cat tabla.csv
Pedro;Carrasco;http://www.pedrocarrasco.org/
Juan;Gomez;http://www.paginawebdejuan.com/
Federico;Garcia;http://www.paginadefederico.com/

Con el siguiente comando crearemos un fichero llamado personas.db3, que contendrá la base datos que queremos importar:

pedro@pedro:~/prueba$ sqlite3 personas.db3
SQLite version 3.7.2
Enter «.help» for instructions
Enter SQL statements terminated with a «;»

La base de datos destino debe tener la misma cantidad y tipo de datos que el CSV, así que creamos la tabla personas adecuada a la información que queremos importar:

sqlite> create table personas ( nombre varchar(32), apellidos varchar(32), web varchar(32) );

Como nuestro archivo CSV separa los campos mediante el caracter punto y coma (;), lo indicaremos en sqlite de la siguiente manera:

sqlite> .separator ;

Ahora sólo falta importar el archivo:

sqlite> .import tabla.csv personas

Ya está, ahora podemos hacer un SELECT, para comprobar que todo está bien:

sqlite> select * from personas;
Pedro|Carrasco|http://www.pedrocarrasco.org/
Juan|Gomez|http://www.paginawebdejuan.com/
Federico|Garcia|http://www.paginadefederico.com/

Convertir de sqlite3 a sqlite2

La manera más sencilla y rápida de convertir una base de datos de la versión 3 de sqlite a la versión 2 es la siguiente:

pedro@pedro:~/prueba$ echo .dump | sqlite3 personas.db3 | sqlite personas.db

Instalar LAMP con un solo comando en Ubuntu

Atención, este artículo está desactualizado y puede no ser válido para ediciones recientes de Ubuntu

¿Qué es LAMP?

LAMP es el acrónimo de Linux + Apache + MySQL + PHP, y describe una plataforma de desarrollo web que utiliza Linux como Sistema Operativo, Apache como servidor Web, MySQL como Sistema Gestor de Bases de Datos relacional y PHP como lenguaje de programación.

¿Qué necesito para instalarlo?

Para instalarlo necesitas tener cualquier distribución Linux, yo usaré Ubuntu 10.10 como sistema operativo (aunque el proceso debería ser similar en otras distribuciones), y descargar una aplicación de Debian llamada tasksel. Esta aplicación, agrupa varias aplicaciones por tareas y ofrece al usuario una manera fácil de instalar paquetes según tus necesidades. Para instalarlo, necesitamos escribir en un terminal

pedro@pedro-laptop:~$ sudo apt-get install tasksel

Ya tengo tasksel, ¿y ahora qué?

Una vez instalado, ejecutamos tasksel que será el que haga todo lo necesario para preparar nuestro entorno LAMP

pedro@pedro-laptop:~$ sudo tasksel
Menú inicial de tasksel
Menú inicial de tasksel

Una vez lleguemos a este menú, solo tendremos que seleccionar LAMP Server utilizando la barra espaciadora, y ya que estamos, puedes instalar cualquier otra cosa que necesites. Despues sólo tienes que ir al botón de Ok utilizando el tabulador, y empezará la instalación!

Proceso de instalación de LAMP
Proceso de instalación de LAMP

Deberemos rellenar la contraseña que queramos poner al usuario root de MySQL (y luego nos pedirá repetirla por si acaso).

Contraseña de root en MySQL
Contraseña de root en MySQL

Y ya está listo!!

Podemos comprobar si Apache está funcionando abriendo nuestro navegador favorito y escribiendo http://127.0.0.1/ en la barra de direcciones. Si aparece la siguiente imagen, es que Apache funciona bien!!

Comprobación de Apache
Comprobación de Apache

Apache funciona, pero ¿qué pasa con PHP?

Para probar PHP, puedes generar un phpinfo. Para hacerlo sólo tienes que crear un archivo que se llame /var/www/phpinfo.php. Puedes hacerlo de la siguiente manera:

pedro@pedro-laptop:~$ nano /var/www/phpinfo.php

Y escribir en el editor:

<?php
phpinfo();
?>

Si al visitar http://127.0.0.1/phpinfo.php aparece algo similar a lo que se muestra en la imagen siguiente, es que todo está correcto.

Comprobación de PHP
Comprobación de PHP

¿Ya está? Qué facil!

Ya estas preparado para empezar a programar. El directorio al que apunta por defecto Apache, es /var/www, es allí donde está ubicado index.html y phpinfo.php con el que hemos probado el funcionamiento de Apache y PHP respectivamente.

Personalmente, como complemento imprescindible a todo LAMP, simpre instalo phpmyadmin, un gestor para MySQL que nos facilitará mucho las cosas cuando queramos trabajar con Bases de Datos. Para hacerlo:

pedro@pedro-laptop:~$ sudo apt-get install phpmyadmin

Durante el proceso de instalación nos preguntará qué servidor web es el que utilizaremos, en nuestro caso Apache, así que lo seleccionamos con el espacio y presionamos Ok.

Instalación de phpMyAdmin
Instalación de phpMyAdmin

A continuación nos preguntará si queremos que se configure automáticamente o por el contrario no hacer nada. Si te atreves a configurarlo manualmente (modificando los archivos de configuración) haz clic en No, pero es más cómodo hacer clic en Yes.

Instalación de phpMyAdmin
Instalación de phpMyAdmin

También necesitaremos proporcionar la contraseña que previamente habíamos utilizado al configurar MySQL, así que la escribimos (luego nos la volverá a pedir para confirmar).

Instalación de phpMyAdmin
Instalación de phpMyAdmin

Ahora también tenemos listo nuestro phpMyAdmin. Podemos comprobar que funciona correctamente si visitamos http://127.0.0.1/phpmyadmin.

Comprobación de phpMyAdmin
Comprobación de phpMyAdmin

Voilà!! Ya podemos crear fácilmente tablas, bases de datos para jugar con MySQL!! 😀

Página principal de phpMyAdmin
Página principal de phpMyAdmin

Al final no ha sido un solo comando, pero casi!! Ahora nos queda lo más divertido: empezar a programar en PHP para hacer aplicaciones libres!!

Galaxy Live Wallpaper

galaxy-live-wallpaper Galaxy Live Wallpaper es un plugin para Compiz que hace que aparezca como wallpaper una galaxia animada, y nada de un video, sino una animación en toda regla, en la que puedes controlar el ángulo de visión, velocidad, tamaño de las estrellas, y demás cosas… Cabe decir es la primera versión ßeta de este plugin y que SOLO funcionará en Ubuntu 10.10 (por el momento).

La página del desarrollador de este software, con el manual detallado de instalación, es esta, pero si estas utilizando Ubuntu Maverick, sólo tienes que seguir estos pasos para instalarlo:

1. Añade al final del fichero /etc/apt/sources.list las siguientes lineas (recuerda que debes ser root para poder modificarlo):

deb http://ppa.launchpad.net/ilap/lwp/ubuntu maverick main
deb-src http://ppa.launchpad.net/ilap/lwp/ubuntu maverick main

2. Actualiza los repositorios escribiendo en un terminal:

sudo apt-get update

3. Para instalarlo escribe:

sudo apt-get install compiz compizconfig-settings-manager compiz-fusion-plugins-extra compiz-plugins-livewallpapers

El siguiente paso que haremos es cambiar el fondo de pantalla, haciendo clic con el botón derecho en el escritorio » Cambiar el fondo del escritorio » Añadir » en el directorio /usr/share/backgrounds encontrarás la imagen Space_by_ilap.jpg » Abrir

Ahora hay que activar el plugin de compiz, para hacerlo vamos a Sistema » Preferencias » Administrador de Opciones CompizConfig. Al abrirse el administrador, verás una categoría llamada «Live Wallpapers». Haz clic y actívala seleccionando la opción «Enable Galaxy Live Wallpaper».

Ya lo tienes!! para activar o desactivar el fondo de escritorio molón, sólo tienes que presionar Super (tecla de windows)+F4 y aparecerá la galaxia dando vueltas!! 😀

Os dejo con el video para que veáis como queda:

Terminales para Gnome

Hace algún tiempo estuve buscando por internet alternativas al terminal de Gnome, porque – llamadme antiguo – el terminal es mucho más rápido para hacer muchas cosas que cualquier entorno gráfico, por muy bonito que pueda resultar compiz fusion.

Me encontré con un par de aplicaciones que me han gustado mucho y resultan muy cómodas en el día a día.

Terminator
La primera es terminator, que a pesar de tener un nombre muy peliculero es muy cómodo cuando necesitas tener varios terminales a la vista. Puedes instalarlo en Ubuntu simplemente escribiendo esto en tu terminal (para otras distribuciones y MacOS, visitad la página oficial)

sudo apt-get install terminator

Una vez instalado podreis encontrarlo en Aplicaciones » Accesorios » Exterminador

Aplicaciones - Accesorios - Exterminador
Aplicaciones » Accesorios » Exterminador

Lo bueno de este terminal es que, haciendo clic con el botón derecho, puedes realizar subdivisiones en horizontal y en vertical para obtener tantos terminales como necesites…

terminator
terminator con 3 divisiones, perfecto para jugar con aircrack 😛

Bueno, en la siguiente imagen quizás me he pasado un poco…

terminator
terminator con 7 divisiones

Nautilus-Terminal
La otra aplicación que encontré se llama nautilus-terminal, la verdad es que esta aplicación no deja de ser gnome-terminal, aunque esta vez integrado en cada ventana de nautilus de una forma muy discreta. En cada ventana aparece una pequeña zona con un botón que pone Mostrar. Al hacer clic se despliega dentro de la propia ventana un pequeño terminal listo para usar. Incluso puedes arrastrar archivos para no tener que escribir su ubicación. Para instalarlo escribe en un tu terminal:

sudo add-apt-repository ppa:flozz/flozz && sudo apt-get update && sudo apt-get install nautilus-terminal

Aquí van un par de capturas de cómo usarlo después de haberlo instalado.

nautilus-terminal
nautilus-terminal

Si conocéis alguno otro interesante escribid un comentario.. Quiero probarlos todos!!

Instala LibreOffice desde repositorios en Ubuntu

Se han configurado unos repositorios de LibreOffice – el sucesor de OpenOffice, para Ubuntu, Linux Mint y otras distribuciones Debian.
Este repositorio realiza una instalación del reciente fork de la suite ofimática, aún en beta, pero todo un alivio para muchos usuarios.
LibreOffice
Abre un terminal y escribe el siguiente comando

sudo echo «deb http://download.tuxfamily.org/gericom/libreoffice / #gericom@hummer» | tee -a /etc/apt/sources.list

wget deb http://download.tuxfamily.org/gericom/gericom.asc -q -O- | sudo apt-key add –

Y para acabar…

sudo apt-get update && sudo apt-get install libreoffice

para instalar la nueva suite ofimática.
fuente: omgubuntu

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! 🙂