Habilitar Roaming en APs con diferentes ESSIDs
Contenido
Que significa itinerancia o roaming.
Roaming es la capacidad de cambiar de un área de cobertura a otra sin interrupción en el servicio o pérdida en conectividad. Para que esto sea posible debe existir un área de solapamiento en el que el cliente puede recibir el servicio desde diferentes puntos. [1]
La forma más habitual de dar este servicio es distribuyendo APs a lo largo de una estancia de tal forma que la red queda definida por un único ESSID y un conjunto de BSSIDs. Habitual en universidades/empresas ... pero no es mi caso :(
Mi situación
Dispongo de 2 APs, con ESSIDs diferentes y mi intención es pasar de conectarme a un AP a conectarme al otro, sin perder paquetes.
Por experiencia sé que, al menos en Squeeze, tanto Network-Manager como Wicd manejan mal el tema del roaming y se pierden cierto numero de paquetes. Pero esto si la red no cambia de ESSID.
Para realizar la prueba tengo que parar mi gestor habitual de conexiones (Wicd), para lo que ejecuto:
insserv -r wicd sed -i '/^START_DAEMON/ s/yes/no/' /etc/default/wicd
Ahora editamos el archivo /etc/network/interfaces para que el servicio networking administre nuestra tarjeta wifi (wlan0). En Squeeze, si usas Network-Manager como gestor de conexión basta con editar este archivo para evitar que Network-Manager tome el control de la interfaz wifi [2].
auto wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/roam.conf
Es importante fijarse en manual, ya que solo se puede usar el wpa-roam si la interfaz está configurada de esta forma.
El archivo roam.conf
Llega lo interesante.
Este archivo guarda la configuración de wpa_supplicant para conectarse a cierto AP. Así tendremos, dentro de este archivo, tantos network como ESSIDs tengamos en nuestra malla. En mi caso 2.
Como no voy a pararme con la configuración de wpa_supplicant os dejo dos enlaces para que os informéis de lo que es necesario según el caso. [3] y [4]
Es necesario añadir esta línea al inicio del archivo:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
de donde:
- DIR indica la ruta donde se encuentra los sockets de wpa_supplicant.
- GROUP con el asignamos el grupo que tiene permisos para administrar wpa_supplicant con herramientas como wpa_cli o wpagui
Para poder añadir configuraciones nuevas, así como modificar las que ya están, sin tener que parar y levantar el servicio, debemos añadir update_config=1 al archivo roam.conf
En mi caso, con una configuración bastante sencilla, el archivo me quedó parecido a este:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev network { ssid="AP_1" psk="La contraseña" id_str="primer_ap" } network { ssid="AP_2" psk="La otra contraseña" id_str="segundo_ap" }
Muy importante las líneas id_str ya que estas unen una configuración de red con una configuración de wpa_supplicant.
De nuevo el archivo interfaces
Una vez que acabamos con el archivo roam.conf volvemos a editar el archivo /etc/network/interfaces.
Nuestra configuración no solo puede variar en cuanto a ESSIDs, sino que puede también variar respecto a ip, dns, rutas....
Vamos a añadir la configuración primer_ap y segundo_ap.
iface primer_ap inet dhcp iface segundo_ap inet static address 192.168.220.100 netmask 255.255.255.224 gateway 192.168.220.97
Se puede establecer cualquier configuración que fuese necesaria, pero debemos respetar los id_srt establecidos en roam.conf'.
Levantando el servicio
Ahora como root, o con sudo, ejecutaremos:
service networking restart
y, si no da ningún error, ya lo tenéis funcionando.
Pruebas
Para comprobar que funciona correctamente podemos, en una zona solapada, ejecutar en una terminal ping 8.8.8.8 y en otra tail -f /var/log/syslog. Ahora nos dedicamos a dar unas vueltas de forma que se pierdan las señales de un u otro AP y debemos ver que el ping no pierde paquetes.
Enlaces
[1] http://www.adrformacion.com/cursos/wifi/leccion3/tutorial3.html
[2] http://wiki.debian.org/NetworkManager#Wired_Networks_are_Unmanaged
[3] http://www.esdebian.org/wiki/configuracion-manual-wpasupplicant
[4] http://wiki.debian.org/WiFi/HowToUse#wpa_supplicant
Realizado tras leer http://ubuntuforums.org/showthread.php?t=1259003