martes, 14 de febrero de 2012

Script para conectarse a la red eduroam de la Universidad de Valladolid desde Linux con wpa_supplicant

Aviso: El método que pongo en esta entrada es mucho más engorroso que utilizar la manera que pongo aquí y no siempre funciona, por lo que te recomiendo la otra entrada para hacerlo con wicd. De todas formas dejo esto como curiosidad por si a alguien le vale.

Para el que no lo sepa, en muchas universidades a nivel mundial existe un servicio de conexión unificado mediante una red wi-fi con SSID "eduroam" el cual está pensado para que cada universitario tenga un nombre de usuario de la forma XXXXXXXX@uva.es (cambiando la parte final según la universidad a la que pertenezca: "uva.es" en el caso de la Universidad de Valladolid) y una contraseña personal de forma que es posible conectarse con tales datos en cualquier universidad del mundo con este SSID, sin necesidad de registro previo cada vez, lo cual está muy bien a nivel de movilidad.

Pero hay algo que curiosamente NO tienen unificado: el método de encriptación de la red. WPA, WPA2, TKIP, AES, TTLS, PAP, MSCHAPV2, CCMP bla bla bla bla bla......

Esto es un gran error, Internet está plagado de tutoriales personalizados para cada Universidad, con configuraciones que no valen para otras... Y en concreto para el eduroam de la UVa, no he encontrado ningún tutorial con los datos correctos, exceptuando este que sólo es válido en caso de que utilicemos Gnome en nuestra distribución, como es el caso de la archiconocida Ubuntu, Debian u otras, ya que utiliza el gestor gráfico de redes de Gnome, que por cierto es muy bueno y tiene todas las opciones necesarias para la conexión, a diferencia del de KDE por ejemplo.

Pero yo voy al caso general de cualquier distribución Linux, mediante el programa wpa_supplicant exclusivamente, ya que tal vez no tengamos el gestor de Gnome o no lo queramos utilizar por diferentes motivos. Debo decir que la configuración de wpa_supplicant necesaria la obtuvo por experimentación un amigo mío de la universidad, Luis Javier G. cuya pequeña web podéis ver clicando sobre su nombre, y que yo sólo me limito a distribuir públicamente la información.


Programas necesarios:

  • wpa_supplicant
  • Un cliente DHCP
  • wireless-tools

¿Qué es wpa_supplicant? Es un programa libre que permite a un sistema Linux conectarse a redes wi-fi que posean protección WPA o WPA2, siempre y cuando tengamos bien configurada la tarjeta wi-fi, lo que queda fuera de este manual.

También necesitaremos un cliente DHCP, que es el encargado de recibir una dirección IP desde el router de la uni y así poderte conectar. En Linux existen unos cuantos, como dhcpcd, pump, dhclient... Todos funcionan bien y muy parecido, por lo que elegir uno u otro es una cuestión más bien de gusto. Yo recomiendo el último.

Y en cuanto a wireless-tools, es un conjunto de utilidades para redes wi-fi en Linux, necesario para llevar a cabo ciertas operaciones sobre los interfaces de red.

Para instalarlos, simplemente ejecutamos como root o superusuario (o con sudo delante) el comando adecuado de instalación de paquetes de tu distribución, por ejemplo:

Debian/Ubuntu:

# apt-get install wpasupplicant wireless-tools dhcp
Gentoo:

# emerge -av wpa_supplicant wireless-tools dhcp
ArchLinux:

# pacman -S wpa_supplicant wireless-tools dhcp

(o bien cambiar dhcp por pump, dhcpcd o el que elijas. Recuerda que la # designa que el comando se ejecuta como root, y no hay que ponerla)

Etcétera, supongo que ya sabrás cómo instalar paquetes en tu distribución, es algo que está unos capítulos antes que "configurar una red WPA en la universidad" en el proceso de aprendizaje de Linux...


Configurando correctamente wpa_supplicant


El programa wpa_supplicant no tiene un bonito y precioso interfaz gráfico (lo siento para los amantes de esas cosas) pero NO PASA NADA, no es nada complicado de configurar y además, joven e inexperto linuxero con miedo a la terminal: Pierde ese miedo y descubre el PODER y las maravillas que puedes hacer con ella.

En fin, lo primero es crear un archivo de configuración al que llamaremos "eduroam.conf" en la carpeta "/etc/wpa_supplicant", lo cual sólo se puede hacer como root o superusuario de nuevo, debido a los permisos de esa carpeta. Así que ejecutamos:

# nano /etc/wpa_supplicant/eduroam.conf

En la ventana del editor de texto nano que aparecerá, simplemente copiamos y pegamos esto:

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
eapol_version=1
country=ES
filter_ssids=0
network={
                ssid="eduroam"
                key_mgmt=WPA-EAP
                eap=TTLS
                anonymous_identity="anonymous@uva.es"
                identity="AAAAAAAAAA@uva.es" # <- tu usuario
                password="BBBBBBBBBB" # <- tu clave
                phase2="auth=PAP"
}

(En la terminal se pega con CTRL + Shift + V)

Bien, ahora sustituye AAAAAAAAAA por tu nombre de usuario y BBBBBBBBBB por tu contraseña. En la UVa el usuario es una letra e seguida de tu NIF con la letra final minúscula. Ejemplo: Si tu NIF/DNI es 70072767-X, será "e70072767x"

Si no recuerdas o no dispones de la contraseña por ser nuevo alumno, la puedes obtener aquí.

Perfecto, ahora guardamos el archivo pulsando CTRL + O y luego Intro.

El siguiente paso es, obviamente, dirigirnos físicamente hasta una de las facultades de la UVa, ya que desde el sofá o el bar no llega la señal eduroam.



La conexión a eduroam propiamente dicha

Una vez que estamos en la facultad, en teoría lo único que haría falta sería ejecutar el programa wpa_supplicant, obtener una dirección IP, etc. Pero sin embargo para evitar problemas aquí dejo un script que lo hace todo por su cuenta, incluidas las comprobaciones necesarias para activar la red, comprobar si existe finalmente conexión a Internet, etc. El script también está hecho en su mayoría por mi amigo, con pequeños arreglos por mi parte para que todo funcione bien. Así que abrimos de nuevo un editor nano (esta vez no hacen falta permisos de root/superusuario):

$ nano ~/eduroam.sh

Y copypasteamos esto:

#!/bin/bash
ROOT=root
if [ $USER = $ROOT ]; then
## Variables importantes ##
CONF_FILE=/etc/wpa_supplicant/eduroam.conf
INTERFAZ=$(iwconfig 2>/dev/null | cut -f1 -d\ | sed '/^$/d')
PID_FILE=/var/run/wpa_supplicant/$INTERFAZ.pid
## Funcion llamada cuando algo falla durante la ejecución ##
function cancelar(){
        echo -ne "\tERROR: Operacion cancelada\n"
        echo -ne "\tDeshabilitando interfaz $INTERFAZ\t\t"
        ifconfig $INTERFAZ down 1>/dev/null 2>&1
        kill `cat $PID_FILE 1>/dev/null 2>&1` 1>/dev/null 2>&1
        rm $PID_FILE 1>/dev/null 2>&1
        sleep 1s
        echo -ne "[ OK ]\n"
}
if [ -n "$INTERFAZ" ]; then
        echo -ne "\tHabilitando interfaz $INTERFAZ\t\t"
        RED1=$(ifconfig | grep Ethernet | cut -d' ' -f1 | sed -n 1p)
        RED2=$(ifconfig | grep Ethernet | cut -d' ' -f1 | sed -n 2p)
        RED3=$(ifconfig | grep Ethernet | cut -d' ' -f1 | sed -n 3p)
        ifconfig $RED1 down 2>/dev/null
        ifconfig $RED2 down 2>/dev/null
        ifconfig $RED3 down 2>/dev/null
        ifconfig $INTERFAZ up
        sleep 1s
        echo -ne "[ OK ]\n\tConectando a la red eduroam e identificando...\t\t"
        killall wpa_supplicant 2> /dev/null
        EDUROAM=$(iwlist $INTERFAZ scan 2>&1 | grep eduroam)
        if [ -n "$EDUROAM" ]; then
                wpa_supplicant -B -Dwext -i $INTERFAZ -c $CONF_FILE -P $PID_FILE 1>/dev/null 2>&1
                sleep 10s
                RET=$(iwconfig 2>/dev/null | grep eduroam)
                if [ -n "$RET" ]; then
                        echo -ne "[ OK ]\n"
                else
                        echo -ne "[ FAIL ]\n"
                        echo -ne "\tRed eduroam detectada, pero no ha sido posible conectarse.\n"
                        cancelar
                        exit 1
                fi
        else
                echo -ne "[ FAIL ]\n"
                echo -ne "\tRed no encontrada en el escaneo. ¿Tienes cobertura de red?\n\tSi es la primera vez que te sale esto, reejecuta el script.\n"
                cancelar
                exit 1
        fi
        RET2=$(ping -c1 -W1 www.google.es | grep "bytes of data")
        if [ -n "$RET2" ]; then
                echo -ne "\tConectado.\n"
        else
                echo -ne "\tSolicitando IP con dhclient...\t"
                RET3=$(dhclient -v $INTERFAZ 2>&1 | grep ACK)
                if [ -n "$RET3" ]; then
                        echo -ne "[ OK ]\n\tConectado.\n"
                else
                        echo -ne "[ FAIL ]\n"
                        echo -ne "\tHa sido posible conectarse a eduroam, pero no hay Internet... Ni idea de lo que sucede.\n"
                        cancelar
                fi
        fi
else
        echo -ne "\tNo se han encontrado interfaces de red inalambricas.\n"
fi
else
        echo "Debes ejecutar este script con permisos de root. Utiliza \"sudo ./eduroam.sh\" o \"su -c \"./eduroam.sh\"\" para lanzarlo."
fi

He marcado una zona en rojo: La correspondiente al driver de la tarjeta wi-fi que utiliza wpa_supplicant.
El driver por defecto es wext (Wireless EXTensions) y en la mayoría de los casos funciona perfectamente. Sin embargo ciertas tarjetas, como algunas Atheros (como la mía, una Atheros AR9285) no se encuentran a gusto con este driver y prefieren otro, el nl80211. Probablemente no haya que tocar nada, pero si no funciona el script, prueba antes a cambiar el driver wext por alguno de estos:
  • hostap - Host AP driver (Intersil Prism2/2.5/3).
  • hermes - Agere Systems Inc. driver (Hermes-I/Hermes-II).
  • madwifi - MADWIFI 802.11 support (Atheros, etc.).
  • atmel - ATMEL AT76C5XXx (USB, PCMCIA).
  • wext - Linux wireless extensions (generic).
  • ndiswrapper - Linux ndiswrapper.
  • broadcom - Broadcom wl.o driver.
  • ipw - Intel ipw2100/2200 driver.
  • wired - wpa_supplicant wired Ethernet driver
  • roboswitch - wpa_supplicant Broadcom switch driver
  • bsd - BSD 802.11 support (Atheros, etc.).
  • ndis -Windows NDIS driver.
  • nl80211 - Linux nl80211/cfg80211

Una vez elegido el driver pulsamos CTRL + O para guardarlo, y le damos permisos de ejecución con:

$ chmod +x eduroam.sh
Si has seguido exactamente los pasos del manual, tendrás un archivo llamado eduroam.sh en tu carpeta personal, el cual en cuanto lo ejecutes te conectará sin problema (espero) a la red. Sólo puedes ejecutarlo como root, si no te dará un aviso, ya que no podrá ejecutar varios de los comandos que requiere. Para ejecutar, estando en nuestra carpeta home:

# ./eduroam.sh
o
$ sudo ./eduroam.sh
(si no estás logueado como root)

Una vez ejecutado, puedes cerrar esa terminal y la conexión no se irá.

En caso de utilizar Gnome o KDE puedes crear un lanzador en el escritorio (enlace a aplicación) con este comando:

gksudo ~/eduroam.sh
(Gnome)

o bien
kdesu ~/eduroam.sh
(KDE)

para poder conectarte con un clic, pero no verás los mensajes de éxito/error que saldrían por consola y tendrás que confiar en tu intuición, esperar unos segundos y comprobar si hay conexión.

Ya para despedirme, si a la primera el script da alguna especie de fallo, puedes intentar ejecutarlo dos o tres veces seguidas, y tal vez mágicamente se corrija.

Espero que a alguien le sirva, ¡un saludo!

No hay comentarios:

Publicar un comentario

Si te ha sido útil, por favor, comenta, me haces ver que lo que pongo aquí sirve para algo, un saludo :)