Algo de Linux: enero 2010

martes, 26 de enero de 2010

OpenWrt en routers Conceptronic C54APRA, D-Link G604T, D-Link G624T

Como ya comenté en algún artículo anterior, tengo un router Conceptronic C54APRA al que le puse el firmware del Dlink G604T y posteriormente pasé a Dlink G624T con el firmware V3.02B01T02.EU-A.20061124.

Después lo actualicé a la V310B01T02.EU-A20070613, simplemente por tener una versión más nueva del sistema, pero no me gustó porque perdía ciertas posibilidades como, por ejemplo, WDS, así que volví a dejarle el firmware V3.02B01T02.EU-A.20061124 del Dlink G624T.

La última prueba que he hecho con él ha sido esta semana, actualizándolo con la versión 8.09.2 del firmware kamikaze OpenWrt para dispositivos ar7.
Decir que me ha gustado mucho las posibilidades que ofrece este firmware, pero, después de probarlo, he vuelto a colocar el firmware anterior porque el kamikaze no tenía soporte para WPA.

Explico cómo he colocado este firmware por si en algún momento me interesara volver a hacerlo o por si a alguien le sirviera mi experiencia. En cualquier caso, me he basado en las instrucciones de oldwiki de OpenWrt.

Estos routers tienen un chip AR7 de Texas Instruments. Este chip contiene un bootloader llamado ADAM2 que ofrece soporte para:
  • La consola serie TI AR7 (16c550 compatible).
  • El driver TI Ethernet.
  • TCP/IP.
  • Cliente DHCP.
  • Servidor FTP.
  • Y FLASH memory writer/eraser.
ADAM2 se encuentra en la partición FLASH mtd2.

Este bootloader nos es muy útil para poder flashear el router con firmwares alternativos al original como kamikaze, o, por ejemplo, para recuperar nuestro router tras un mal flasheo.

Lo primero que tenemos que hacer es averiguar la dirección IP de ADAM2. Podemos hacerlo, conectándonos vía telnet a nuestro router con el firmware que tengamos antes de cambiarlo. Por ejemplo, suponiendo que la dirección IP de nuestro router es 172.22.65.1, ejecutamos en un terminal:

$ telnet 172.22.65.1

Veremos una salida similar a la siguiente:

Trying 172.22.65.1...
Connected to 172.22.65.1.
Escape character is '^]'.

BusyBox on (none) login:


Donde nos pide el login. Introduciremos root y nos pedirá el password de administrador. Introduciremos el password de administrador que tengamos en nuestro router.
Una vez introducido, ya estamos dentro del router:

BusyBox v0.61.pre (2007.04.13-08:29+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

#


Ejecutaremos la siguiente combinación de comandos:

# cat /proc/ticfg/env | grep my_ipaddress

Y el router nos devolverá la IP de ADAM2. Mi router tiene la 192.168.1.199. Esa es la dirección que tendré que usar cuando el router se está iniciando para acceder al bootloader.

No voy a entrar en detalles muy concretos, pero, en resumen, lo que tenemos que hacer es configurar el mapeado de mtd1 y flashear el firmware sobre mtd1 vía FTP.

Así que. ahora que sabemos que nuestra IP es la 192.168.1.199, reiniciaremos el router y haremos un telnet a nuestra IP en el puerto 21, ejecutando el siguiente comando en consola, lo más pronto que podamos (puesto que queremos que el telnet se conecte al bootloader, que se ejecuta en el inicio del router):

$ telnet 192.168.1.199 21

Veremos algo como lo siguiente:

Trying 192.168.1.199...
Connected to 192.168.1.199.
Escape character is '^]'.

220 ADAM2 FTP Server ready.

Si no lo vemos es porque hemos tardado mucho en ejecutar el comando, tras reiniciar el router. Así que tendremos que volver a reiniciarlo y ejecutar de nuevo el comando lo más pronto que podamos.

Para conectarnos a ADAM2, tendremos que introducir un nombre de usuario (adam2) y un password (adam2). Así que, escribiremos lo siguiente en la consola de telnet que tenemos abierta:

USER adam2

Nos mostrará un mensaje similar al siguiente:

331 Password required for adam2

Introduciremos el password (adam2), mediante el comando PASS:

PASS adam2

Nos mostrará un mensaje similar al siguiente:

User adam2 successfully logged in.

Lo que nos confirma que estamos logueados con el usuario adam2.

Bien, pues ahora que estamos logueados, lo siguiente que haremos será ver cómo están mapeadas las variables mtd1, mtd2, mtd3 y mtd4. Para ello ejecutaremos comandos GETENV con cada una de las variables:

GETENV mtd0
mtd0 0x900a1000,0x903f0000
200 GETENV command successful
GETENV mtd1
mtd1 0x90010090,0x900a1000
200 GETENV command successful
GETENV mtd2
mtd2 0x90000000,0x90010000
200 GETENV command successful
GETENV mtd3
mtd3 0x903f0000,0x90400000
200 GETENV command successful
GETENV mtd4
mtd4 0x90010000,0x903f0000
200 GETENV command successful


Como podemos ver, cada vez que ejecutamos un comando GETENV, obtenemos el direccionamiento asociado a la variable que consultamos. Y la salida de cada GETENV debería devolvernos los valores que mostramos anteriormente. Debemos asegurarnos de que el mapeo de direcciones de nuestro router coincide con el mostrado arriba.

Como coinciden, para poder cambiar el firmware, lo que vamos a hacer es cambiar el mapeo de mtd1 a 0x90010000,0x903f0000. Para ello usamos el comando SETENV:

SETENV mtd1,0x90010000,0x903f0000


Al ejecutar el comando recibiremos un mensaje informándonos de que se ha ejecutado correctamente:

200 GETENV command successful

Por tanto, ahora que ya hemos cambiado el direccionamiento, salimos:

QUIT

Con lo que acabamos de hacer, ya podemos flashear nuestro router vía ftp. Así que descargamos el firmware: 8.09.2 (el último disponible a día de hoy).

Para flashearlo, no sé por qué, hay que utilizar el cliente ftp de windows. He intentado hacerlo varias veces desde linux, pero, por alguna razón, la comunicación se cuelga y no finaliza.

Así que, buscamos un windows, conectamos el router y abrimos un terminal de comandos con cmd.

Una vez que tenemos el terminal de comandos abierto, hacemos ftp a la direccón adam2 de nuestro router:

ftp 192.168.1.199

El router nos mostrará un mensaje y nos perguntará un usuario y una password. Introduciremos adam2 como usuario y como password:

Connected to c54apra (192.168.199.1).
220 ADAM2 FTP Server ready.
Name (192.168.1.1:user): adam2
530 Please login with USER and PASS.
SSL not available
331 Password required for adam2.
Password: adam2


Y veremos un mensaje en el que nos dice que el usuario adam2 se ha logueado correctamente:

230 User adam2 successfully logged in.
ftp>


En el prompt de ftp establecemos el modo de transferencia binario e indicamos, por decirlo de algún modo, que vamos a flashear:


ftp> binary
ftp> quote MEDIA FLSH


El siguiente paso, será transferir el archivo:

put "openwrt-ar7-squashfs.bin" "openwrt-ar7-squashfs.bin mtd1"


Tardará un poquito en flashearlo, pero no demasiado. Una vez que termine, veremos de nuevo el prompt de ftp:

ftp>

Reiniciamos el router:

ftp>quote REBOOT

Y salimos de ftp:

ftp>QUIT

Y listo. Ya tendremos nuestro router funcionando con OpenWRT.

miércoles, 20 de enero de 2010

Instalar impressive en Debian Lenny

Impressive es una aplicación escrita en Python disponible para  GNU/Linux, Windows y Mac,  que nos permite mostrar, en forma de diapositivas:
  • Documentos PDF.
  • Carpetas de imágenes.
He instalado impressive en Debian Lenny y el proceso de instalación se ha realizado sin problemas, pero al intentar utilizar la herramienta:

$ impressive comandos.pdf


Me ha tirado una lista de errores:

Welcome to Impressive version 0.10.2
Traceback (most recent call last):
File "/usr/bin/impressive", line 161, in
from OpenGL.GL import *
File "/usr/lib/python2.5/site-packages/OpenGL/GL/__init__.py", line 2, in
from OpenGL.raw.GL import *
File "/usr/lib/python2.5/site-packages/OpenGL/raw/GL/__init__.py", line 6, in
from OpenGL.raw.GL.constants import *
File "/usr/lib/python2.5/site-packages/OpenGL/raw/GL/constants.py", line 7, in
from OpenGL import platform, arrays
File "/usr/lib/python2.5/site-packages/OpenGL/platform/__init__.py", line 36, in
_load()
File "/usr/lib/python2.5/site-packages/OpenGL/platform/__init__.py", line 27, in _load
plugin_class = plugin.load()
File "/usr/lib/python2.5/site-packages/OpenGL/plugins.py", line 14, in load
return importByName( self.import_path )
File "/usr/lib/python2.5/site-packages/OpenGL/plugins.py", line 28, in importByName
module = __import__( ".".join(moduleName), {}, {}, moduleName)
File "/usr/lib/python2.5/site-packages/OpenGL/platform/glx.py", line 8, in
class GLXPlatform( baseplatform.BasePlatform ):
File "/usr/lib/python2.5/site-packages/OpenGL/platform/glx.py", line 16, in GLXPlatform
mode=ctypes.RTLD_GLOBAL
File "/usr/lib/python2.5/site-packages/OpenGL/platform/ctypesloader.py", line 42, in loadLibrary
return dllType( name, mode )
File "/usr/lib/python2.5/ctypes/__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: ('GL: cannot open shared object file: No such file or directory', 'GL', None)


Buscando un poco en google, he encontrado información acerca del bug y la solución que proponía alguien (instalar el paquete libgl1-mesa-dev), me ha resuelto el problema:

# aptitude install libgl1-mesa-dev

Crear presentaciones "portables" con OpenOffice

Los que trabajamos con Linux, lo habitual es que hagamos nuestras presentaciones con OpenOffice Impress y llevemos nuestro portátil para hacer la presentación. Pero muchas veces he visto a gente que va a dar una ponencia, lo único que lleva es un pendrive con la presentación en PowerPoint y se encuentra con que en las instalaciones no hay PowerPoint.

Naturalmente OpenOffice puede abrir presentaciones hechas con PowerPoint, pero a veces, se descolocan las cosas.

En otras ocasiones sucede lo contrario. Llevas tu presentación en OpenOffice y resulta que no lo tienen instalado en el equipo que vas a usar para impartir tu ponencia.

Como más vale ser prevenido, lo ideal es llevar el documento guardado también en otro formato, como por ejemplo: PDF.

Un equipo puede tener OpenOffice o PowerPoint, pero lo que es seguro es que tendrá algún visor de archivos PDF.

Con OpenOffice Impress podemos guardar una presentación en formato PDF de manera que:
  • Conserve el aspecto de presentación, ajustada para ser mostrada en pantalla.
  • Nos permita seguir utilizando el documento pdf como una presentación, que se puede mostrar a pantalla completa y navegar por la presentación.
¿Cómo lo hacemos?
Muy sencillo: Creamos nuestra presentación, como siempre, en OpenOffice. Y, una vez que la tengamos creada, hacemos clic en el menú Archivo -> Exportar en formato PDF, tal y como se muestra en la siguiente imagen:


Se nos abrirá un cuadro de diálogo similar al siguiente:

Seleccionamos la pestaña Interfaz del usuario, donde marcaremos la opción Abrir en modo de pantalla completa para que cuando abramos el documento pdf con un visor, se muestre directamente a pantalla completa.

Por último, hacemos clic en el botón Exportar para que genere el archivo PDF que contendrá nuestra presentación.

Y listo, ya tendremos nuestra presentación en otro formato adicional: pdf.

Ahora, cuando tengamos que hacer la presentación, nos llevaremos tanto el archivo .odt como el archivo .pdf, por si acaso...

lunes, 18 de enero de 2010

Filtrar tráfico p2p en linux

Un problema habitual para los administradores de redes es el abuso del uso de P2P. Si tenemos un servidor linux, podemos filtrar este tipo de tráfico con el fin de pararlo, o, al menos, ralentizarlo de forma que no merezca la pena.

Una forma de hacerlo es usando Xtables-addons.

Xtables-addons
contiene extensiones que no fueron aceptadas o aún no han sido aceptadas en los paquetes del kernel o iptables. Una de ellas es el módulo ipp2p (xt_ipp2p) que nos permite filtrar el tráfico p2p.

Como en Debian Lenny, a día de hoy, aún no tenemos la versión 1.4.3 de iptables, y es la versión mínima para trabajar con xtables, me he descargado el código fuente y lo he compilado. Pero vamos paso por paso lo que he hecho.

Primero, descargamos iptables-1.4.3.tar.bz2 y xtables-addons-1.21.tar.bz2.

Luego copiamos los archivos descargados a /usr/src:

# cp iptables-1.4.3.tar.bz2 /usr/src
# cp xtables-addons-1.21.tar.bz2 /usr/src

Y los descomprimimos:

# cd /usr/src
# tar xfvj iptables-1.4.3.tar.bz2

# tar xfvj xtables-addons-1.21.tar.bz2

Se nos crearán dos directorios:
  • iptables-1.5.3
  • xtables-addons-1.21
Como es necesario tener los headers correspondientes al núcleo que tenemos instalado, los instalamos:

# aptitude install linux-headers-`uname -r`

Primero compilaremos e instalaremos iptables. Para ello, entramos en el directorio iptables-1.5.3:

# cd iptables-1.5.3

# ./configure

Si tuviéramos algún error, es cuestión de ver qué es lo que nos falta. Si todo va bien, no tendremos ningún error y podremos compilar.

# make

Y, si el proceso de compilación no nos ha devuelto ningún error, instalamos:

# make install

Una vez instalado iptables, podemos ver si está funcionando si ejecutamos en un terminal:

# iptables --version

Una vez instalado iptables, vamos a instalar xtables-addons. Para ello, entramos en el directorio xtables-addons-1.21:

# cd xtables-addons-1.21

Y ejecutamos:

# ./configure

Si tuviéramos algún error, como ya dijimos al instalar iptables, es cuestión de ver qué es lo que nos falta. Si todo va bien, no tendremos ningún error y podremos compilar:

# make

Y, si el proceso de compilación no nos ha devuelto ningún error, instalamos:

# make install

Una vez instalado xtables-addons, podemos comprobar si todo ha ido bien de la siguiente manera:

# iptables -m ipp2p --help

Obtendremos una ayuda acerca de cómo usar ip2p con iptables.

Como podemos ver, podremos filtrar:


--edk [tcp,udp] All known eDonkey/eMule/Overnet packets
--dc [tcp] All known Direct Connect packets
--kazaa [tcp,udp] All known KaZaA packets
--gnu [tcp,udp] All known Gnutella packets
--bit [tcp,udp] All known BitTorrent packets
--apple [tcp] All known AppleJuice packets
--winmx [tcp] All known WinMX
--soul [tcp] All known SoulSeek
--ares [tcp] All known Ares

Ahora ya podríamos usar en iptables reglas que bloqueen los diferentes tipos de tráfico. Ejemplos:

iptables -A FORWARD -p tcp -m ipp2p --edk -j DROP
iptables -A FORWARD -p udp -m ipp2p --edk -j DROP
iptables -A FORWARD -p tcp -m ipp2p --dc -j DROP
iptables -A FORWARD -p tcp -m ipp2p --kazaa -j DROP
iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP
iptables -A FORWARD -p tcp -m ipp2p --gnu -j DROP
iptables -A FORWARD -p udp -m ipp2p --gnu -j DROP
iptables -A FORWARD -p tcp -m ipp2p --bit -j DROP
iptables -A FORWARD -p udp -m ipp2p --bit -j DROP
iptables -A FORWARD -p tcp -m ipp2p --apple -j DROP
iptables -A FORWARD -p tcp -m ipp2p --winmx -j DROP
iptables -A FORWARD -p tcp -m ipp2p --soul -j DROP
iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP

Configurar opciones por defecto en gnome para los usuarios

Como ya comenté en un artículo anterior, en Debian y distribuciones derivadas podemos añadir un fichero al directorio /usr/share/gconf/defaults/ donde especificaremos nuestras preferencias por defecto en gnome, como por ejemplo, activar el uso del teclado numérico como sustituto del ratón, configurar la tecla con el simbolito de windows para que, al pulsarla, se abra el menú principal, etc...

Recordando un poco el tema, como dijimos, creamos un fichero llamado, por ejemplo, 25_mispreferencias dentro del directorio /usr/share/gconf/defaults/:

# touch /usr/share/gconf/defaults/25_mispreferencias

Si ya lo hemos creado anteriormente, no tenemos más que añadir una línea por cada preferencia que queramos establecer.

Por ejemplo, para activar la posibilidad de usar el teclado numérico como sustituto del ratón, como ya dijimos, no tendremos más ejecutar el siguiente comando en un terminal para añadir la preferencia al archivo:

# echo "/desktop/gnome/accesibility/keyboard/mousekeys_enable true" >> /usr/share/gconf/defaults/25_mispreferencias

Y para que esta posibilidad se encuentre activada siempre al inicio, añadiremos otra línea más al fichero de preferencias:

# echo "/desktop/gnome/accesibility/keyboard/enable true" >> /usr/share/gconf/defaults/25_mispreferencias

Una vez configuradas las opciones por defecto para gconf, ejecutaremos el comando:

# update-gconf-defaults

Vuelvo a recordar lo que comenté en un artículo anterior: Usando este método definimos las opciones por defecto de gconf. Pero, si el usuario modifica su configuración particular, por ejemplo mediante gconf-editor, prevalecerá la configuración del usuario sobre la configuración por defecto.

Unas cuantas preferencias que tengo definidas:

Bloquear la modificación del panel:
/apps/panel/global/locked_down true

Establecer un fondo de escritorio por defecto:
/desktop/gnome/background/picture_filename /usr/share/wallpapers/debian-edu-wallpaper.png

Establecer el ajuste del fondo de escritorio:
/desktop/gnome/background/picture_options stretched

Establecer el uso del teclado numérico como sustituto del ratón:
/desktop/gnome/accessibility/keyboard/mousekeys_enable true

Activar el uso del teclado numérico como sustituto del ratón al inicio de la sesión:
/desktop/gnome/accessibility/keyboard/enable true

Habilitar opción de borrado en nautilus (sin pasar por la papelera):
/apps/nautilus/preferences/enable_delete true

Configurar la tecla de windows para que abra el menú principal:
/apps/metacity/global_keybindings/panel_main_menu Super_L

Más opciones por defecto, interesantes de aplicar:

/apps/gnome-screensaver/idle_activation_enabled false
/apps/gnome-screensaver/lock_enabled false
/apps/gnome-screensaver/user_switch_enabled false
/apps/gnome-session/options/logout_prompt false
/apps/panel/global/disable_lock_screen true
/apps/gnome-power-manager/general/can_suspend false
/apps/gnome-power-manager/general/can_hibernate false
/apps/gnome-power-manager/actions/sleep_type_ac nothing
/apps/gnome-power-manager/actions/sleep_type_battery nothing
/apps/nautilus/preferences/enable_delete true

Aprovecho para añadir un par de opciones más por las que me ha preguntado algún compañero:

Desactivar el botón logout:
/apps/panel/global/disable_log_out true

Desactivar el botón de apagado:

/apps/panel/global/disable_force_quit true



He visto que la opción /apps/panel/global/disable_lock_screen en Debian Squeeze apacece marcada como obsoleta y se indica que debemos cambiarla por:
/desktop/gnome/lockdown/disable_lock_screen true

miércoles, 13 de enero de 2010

ldd: Averiguar las dependencias de librerías de un programa

ldd es un comando muy interesante que nos muestra las librerías que necesita un programa o librería compartida.

Por ejemplo: Si quiero ver qué librerías necesita bash, ejecuto:

# ldd /bin/bash

Y obtendré una salida como la siguiente:

linux-gate.so.1 => (0xb80de000)
libncurses.so.5 => /lib/libncurses.so.5 (0xb8095000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb8091000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7f35000)
/lib/ld-linux.so.2 (0xb80df000)

Ojo, al comando ldd tenemos que proporcionarle la ruta completa al archivo (Ej: ldd /bin/bash). No vale con hacer: ldd bash. Si no sabemos dónde se encuentra localizado el programa o librería, siempre podemos buscarlo con el comando whitch.

Poner el teclado de la consola en español

Muchas veces trabajamos en consola con sistemas, sobre todo live, que por defecto cargan el mapa de teclado en inglés. Cambiarlo es muy sencillo utilizando el comando loadkeys.

Los mapas de teclado se encuentran habitualmente en /usr/share/keymaps/ aunque en algunas distribuciones suele variar su ubicación.
Como, habitualmente trabajamos con sistemas i386 y nuestro teclado es español querty, buscaremos concretamente el fichero es.map.gz dentro del directorio /usr/share/keymaps/i386/qwerty/

De este modo, cargar el mapa de teclado querty español es tan sencillo como ejecutar:
# loadkeys /usr/share/keymaps/i386/qwerty/es.map.gz