miércoles, 12 de diciembre de 2007

Configuración de un NAP bluetooth en Ubuntu Linux

En la jerga de bluetooth un NAP es un Network Access Point. Es decir, podemos hacer que nuestro ordenador actúe cómo router o pasarela para conectarse a Internet desde algún dispositivo que se comunique por bluetooth, como una PDA o un teléfono móvil.

Ubuntu tiene unas buenas utilidades gráficas para el manejo de dispositivos bluetooth, pero están orientadas al intercambio de ficheros y utilización como módem de los teléfonos móviles. No he sido capaz de configurar un NAP solo con esas utilidades, así que hay que hacerlo por línea de comandos. Para ello, hay que configurar por un lado la parte concreta de bluetooth, y por otro la parte más general de red del sistema. Estos pasos están pensados para Ubuntu y Debian, pero en otros sabores de Linux serán similares.

Configuración de la parte bluetooth

Para empezar, si no lo tenemos ya hay que instalar las utilidades bluetooth, ejecutando como root:

aptitude install bluez-utils

Lo primero será comprobar que el sistema detecta el adaptador de bluetooth que tengamos en el PC, mediante el comando:

hcitool dev

Deberá aparecer algo parecido a:

Devices:
hci0 00:03:7A:EE:B6:16

Donde hci0 es el dispositivo bluetooth y los números su dirección MAC. Si no aparece nada, es que el sistema no está detectando el adaptador.

Editar el fichero /etc/default/bluetooth. Está muy bien comentado qué es cada parámetro de los que aparecen en él, para nuestros propósitos será necesario asegurarse de que, al menos, los siguiente valores están así:

BLUETOOTH_ENABLED = 1

PAND_ENABLED = 1
PAND_OPTIONS="--devup /etc/bluetooth/pan/dev-up"
PAND_OPTIONS=$PAND_OPTIONS" --listen --role NAP "

SDPTOOL_OPTIONS="add NAP"

Aquí hay un par de cosas importantes que no vienen configuradas por defecto y que no he visto bien explicado en ningún sitio: En la primera línea PAND_OPTIONS indicamos la ruta de un script que se ejecutará cuando se establezca la conexión para levantar el interface. Este script no existe, hay que crearlo; es muy simple y más abajo se explica cómo hacerlo. El otro detalle es que en la otra línea donde pone PAND_OPTIONS, si no le añadimos lo que hemos puesto en la línea anterior se perderá. Para que no ocurra, se pone primero el valor que ya tenía, con $PAND_OPTIONS, y a continuación se le concatenan los nuevos valores.

A continuación, editar el fichero /etc/bluetooth/hcid.conf, y modificar la que pone passkey, donde indicaremos un password para la conexión desde la PDA. Más abajo donde pone Default link mode deberá poner: lm accept,master;

En el paquete bluez-utils hay una cosa mal en el script de arranque /etc/init.d/bluetooth, y es que no se lanza el demonio del servicio SDP, que se encarga de mostrar los servicios ofrecidos por nuestro servidor a los dispositivos que se quieran conectar a él. Para que lo lance deberemos buscar en el mencionado fichero la parte donde pone start) y veremos que hay varias líneas donde pone 'start_algo || true'. Añadiremos run_sdptool || true



Configuración de la parte de red del sistema

Cuando se establezca la conexión bluetooth se creará un interface llamado bnep0, que deberá tener su dirección IP. Para hacerlo más simple, suponemos que esta dirección es estática, y lo configuramos en el fichero donde se encuentran todos los interfaces de red del sistema, en /etc/network/interfaces :

auto bnep0
iface bnep0 inet static
address 192.168.2.1
netmask 255.255.255.0
gateway 192.168.0.1 (o el que tengamos en nuestra conexión a Internet por defecto)

Con esto configuramos la IP, pero el interface no estará activo hasta que no se conecte un dispositivo como una PDA. Para activarlo cuando llegue ese momento es necesario un pequeño script al que nos hemos referido más arriba. Lo habíamos configurado para que se llamara /etc/bluetooth/pan/dev-up, pero podría estar en cualquier otro sitio. Su contenido es el siguiente:

#!/bin/sh
ifup --force $1

La opción de --force es mejor ponerla porque a veces al terminar la conexión el interface se queda creado y la siguiente vez no se vuelve a levantar porque se piensa que sigue activo. El script este es ejecutado por el demonio que atiende las conexiones bluetooth, y le pasa como parámetro el nombre del interfaz creado, en nuestro caso bnep0.

Para que el PC haga de router y conseguir así que la PDA se conecte a internet, deberemos ejecutar estos dos comandos:

echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Suponiendo que sea eth0 la tarjeta de red por la que salimos. Estos comandos pueden ponerse en algún script de arranque para que se ejecuten al iniciar el sistema.

Para terminar, reiniciaremos los servicios de bluetooth y de red para asegurarnos de que los cambios se aplican:

/etc/init.d/networking restart
/etc/init.d/bluetooth restart

Conexión desde la PDA

Esta parte ya depende del dispositivo que tengamos. En mi caso, una PDA HP iPAQ.

Lo primero es configurarle una dirección IP. Por simplificar, se la pongo también estática y la configuro como tarjeta de red. Esto también es importante, he visto muchos tutoriales que para hacer esto mismo usan una conexión serie, como si fuera un módem. En nuestro caso todo lo contrario, lo hacemos como si fuera una tarjeta ethernet.

A continuación, activar el interface bluetooth y escanear en busca de dispositivos. Deberá aparecer nuestro PC. Lo seleccionaremos y saldrán los servicios ofrecidos. Debería aparecer uno llamado "Network Access Point" o similar. Lo seleccionaremos y nos pedirá que introduzcamos un PIN, que es el que habremos configurado en el fichero /etc/bluetooth/hcid.conf

Y si todo va bien, se establecerá la conexión. En nuetro PC al ejecutar un ifconfig aparecerá el interface bnep0 y si hacemos ping a la IP de la PDA deberá responder. Parece complicado, pero después de hacerlo tres o cuatro veces es muy sencillo :-)

Más información:
http://bluez.sourceforge.net/contrib/HOWTO-PAN
http://quozl.netrek.org/bluetooth/
http://www.triptico.com/software/bluetooth.html

5 comentarios:

Ane dijo...

Hola,

Sé que hace mucho desde que se publicó esta entrada, pero estoy trabajando en algo relacionado con este tema. Me gustaria conectar mi HTC al PC (estoy trabajando con ubuntu 8.10) por medio de NAP. Esta configuración se realizó con ubuntu 8.04? Es que en 8.10 algunos de los archivos referidos en este artículo no existen.
Cualquier información será bienvenida. Gracias

OS_C dijo...

Hola Ane,

efectivamente, esto se hizo para la versión 8.04, en la 8.10 algunas cosas ya no hacen falta (como tocar el fichero de inicio) porque ya lo arreglaron.
Mira la segunda parte del artículo en http://frikidigital.blogspot.com/2008/02/configuracin-de-un-nap-bluetooth-ii.hml
y ten cuidado con otros servicios relacionados con el bluetooth que arranca el entorno gráfico y que pueden interferir.

Un saludo.

Ane dijo...

Hola,

Te he comentado antes que el movil no detecta el servicio NAP del PC. Ya he revisado los cambios que hay que realizar para tener ese servicio (como tu sugieres en NAP II) y parece que esta todo bien. Ademas desde un PC ubuntu con bluetooth integrado si que se detecta ese servicio y la posibilidad de conectarse a el. De forma que se supone que el NAP esta bien configurado no?
Entonces cual puede ser el motivo de que no se "vea" en el movil?
Gracias de antemano.

Ane dijo...

Hola,

Bueno, ya he coneguido conectar el pc y la pda. Puedo hacer ping desde el pc a la IP de la pda, pero no al reves!Cual podria ser el problema?

OS_C dijo...

Ane, ¿no tendrás puesta alguna iptable que te haga de firewall?