Red Bluetooth en Linux

Montando una red bluetooth en Linux

Este documento es un pequeño y rápido howto que muestra la configuración de mi red con 2 dispositos de bluetooth. El objetivo del montaje era que mi portátil pudiera acceder al servidor y, a ser posible, a Internet, estando conectados el portátil y el servidor por 2 Bluetooth USB modelo Conceptronics CBT100U.

La velocidad media que se consigue con una conexión es de este tipo es de unos 80 KB/segundo. Comparado con una tarjeta de red o con una conexión WIFI es bastante ridículo, pero en mi caso, para acceder a Internet desde el portátil, es más que de sobra.

Mi portátil es Mandrake GNU/Linux y mi servidor es Debian GNU/Linux, de modo que el Howto muestra la configuración en ambos sistemas. En este ejemplo se ha configurado Mandrake (el portatil) como cliente PANU y Debian (el servidor) como NAP, es decir, Debian será la que dará acceso a Internet al portátil con Mandrake.

Cabe destacar también que con la presente configuración un portátil Windows configurado con la IP adecuada (192.168.6.69 en este caso), y el PIN/clave adecuado (el que estableceremos en la configuración del BT en Linux) también podrá emparejarse con el servidor Linux y salir a internet a través de él (utilizando el software para Windows que viene normalmente con los USB). Escaneando en Windows el entorno veremos el servidor Bluetooth Linux y podremos conectar a él y usar su "Acceso a red" para navegar.

Mandrake GNU/Linux

En Mandrake debemos instalar los siguientes paquetes:

$ urpmi hotplug
$ urpmi bluez-hcidump bluez-hciemu bluez-pin bluez-utils

Hay que asegurarse de que se tienen insertados los módulos adecuados para el chipset USB de nuestra placa, entre los siguientes (si no se tienen, insertarlos con modprobe):

uhci-hcd
ohci-hcd
ehci-hcd

El kernel tiene que tener compilado como módulo el soporte de bluetooth (en el kernel oficial de Mandrake 2.6.x viene así). En mi caso, al insertar los 2 Conceptronics USBde 100 metros (modelo CBT100U), se inserta el modulo usb_hci, así como el resto de módulos de bluetooth.

Debian GNU/Linux

En esencia, la configuración se realiza igual que en Mandrake, pero con las siguientes particularidades:

Para instalar el software, añadir las siguientes fuentes de apt:

# Software de bluetooth para Debian Woody
deb http://bluez.sourceforge.net/download/debian/woody ./

o bien:

# Software de bluetooth para Debian Sarge
deb http://bluez.sourceforge.net/download/debian/ ./

Instalar los siguientes paquetes:

$ apt-get install bluez-utils bluez-sdp bluez-hcidump bluez-pan
$ apt-get install hotplug

Recompilar el kernel activando las opciones de USB y Bluetooth necesarias como modulos.

Detectando el dispositivo USB BT

Al tener instalado Hotplug y pinchar el bluetooth se detecta automáticamente, y aparece lo siguiente en los logs:

/var/log/kernel/info:

compiler kernel: usb 3-1: new full speed USB device using address 2
compiler kernel: Bluetooth: HCI USB driver ver 2.7
compiler kernel: usbcore: registered new driver hci_usb
compiler kernel: Bluetooth: HIDP (Human Interface Emulation) ver 1.0
compiler kernel: Bluetooth: BNEP (Ethernet Emulation) ver 1.2
compiler kernel: Bluetooth: BNEP filters: protocol multicast

Tras realizar esto en ambas máquinas, ambos dispositivos bluetooth deberían verse. Podemos chequear el estado de nuestro dispositivo con el comando "hcitool dev", y realizar una búsqueda de dispositivos bluetooth disponibles mediante "hcitool scan". En este último veremos la MAC de los dispositivos, de forma que podemos hacer un ping a nivel 2 (l2ping) para ver si responde nuestro dispositivo remoto, mediante "l2ping MAC" (ej: l2ping 00:30:A5:10:80:10).

# hcitool dev
Devices:
        hci0    00:80:A5:03:8C:41

# hcitool scan
Scanning ...
        00:80:A5:03:8C:2D       pinsa (0)

# l2ping 00:80:A5:03:8C:2D
Ping: 00:80:A5:03:8C:2D from 00:80:5A:30:8C:41 (data size 20) ...
20 bytes from 00:80:A5:03:8C:2D id 200 time 25.25ms
20 bytes from 00:80:A5:03:8C:2D id 201 time 12.02ms
20 bytes from 00:80:A5:03:8C:2D id 202 time 25.02ms
3 sent, 3 received, 0% loss

Si el dispositivo responde, tenemos enlace a nivel 2, es decir, ambos dispositivos se ven y podemos hacer ping entre ellos a nivel casi físico. Ahora es necesario crear una capa TCP/IP sobre ellos para poder asignar una IP a cada uno de ellos. Antes de continuar es imprescindible que podamos hacer ping de nivel 2 desde cada uno de los 2 dispositivos al otro.

PIN o clave de comunicaciones

Obviamente, no vamos a permitir a cualquier otro dispositivo bluetooth que se conecte a nuestro servidor para tener acceso a nuestra red, por lo que deberemos configurar ambos dispositivos (tanto cliente como servidor) con el mismo PIN o clave (debe de ser una clave fuerte, que no se pueda averiguar fácilmente).

Podemos configurar el PIN para la conexion en /etc/bluetooth/pin .

$ cat /etc/bluetooth/pin
clave123456789

Configuración del enlace

Editamos el fichero /etc/bluetooth/hcid.conf para que contenga los siguientes valores de configuración:

(Para el servidor sería el siguiente fichero (para el cliente sería igual, pero con las opciones que van comentadas con triple comentario o # # # delante): ).

#
# HCI daemon configuration file.
#
# $Id: hcid.conf,v 1.4 2004/04/29 20:14:21 holtmann Exp $
#

# HCId options
options {
        # Automatically initialize new devices
        autoinit yes;

        # Security Manager mode
        #   none - Security manager disabled
        #   auto - Use local PIN for incoming connections
        #   user - Always ask user for a PIN
        security auto;

        # Pairing mode
        #   none  - Pairing disabled
        #   multi - Allow pairing with already paired devices
        #   once  - Pair once and deny successive attempts
        pairing multi;

        # PIN helper
        pin_helper /bin/bluepin;

        # D-Bus PIN helper
        dbus_pin_helper;
}

# Default settings for HCI devices
device {
        # Local device name
        #   %d - device id
        #   %h - host name
        name "%h-%d";

        # Local device class
        ###class 0x120104;
        class 0x100;

        # Default packet type
        #pkt_type DH1,DM1,HV1;

        # Inquiry and Page scan
        iscan enable; pscan enable;

        # 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;
        #
        lm accept;

        # Default link policy
        #   none    - no specific policy
        #   rswitch - allow role switch
        #   hold    - allow hold mode
        #   sniff   - allow sniff mode
        #   park    - allow park mode
        #
        #lp hold,sniff;
        #
        ###lp rswitch,hold,sniff,park;
        lp hold,sniff,park;

        # Authentication and Encryption
        #auth enable;
        #encrypt enable;
}

Estableciendo el enlace bnep0

A continuación configuramos pand para permitir conexiones entrantes en el caso del servidor y para conectarse al servidor remoto de forma continuada en el caso del cliente, mediante el fichero /etc/sysconfig/pand en caso de Mandrake o /etc/default/bluez-pan.

Para el servidor:

$ cat /etc/default/bluez-pan.
DUND_ENABLED=0
PAND_ENABLED=1
PAND_OPTIONS="-s -M --role=NAP"

Para el cliente:

$ cat /etc/sysconfig/pand
PANDARGS='--role=PANU --search --persist --encrypt'

Para que el BT USB funcione hay que asegurarse de que:

  • El servicio /etc/init.d/bluetooth ha sido arrancado.
  • El servicio /etc/init.d/pand ha sido arrancado.
  • El BT-USB está pinchado y ha sido detectado (ver logs).

Así pues, desconectamos el BT-USB, paramos ambos servicios y los arrancamos en ese orden (que será el mismo en que arrancaría al iniciar el PC).

Al hacer esto en ambos PCs, podremos ver en el fichero /var/log/messages cómo se establece un diálogo con el siguiente aspecto (en el servidor):

Portatil:

tatil pand[3683]: Inquiring
tatil pand[3683]: Searching for NAP on 00:60:57:8E:63:B2
tatil pand[3683]: Searching for NAP on 00:80:A5:03:8C:2D
tatil pand[3683]: Connecting to 00:80:A5:03:8C:2D
tatil pand[3683]: bnep0 connected

Servidor:

compiler pand[4247]: New connection from 00:80:A5:03:8C:41 bnep0

En el cliente vemos un diálogo de búsqueda de dispositivos, conexión con el dispositivo remoto y establecimiento del dispositivo bnep0, mientras que en el servidor vemos la conexión establecida.

Al levantar el dispositivo bnep0 se ejecuta el script de /etc/bluetooth/pan/dev-up (creadlo y dadle +x), que contendrá los comandos para levantar la IP deseada en el dispositivo bnep0. En mi caso tengo 192.168.6.1 para el servidor y 192.168.6.69 para el cliente (portatil):

Para el servidor:

$ cat /etc/bluetooth/pan/dev-up
#!/bin/sh
/sbin/ifconfig bnep0 192.168.6.1
/sbin/route add 192.168.6.69 dev bnep0

$ cat /etc/bluetooth/pan/dev-down
#!/bin/sh

ifconfig bnep0 down
route del 192.168.6.69

Para el cliente:

$ cat /etc/bluetooth/pan/dev-up
#!/bin/sh
/sbin/ifconfig bnep0 192.168.6.69
/sbin/route add 192.168.6.1 dev bnep0

$ cat /etc/bluetooth/pan/dev-down
#!/bin/sh

ifconfig bnep0 down
route del 192.168.6.1

Estos scripts levantarán las IPs y las rutas para el nuevo interfaz bnep0. Tras esto ya podremos hacer ping entre las máquinas.

Recomiendo añadir las máquinas al /etc/hosts para mayor comodidad al nombrarlas. Por ejemplo, en el servidor:

$ grep 192.168.6 /etc/hosts
192.168.6.69    tatil-bt
192.168.6.1     compiler-bt

Dando routing a Internet

En el script dev-up del servidor podemos, aparte de levantar la interfaz, añadir reglas de firewall sobre bnep0 o activar IP forwarding e IP Masquerade, para compartir la conexión a Internet. Con esto, aparte de que nuestro portatil pueda hacer ping, telnet, ssh, y VNC (entre otros) al servidor, tambien podremos salir directamente a Internet desde el portatil.

En mi caso al principio no necesité masquerade, porque con VNC podía conectar al servidor y hacer de todo, pero al final lo activé por comodidad.

Basta con las siguientes reglas de fw en mi red de ejemplo:

 #bluetooth
 #sromero 03-02-2005
 echo "Adding bluetooth network rules"
 echo "1" > /proc/sys/net/ipv4/ip_forward
 ${IPTABLES} -A INPUT -s 192.168.6.69/32 -j ACCEPT
 ${IPTABLES} -t nat -A POSTROUTING \
             -s 192.168.6.69/32 -o eth0 -j MASQUERADE
 ${IPTABLES} -A FORWARD -i bnep0 -o eth0 -j ACCEPT
 ${IPTABLES} -A FORWARD -o bnep0 -i eth0 -j ACCEPT

 ${IPTABLES} -t nat -A POSTROUTING \
             -s 192.168.6.69/32 -o eth1 -j MASQUERADE
 ${IPTABLES} -A FORWARD -i bnep0 -o eth1 -j ACCEPT
 ${IPTABLES} -A FORWARD -o bnep0 -i eth1 -j ACCEPT

El routing a eth0 da acceso a internet, mientras que el acceso a eth1 da al portatil acceso a la red local pinchada al servidor. En resumen: desde mi portatil llego al servidor, llego a Internet, y llego al resto de PCs de la red, y todo con 2 pequeños dispositivos USB que aprox. 10-15 euros cada uno.


<Volver a la sección de GNU/Linux>