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

viernes, 28 de noviembre de 2014

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

Bueno, pues en la anterior entrada teníamos que nuestra tarjeta D-Link AirPlus DWL-G520 [168c:0013] no era compatible con hostapd usando el driver estándar ath5k. A punto de tirar la toalla me acordé de los viejos drivers madwifi, que antaño soportaban las tarjetas con chip Atheros AR5XXX e incluían soporte para, dicho de forma políticamente correcta, monitorizar la seguridad de las redes inalámbricas. Parece ser que desde 2009 esos drivers ya no se desarrollan, pero no perdía nada con intentarlo.

La primera prueba que hago es descargar la última versión, descomprimiéndola sobre /root y compilando desde dentro de su directorio con:

make clean
make

vaya, pues con esto veo que salen muchos errores de compilación. La respuesta sencilla: este código fuente está abandonado y no va con kernels nuevos. Afortunadamente buscando un poco más encontré que un heroico resistente llamado Pavel Roskin ha ido adaptando el código fuente para que siga funcionando en nuevos kernel.

Lo descargamos de su github:

wget https://github.com/proski/madwifi/archive/master.zip

Una vez descargado lo descomprimimos. También descargamos, si no los tenemos ya, linux-headers, linux-source y build-essentials para tener un entorno completo de compilación de módulos del kernel como indicamos en la entrada anterior.

Antes de seguir recordemos que es conveniente copiar la configuración del kernel actual en ejecución sobre los headers y src que hemos bajado:

cp /boot/System.map-3.16-0.bpo.2-amd64 /usr/src/linux-headers-3.16-0.bpo.2-amd64/System.map
cp /boot/config-3.16-0.bpo.2-amd64 /usr/src/linux/.config

Ahora entramos en el directorio recién creado en la descompresión, llamado madwifi-master, y hacemos:

cd /root/madwifi-master
make clean
make

Toma... se compila perfectamente. Bueno, pues vamos a instalar:

make install

Ya tengo el driver instalado. Si leemos la documentación, el módulo creado no se llama ath5k, sino ath_pci y el dispositivo de red que crea no es wlan0 sino ath0. Pero antes de cargarlo hay que hacer cierta configuración adicional. En /etc/modprobe.d/ath_pci.conf ponemos:

options ath_pci autocreate=ap

En /etc/modprobe.d/ath5k.conf:

blacklist ath5k
blacklist ath
blacklist mac80211
blacklist cfg80211

Para impedir al kernel cargar el módulo ath5k y sus asociados. Además de esto si hacíamos referencia a wlan0 en algún fichero de configuración (por ejemplo, /etc/network/interfaces, /etc/default/isc-dhcp-server,....) habría que cambiarlo por ath0.

Reiniciando el PC veremos con::

lsmod | grep ath

que se ha cargado en memoria el módulo ath_pci y con:

ifconfig ath0

que se ha creado la tarjeta de red ath0.

Con

iwconfig ath0 mode master

vemos que se pone en modo master sin rechistar. Esto pinta bien.

Por otro lado, configuramos hostapd según ya vimos o según estas instrucciones, dejando /etc/hostapd/hostapd.conf tal que así:

# cat /etc/hostapd/hostapd.conf
bridge=br0
driver=madwifi
ssid=WIFI1
interface=ath0
channel=1
hw_mode=g
country_code=ES

#WPA Mas debil
auth_algs=1
wpa=1
wpa_passphrase=clave1792

#WPA Fuerte.
#auth_algs=1
#wpa=3
#wpa_passphrase=A13B25ZG31414
#wpa_key_mgmt=WPA-PSK
#wpa_pairwise=TKIP
#rsn_pairwise=TKIP
#######Esta parece que no iba bien con madwifi rsn_pairwise=CCMP
macaddr_acl=0
#macaddr_acl=1
#accept_mac_file=/etc/hostapd/hostapd.accept
ap_max_inactivity=21600

#ieee80211n=1
wmm_enabled=1

#ht_capab=[SHORT-GI-40][DSSS_CCK-40]

En mi caso tengo un bridge con eth0, por lo que /etc/network/interfaces pinta así:

# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo eth3 br0
iface lo inet loopback

iface eth3 inet dhcp
        ifup eth3
        post-up /sbin/ethtool -s $IFACE wol g
        post-down /sbin/ethtool -s $IFACE wol g

iface eth0 inet manual
iface ath0 inet manual
iface br0 inet static
       bridge_maxwait 0
       bridge_stp off
       bridge_ports eth0 ath0
       address 192.168.0.254
       netmask 255.255.255.0
       broadcast 192.168.0.255

Y para repartir IP con el DHCP tenemos:

# cat /etc/default/isc-dhcp-server
# Defaults for isc-dhcp-server initscript
# sourced by /etc/init.d/isc-dhcp-server
# installed at /etc/default/isc-dhcp-server by the maintainer scripts

#
# This is a POSIX shell fragment
#

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPD_CONF=/etc/dhcp/dhcpd.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPD_PID=/var/run/dhcpd.pid

# Additional options to start dhcpd with.
#    Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#    Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="eth0 ath0 br0"

Con todo ya preparadito, procedemos a arrancar de nuevo el hostapd a mano en modo debug, para ver todos los mensajes:


#/usr/sbin/hostapd -dd /etc/hostapd/hostapd.conf

hostapd -dd /etc/hostapd/hostapd.conf
random: Trying to read entropy from /dev/random
Configuration file: /etc/hostapd/hostapd.conf
Line 2: invalid/unknown driver 'madwifi'
1 errors found in configuration file '/etc/hostapd/hostapd.conf'
Failed to set up interface with /etc/hostapd/hostapd.conf
hostapd_init: free iface 0x1190590
Failed to initialize interface

Dobleplushorror: el hostapd que trae mi sistema no soporta el driver madwifi. Indagando descubro que el mantenedor del paquete compilado ha optado por no incluir (desactivándolo) el soporte al driver madwifi, seguramente por considerarlo obsoleto.

Nos descargamos pues el código fuente de la páquina web del paquete Debian, en https://packages.debian.org/wheezy/hostapd. En la parte derecha tenemos el enlace para "Download Source Package wpa" (el paquete hostapd se construye desde el paquete de código fuente wpa, parece ser).

wget http://security.debian.org/debian-security/pool/updates/main/w/wpa/wpa_1.0.orig.tar.gz

Otra opción es bajarlo desde esa tabla de salvación para los enredas que es snapshot.debian.org, que guarda copia de todos los paquetes que hayan pasado por Debian en cualquier momento:

wget http://snapshot.debian.org/archive/debian/20120512T134750Z/pool/main/w/wpa/wpa_1.0.orig.tar.gz

Una vez descargado, lo descomprimimos y seguimos los siguientes pasos:

1) Entramos en el directorio creado:

cd wpa-1.0/
cd hostapd/

2) Copiamos el fichero defconfig sobre .config y editamos la parte referente a madwifi, que esta comentada. Son dos lineas: una para activar el madwifi y otra para indicar la ruta donde están el código fuente de madwifi

cp defconfig .config
nano .config

Descomentamos dejando así el fichero:

...
# Driver interface for madwifi driver
CONFIG_DRIVER_MADWIFI=y
CFLAGS += -I../../madwifi # change to the madwifi source directory
...

3) El código fuente de los drivers de madwifi usados (ya descargados y compilados antes) deben estar en la ruta ../../madwifi para la compilación, si no dará error.

cd ../../
ln -sf madwifi-master madwifi

4) Hay que instalar previamente los paquetes libnl-dev y libssl-dev para que compile.

apt-get install libnl-dev libssl-dev

5) La compilación se hace con:

cd /root/wpa-1.0/hostapd/
make

6) Se generan dos ejecutables: hostapd y hostapd_cli, que copiamos directamente sobre los que vienen en el paquete original instalado en /usr/sbin, no me apetece reempaquetar.

cp hostapd /usr/sbin/hostapd
cp hostapdcli /usr/sbin/hostapdcli

Ahora arrancamos:

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

..et voilá!, funcionando.

En las pruebas preliminares ya se detecta el punto de acceso creado. Me llevé un pequeño susto al conectar a él y ver que la conexión se caía continuamente, con mensajes como estos en el syslog:

Nov 24 12:55:07 A99-PRO hostapd: ath0: STA 28:e3:47:41:41:93 IEEE 802.11: associated
Nov 24 12:55:07 A99-PRO hostapd: ath0: STA 28:e3:47:41:41:93 RADIUS: starting accounting session 54731AFB-00000016
Nov 24 12:55:09 A99-PRO hostapd: ath0: STA 70:05:14:d8:6c:37 IEEE 802.11: associated
Nov 24 12:55:09 A99-PRO hostapd: ath0: STA 70:05:14:d8:6c:37 RADIUS: starting accounting session 54731AFB-00000017
Nov 24 12:55:12 A99-PRO hostapd: ath0: STA 28:e3:47:41:41:93 IEEE 802.11: disassociated
Nov 24 12:55:14 A99-PRO hostapd: ath0: STA 28:e3:47:41:41:93 IEEE 802.11: associated
Nov 24 12:55:14 A99-PRO hostapd: ath0: STA 28:e3:47:41:41:93 RADIUS: starting accounting session 54731AFB-00000018
Nov 24 12:55:19 A99-PRO hostapd: ath0: STA 28:e3:47:41:41:93 IEEE 802.11: disassociated

Entonces me di cuenta de que había quitado la antena a la tarjeta de red y la conexión era muy débil e inestable por eso. Puse la antena en su sitio y desapareció el problema.

Profundizando mas en las pruebas me di cuenta de que el filtrado MAC no funcionaba: aunque lo activase en hostapd.conf se aceptaba cualquier cliente con clave correcta. La causa está en que el driver madwifi ignora ese parámetro. No problem, hay otra manera de hacerlo usando el comando iwpriv del paquete  wireless-tools, ya que los drivers madwifi ofrecen soporte para dicho comando. Nos hacemos un script como éste, en el cual añadimos la lista de MACs aceptadas:

#/bin/bash

iwpriv ath0 maccmd 3
iwpriv ath0 maccmd 1
iwpriv ath0 addmac 00:11:22:33:44:55
iwpriv ath0 addmac 00:11:22:33:44:56
....

Y nos aseguramos de ejecutarlo en el inicio del sistema (por ejemplo desde /etc/rc.local).

Otros parámetros de iwpriv:

Modo de autenticación:

  • iwpriv ath0 authmode 1 : autenticación abierta
  • iwpriv ath0 authmode 2 : autenticación de clave compartida
  • iwpriv ath0 authmode 3 : autenticación 802.1x

Manipulando la lista blanca/negra de MACs:

  • iwpriv ath0 maccmd 4 : desactivar la lista MACs
  • iwpriv ath0 maccmd 3 : limpiar la lista MACs
  • iwpriv ath0 maccmd 1 : la lista de MACs es una lista blanca
  • iwpriv ath0 maccmd 2 : la lista de MACs es una lista negra
  • iwpriv ath0 maccmd 0 : no usar lista de MACs
  • iwpriv ath0 addmac 00:11:22:33:44:55 : añadir una MAC a la lista
  • iwpriv ath0 delmac 00:11:22:33:44:55 : borrar una MAC a la lista
  • iwpriv ath0 kikmac 00:11:22:33:44:55 : desasociar la MAC del punto de acceso
  • No hay comando para sacar la lista de MACs, por desgracia.

Bloquear un modo específico:

  • iwpriv ath0 mode 11a : usar solo 11a
  • iwpriv ath0 mode 11b : usar solo 11b
  • iwpriv ath0 mode 11g : usar solo 11g
  • iwpriv ath0 mode 0   : (defecto) autoseleccionar modo

Por desgracia, no tengo infraestructura montada para probar si funciona con Radius, pero me lo guardo para probarlo en el futuro.

Bueno, pues ya podemos montar wifis a tutiplén con esta tarjeta. Hasta la próxima entrada que... será de Windows.

 

No hay comentarios:

Publicar un comentario