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.