miércoles, 13 de febrero de 2008

Configuración de un NAP bluetooth (II)

Este post es una ampliación de otro anterior en el que se explicaba cómo configurar un punto de acceso bluetooth (NAP) en Linux. Con ello se conseguía una forma básica de conectar una PDA a Internet, pero tiene el inconveniente de que no sirve si se quieren conectar al mismo tiempo varios dispositivos.

A continuación resumiré todos los pasos que hay que seguir para configurar un NAP que permite la conexión de varios dispositivos simultáneamente. Están hechos pensando en Debian/Ubuntu Linux, en otras distribuciones se hará de forma parecida aunque posiblemente algún fichero esté en otro sitio.

1) Instalar utilidades de bluetooth y de ethernet bridging:

$ sudo aptitude install bluez-utils
$ sudo aptitude install bridge-utils


2) Asegurarse de que se detecta el adaptador bluetooth en el ordenador:

$ hcitool dev
Devices:
hci0 00:03:7A:EE:B6:76


3) Editar /etc/bluetooth/hcid.conf y modificar las siguientes líneas para que queden así:

# Default PIN code for incoming connections
# (Aquí ponemos el PIN que queramos).
passkey "1234";

# Default link mode
# none - no specific policy
# accept - always accept incoming connections
# master - become master on incoming connections,
# deny role switch on outgoing connections
lm accept,master;


4) Si no existe ya, crear un interfaz puente Ethernet de nombre pan0, con el siguiente comando:

# brctl addbr pan0

Para asegurarnos de que se ha creado podemos ejecutar:

$ brctl show
bridge name bridge id STP enabled interfaces
pan0 8000.000000000000 no


5) El interfaz pan0 se puede configurar como cualquier otro, en /etc/network/interfaces, por ejemplo así:

auto pan0
iface pan0 inet static
address 192.168.2.1
netmask 255.255.255.0
gateway 192.168.0.1


6) Editar /etc/default/bluetooth y modificar las siguientes líneas para que queden así:

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


7) Crear el fichero /etc/bluetooth/pan/dev-up con el siguiente contenido:

#!/bin/sh
ifup pan0
brctl addif pan0 $1
ifconfig $1 0.0.0.0

No olvidarse de darle permisos de ejecución. Este script se invocará cada vez que se conecte al ordenador un dispositivo. Cuando esto sucede se crea automáticamente un interfaz de red llamado bnep0 (o bnep1, bnep2... si se conectan otros después). El script anterior lo que hace es añadir el recien creado interfaz al puente pan0 del que hemos hablado antes y se asegura de que está levantado.

8) En el fichero /etc/init.d/bluetooth buscar la parte donde pone start) y justo después de donde pone start_pan || true añadir una línea como esta:

start_rfcomm || true
start_pan || true
(sleep 5; run_sdptool || true) &
log_end_msg 0

Que lo que hace es esperar 5 segundos antes de lanzar el servidor SDP (el que anuncia los servicios ofrecidos por el bluetooth). El "&" del final lo lanza como tarea de fondo, para que el arranque no se ralentice mientras pasan los cinco segundos.

9) Por último, para que el PC haga de router:

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


Se supone que la PDA tiene una dirección IP estática en la misma red que la que se ha configurado para el interfaz pan0. Se podría poner también que fuera dinámica configurando en el PC un servidor DHCP para esa red, que es bastante sencillo.

Si todo funciona como debería cada vez que se conecte un dispositivo bluetooth al PC deberá aparecer un interface de red llamado bnepX. Al hacer un ifconfig veremos que no tiene IP asignada en el PC, pero responderá a un ping si se lo hacemos a la dirección estática que le hubieramos configurado

Cosas que pueden fallar

  • Al intentar conectar desde la PDA al PC no ofrece ningún servicio bluetooth: No se ha configurado bien SDP. Revisar el parámetro SDPTOOL_OPTIONS y que se ha cambiado /etc/init.d/bluetooth como se decía en el apartado 8.
    Se puede añadir el servicio a mano ejecutando sdptool add nap.
    Deberá responder con el mensaje "NAP service registered", de lo contrario significará, que algo está pasando con ese servicio que no funciona bien...

  • El servicio de Network Access Point se ve, pero cuando se intenta conectar falla. Puede ser por muchas cosas. Asegurarse de que:

    • Existe el interface pan0 y tiene configurada una IP: ifconfig pan0
      pan0 Link encap:Ethernet direcciónHW 00:03:7a:ee:b6:76
      inet dirección:192.168.2.1 Difusión:192.168.2.255 Máscara:255.255.255.0
      ARRIBA DIFUSIÓN CORRIENDO MULTICAST MTU:1500 Métrica:1
      RX packets:16 errors:0 dropped:0 overruns:0 frame:0
      TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
      colisiones:0 txqueuelen:0
      RX bytes:796 (796.0 B) TX bytes:2565 (2.5 KB)

    • Está creado el puente ethernet y en él está el interface pan0: brctl show
      bridge name bridge id STP enabled interfaces
      pan0 8000.00037aeeb676 no

    • Está ejecutándose el demonio pand: ps -ef | grep pand

      root 26317 1 0 Jun04 ? 00:00:00 /usr/bin/pand --devup /etc/bluetooth/pan/dev-up --listen --role NAP

      Si no está corriendo podemos lanzarlo a mano desde la línea de comandos con los parámetros de arriba. Si al hacerlo sigue sin lanzarse miraremos el log /var/log/syslog y es probable que encontremos algún mensaje como:

      Bind failed. Address already in use(98)

      Puede ser debido a que haya alguna otra utilidad de bluetooth pululando en el sistema. En alguna ocasión que me ha pasado eso mirando los procesos había dos llamados así:

      root 16844 16839 0 20:52 ? 00:00:00 /usr/lib/bluetooth/bluetoothd-service-input
      root 16845 16839 0 20:52 ? 00:00:00 /usr/lib/bluetooth/bluetoothd-service-network

      Tras matarlos pude lanzar el demonio pand.

    Si falla alguna de estas tres cosas se puede probar a reiniciar el servicio de bluetooth entero (/etc/init.d/bluetooth restart) o a descargar y volver a cargar el driver del dispositivo bluetooth que tengamos (puede variar según el hardware).

7 comentarios:

Anónimo dijo...

Hola,

Estoy siguiendo los pasos del HowTo pero no entiendo el paso número 8:

"En el fichero /etc/init.d/bluetooth buscar la parte donde pone start) y justo antes de log_end añadir una línea como esta"

Te refieres a esta parte:
case "$1" in
start)
log_daemon_msg "Starting $DESC"

if test "$BLUETOOTH_ENABLED" == "0"; then
log_progress_msg "disabled. see /etc/default/bluetooth"
log_end_msg 0
exit 0
fi

start-stop-daemon --start --quiet --exec $HCID -- $HCID_OPTIONS || true
log_progress_msg "hcid"
start_uarts || true

start_hid || true
enable_hci_input || true
start_rfcomm || true
start_pan || true
log_end_msg 0


Me podrias indicar en que parte exactamente .. gracias!!

OS_C dijo...

Hola anónimo,
sí, me refiero a esa parte, al segundo log_end_msg. Se puede poner después del 'start_pan || true'.

Un saludo.

Anónimo dijo...

hice todo al pie de la letra, pero al reiniciar solo cargaba el notificador que la compartición de archivos bluetooth estaba activada y no mostraba el escritorio y se quedo pegado el computador.

Hice un Safe Reset y ya cargaba el escritorio, pero no funcionaba la conexión PAN.

Revisé los posibles errores que mencionas y creo que los tengo todos...

si hago:
$ps -ef | grep pand, sale:
root 7253 6912 0 14:08 pts/0 00:00:00 grep pand

si hago:
ifconfig pan0, sale:
pan0 Link encap:Ethernet direcciónHW ca:bd:4a:00:eb:ec
DIFUSIÓN MULTICAST MTU:1500 Métrica:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
colisiones:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

si SOLO hago $ifconfig, no pmuestra el dispositivo pan0

al ejecutar: ip addr en el número 5 aparece:
5: pan0: < BROADCAST,MULTICAST> mtu 1500 qdisc noop
link/ether ca:bd:4a:00:eb:ec brd ff:ff:ff:ff:ff:ff

Al ejecutar $ brctl show:
bridge name bridge id STP enabled interfaces
pan0 8000.000000000000 no

Lo peor de todo es que en estos momentos, trato de ejecutar alguna orden como sudo y no me deja. Pongo el simple $sudo gedit o $sudo nautilus y tras pedirme la contraseña no ejecuta la orden...

Saludos

Anónimo dijo...

tuve que entrar en consola a prueba de errores

al editar /etc/network/interfaces
había borrado lo que tenía el fichero originalmente:
auto lo
iface lo inet loopback

así que agregué las lineas
auto pan0
iface pan0 inet static
address 192.168.2.1
netmask 255.255.255.0
gateway 192.168.0.1
bajo lo anterior.

Reinicié sin problemas, pero sigo con los mismos errores anteriores.

Ah! Se me olvidaba... Cuanto intento conectarme al computador se queda negociando la conexión eternamente. Supongo que espera que el computador le asigne una ip y como no lo hace queda esperando...

Antes de realizar todo el procedimiento que describes e intentaba conectarme, la conexión era rechazada de inmediato... ahora, como te comenté, no conecta... pero trata, jeje

Saludos

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

Buenas! Espero que puedas ayudarme, apenas me estoy iniciando en todo esto y no puedo seguir mucho mas alla de los manuales existentes, segui todo al pie de la letra, excepto las configuraciones de iptables, las cuales simpre me tiran error, pero por ahora no les presté mucha atención porq no parece que afecten en el establecimiento de la conexion... el tema es este, puedo ver el servicio, pero se queda conectando, vi tus soluciones y he aqui mi problema... para empezar, si hago el ifconfig pan0 veo el dispositivo pero no la ip, y no encuentro forma de ponerla, por otro lado, el servicio del que hablas no esta, (al menos con ese nombre), si intento levantarlo me dice lo de que esta en uso, luego, yo tengo tres servicios corriendo, audio, input y network, solamente cuando mato network me deja levantar el pan, pero luego, al matar network, se pierde la conexion pan0, dejando de aparecer tanto con ifconfig como con brctl... alguna idea?
por favor, realmente lo necesito a esto...
Muchas Gracias de antemano...
Diego.

(borre el anterior por un error de redaccion)

OS_C dijo...

Digo, comprueba el paso 5, hay que configurar el interfaz pan0 con una IP en el fichero donde se configuran los interfaces de red (el lo, el eth0, etc.)