[Mdk 10.1] Configurar una red Bluetooth en Mandrake y Debian GNU/Linux
Esta semana pasada configuré una red Bluetooth con 2 dispositivos USB Bluetooth de 22 euros cada uno: los Conceptronics CBT100U (alcance de 100 metros). Estos dispositivos son bastante baratos y me han permitido montar una red inalámbrica fácilmente entre mi servidor Debian Woody y mi portátil MandrakeLinux 10.1, permitiéndo a este el acceso a Internet así como al resto de equipos de mi red local.
En este artículo explico paso a paso cómo he realizado la configuración.
Tendréis siempre una versión actualizada del Howto en mi página web:
http://pinsa.escomposlinux.org/sromero/linux/bluetooth_ht.php
En cualquier caso, voy a reproducir aquí la versión actual del howto para los lectores de BlogDrake:
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.
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 entre 2 dispositivos
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.
20 euros cada uno.
Santiago Romero
NoP/Compiler





# 26688: y porque no lo agrgan en los libros
esta muy buena la informacion
Un espacio para Juliuss.
# 26697: Porque se traspapeló
Gracias por el recordatorio ;-)
Sólo añadir que, en la actualizad, en teoría hotplug ya no es necesario, udev hace lo necesario por sí mismo.
Saludos
¡BUGs!
JID: pacho@jabber-hispano.org
El Blog de Pacho