"Después del juego es antes del juego"
Sepp Herberger

viernes, 21 de noviembre de 2014

Montar un punto de acceso en Debian Wheezy con ath5k y una tarjeta AirPlus DWL-G520 Wireless (Parte 1 de 2)

En los IES de Extremadura normalmente montamos nuestros puntos de acceso para los portátiles de los alumnos en los servidores de aula con tarjetas D-Link DWA-556 Xtreme N, que tienen esta salida lspci:

05:00.0 Network controller [0280]: Atheros Communications Inc. AR5008 Wireless Network Adapter [168c:0024] (rev 01)
Subsystem: D-Link System Inc Device [1186:3a70]
Flags: bus master, fast devsel, latency 0, IRQ 19
Memory at fe9f0000 (64-bit, non-prefetchable) [size=64K]
Capabilities: [40] Power Management version 2
Capabilities: [50] MSI: Enable- Count=1/1 Maskable- 64bit-
Capabilities: [60] Express Legacy Endpoint, MSI 00
Capabilities: [90] MSI-X: Enable- Count=1 Masked-
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Virtual Channel
Kernel driver in use: ath9k

estas tarjetas están soportadas por hostapd y se pueden configurar sin problema según se explica en esta entrada del blog.

El reto se me presentó al intentar montar un punto de acceso con una tarjeta PCI Dlink DWL-G520, ya que tenía varias ociosas en el almacen. Su salida lspci es:

06:01.0 Ethernet controller [0200]: Atheros Communications Inc. Atheros AR5001X+ Wireless Network Adapter [168c:0013] (rev 01)
Subsystem: D-Link System Inc AirPlus DWL-G520 Wireless PCI Adapter (rev. B) [1186:3a13]
Flags: bus master, medium devsel, latency 168, IRQ 17
Memory at febf0000 (32-bit, non-prefetchable) [size=64K]
Capabilities: [44] Power Management version 2
Kernel driver in use: ath5k

Estas tarjetas las había usado antes sin problema como cliente inalámbrico en equipos donde no llegan los puntos de red cableada. ¿Podrían funcionar como puntos de acceso con hostapd?. Manos a la obra.

El driver que usan es ath5k, tal como podemos ver en la salida lspci, y el dispositivo de red creado es wlan0. Lo primero que hice fue montar hostapd en el equipo, configurarlo como hemos dicho  y arrancarlo a mano con la opción -d para ver los mensajes de traza:

/usr/sbin/hostapd -d /etc/hostapd/hostapd.conf

La salida es:

..............
Allowed channel: mode=0 chan=5 freq=2432 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=6 freq=2437 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=7 freq=2442 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=8 freq=2447 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=9 freq=2452 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=10 freq=2457 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=11 freq=2462 MHz max_tx_power=20 dBm
Completing interface initialization
Mode: IEEE 802.11g  Channel: 6  Frequency: 2437 MHz
nl80211: Set freq 2437 (ht_enabled=1 sec_channel_offset=0)
nl80211: Failed to set channel (freq=2437): -22 (Invalid argument)
Could not set channel for kernel driver
wlan0: Unable to setup interface.
Flushing old station entries
Deauthenticate all stations
nl80211: Remove interface ifindex=14
netlink: Operstate: linkmode=0, operstate=6
nl80211: Set mode ifindex 6 iftype 2 (STATION)

Pumba, la primera en la frente. Traducido tras googlear un rato: el error es que el el driver nl80211 de hostapd no es capaz de seleccionar canal para el punto de acceso. En Internet no se daba ninguna respuesta al problema. Por si las moscas, miro si la tarjeta soporta modo AP (es decir, si puede convertirse en un punto de acceso):

# iw list

.....
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* monitor
* mesh point
.....

Parece que si soporta ser AP (punto de acceso)... Vamos a intentar ponerla en modo "master", que es el modo correspondiente a un punto de acceso, a mano:

# iwconfig wlan0 mode master
Error for wireless request "Set Mode" (8B06) :
SET failed on device wlan0 ; Invalid argument.

Nada, parece ser que el driver ath5k que tengo (el del kernel 3.16) no lo soporta y no pinta bien la cosa.

Aparentemente, la única opción que tenía era probar distintas versiones del kernel y el driver, instalando otros kernel y distintos driver compilados desde el código fuente de compat-wireless (que es el subproyecto del kernel que soporta las tarjetas wifi). Para hacer todo esto hay que preparar una infraestructura básica consistente en instalar las build-essentials, el linux-header y el linux-source asociado a nuestro kernel. En mi caso es el kernel usado es:

# cat /proc/version
Linux version 3.16-0.bpo.2-amd64 (debian-kernel@lists.debian.org) (gcc version 4.6.3 (Debian 4.6.3-14) ) #1 SMP Debian 3.16.3-2~bpo70+1 (2014-09-21)

Este kernel no es el que viene con la distribución, lo bajé de https://packages.debian.org/wheezy-backports/linux-image-3.16-0.bpo.2-amd64 e instalé a mano con dpkg -i, por motivos que no vienen al caso. Por tanto, no podemos instalarlo con un apt-get sencillo, tendremos que bajar los paquetes e instalarlos nosotros mismos.

Bueno, primero bajamos e instalamos build-essential:

apt-get install build-essential

Descargamos e instalamos los headers correspondientes a nuestro kernel con dpkg -i:

# wget https://packages.debian.org/wheezy-backports/linux-headers-3.16-0.bpo.2-amd64.deb
# dpkg -i linux-headers-3.16-0.bpo.2-amd64.deb

Descargamos el código fuente de https://packages.debian.org/wheezy-backports/linux-image-3.16-0.bpo.2-amd64. En la parte derecha está el "Download Source Package" que apunta al fichero con el código fuente en la URI:

http://ftp.de.debian.org/debian/pool/main/l/linux/linux_3.16.5.orig.tar.xz:

Como no es un paquete .deb con las rutas finales ya establecidas, debemos colocarnos en /usr/src para bajarlo y descomprimirlo, y crear luego el enlace /usr/scr/linux apuntando al directorio donde está dicho código fuente:

# cd /usr/src
# wget http://ftp.de.debian.org/debian/pool/main/l/linux/linux_3.16.5-1~bpo70+1.debian.tar.xz
# 7z x linux_3.16.5.orig.tar.xz
# tar xfv linux_3.16.5.orig.tar
# ln -sf linux-3.16.5/ linux
# cp /boot/config-3.16-0.bpo.2-amd64 /usr/src/linux/.config
# cp /boot/System.map-3.16-0.bpo.2-amd64 /usr/src/linux-headers-3.16-0.bpo.2-amd64/System.map

Las dos últimas líneas son para que la compilación de los drivers se haga con la misma configuración del sistema que tenemos funcionando la máquina y con el cual la hemos arrancado. Es lo usual cuando hacemos este tipo de tareas, ya que si no tendríamos que configurar las cientos de opciones de configuración del kernel una a una y a mano.

En el caso de que el fichero que busquemos no esté en http://packages.debian.org porque haya sido retirado de allí, siempre podemos buscar en esa joya que es  http://snapshot.debian.org, donde hay un histórico de todos los paquetes que alguna vez han estado en un repositorio de Debian desde el inicio de los tiempos.

Una vez preparado el entorno, se descargan las distintas versiones de compat-wireless de:

http://wireless.kernel.org/en/users/Download/stable/

se descomprimen en /root y se compilan e instalan según las instrucciones de:

https://backports.wiki.kernel.org/index.php/Documentation/compat-drivers#Buildingandinstalling

Al reiniciar el sistema cogerá los nuevos drivers y podremos probar si hostapd lo soporta.

Aprendí algo en este proceso: los drivers nuevos que generemos a veces se meten en /lib/modules/<kernel>/udpates, sin sobreescribir los antiguos (que seguirán en /lib/modules/<kernel>/....) , por lo que hay que poner en /etc/depmod.conf

search updates built-in

para que se carguen preferentemente los drivers compilados por nosotros antes que los que vienen de serie con el kernel.

Por no enrollarme con mis penurias: todo fue un fracaso, no había manera de que hostapd funcionase, probé distintos kernels y distintas versiones de los drivers, mas antiguas y mas modernas, compilados a mano para dichos kernels. Obtenía siempre el mismo error o bien bonitos kernel panics.

Estaba a punto de tirar la toalla cuando recordé algo ... ¿no había un proyecto de drivers antiguos para tarjetas Atheros que se usaban para monitorizar redes inalámbricas?....

To be continued la próxima entrada.....

No hay comentarios:

Publicar un comentario