WPA Supplicant (Español)

From ArchWiki
Revision as of 09:47, 15 June 2012 by Kynikos.bot (Talk | contribs) (rm temporary i18n template)

Jump to: navigation, search

Una red protegida por una llave WEP estatica puede ser facilmente comprometida por un hacker motivado. WPA corrige el problema de la llave estática, by changing it at a packet transmitted/recieved frequency, o después que haya pasado determinado tiempo. Este proceso es realizado por un demonio que esta altamente ligado al hardware wireless.

Drivers inferiores (particularmente aquellos usados mediante ndiswrapper) pueden causar mucha frustración cuando son usados con WPA supplicant, por lo que dentro de lo posible hay que usar hardware con un soporte adecuado y drivers de alta calidad.

Consideraciones

Este articulo asume que estas familiarizado con tu hardware, y eras capaz de encontrar el camino a travez de archivos de configuración y configurando el sistema. Es también crítico que hayas "leído y entendido" el artículo de Wireless Setup, ya que es la base de todo lo que se explicará aqui.

La versión anterior de este artículo se expandió en el uso de Arch Build System y los Perfiles de Red mencionados en Wireless Setup. Asumo que un mejor entendimiento del sistema siempre ayuda, pero tiende a desviar los objetivos, y finalmente afecta el ámbito del documento.

Finalmente, este documento no es un prerequisito si tu hardware funciona out of the box y es manejado por un demonio como networkmanager o similar. Si prefieres conectarte a la red utilizando una herramienta gráfica no deberias estar leyendo esto.

Instalación

Instala el demonio:

# pacman -S wpa_supplicant

Este paquete a sido construido para soportar un amplio rango de hardware wireless. Para tu información, aqui presento una lista, que puede ser obtenida ejecutando 'wpa_supplicant':

# wpa_supplicant
...

Driver list:

*HostAP
*Prism54
*Madwifi
*NDISWrapper
*AMTEL
*IPW (both 2100 and 2200 drivers)
*WEXT (Generic Linux wireless extensions)
*Wired ethernet

La mayoría del hardware wireless es soportado por wpa_supplicant por defecto. Aún si el fabricante del chipset no esta listado (que es el caso mas probable), puedes hacer uso de las Extensiones Wireless Genericas para conectarte a una red segura con WPA. Basado en mi experiencia particular, un 75% del hardware es soportado por WEXT, un 20% es compatible recompilando wpa_supplicant/drivers de hardware; desafortunadamente, el 5% restante es definitivamente incompatible. Hablaré de las incompatibilidades mas adelante, sin embargo si estas completamente desesperado, ABS siempre es una opción. WPA Supplicant está disponible en: /var/abs/core/support/wpa_supplicant.

Configurando y conectandose

/etc/wpa_supplicant.conf contiene toda las opciones de configuración para wpa_supplicant. Sus contenidos son bastante simples. aunque el archivo de ejemplo provisto es horriblemente obtuso. Para propositos de simplificación, logueate como root, y renombra el /etc/wpa_supplicant.conf por defecto. No es necesario en este punto.

# mv /etc/wpa_supplicant.conf /etc/wpa_supplicant.conf.original

Método dinamico: 'wpa_gui', 'wpa_cli'

Es posible configurar wpa_supplicant justo lo suficiente para que puedas configurar las conexiones de red con wpa_gui o wpa_cli (mira en "Gestión"), en vez de definir tus bloques de red en /etc/wpa_supplicant.conf. Necesitaras un archivo de configuración con las lineas:

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=network
update_config=1

Esta configuración permitira a los usuarios en el grupo network controlar wpa_supplicant mediante las interfases wpa_gui o wpa_cli, la variable update_config=1 permite a estos programas (wpa_cli, wpa_gui) modificar /etc/wpa_supplicant.conf para guardar nuevas redes o modificaciónes de redes existentes. Ahora debes iniciar wpa_supplicant:

# wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf -B

donde la opción -D especifica el driver wireless (que casi siempre es wext), -i la interfase (reemplaza wlan0 con el nombre de tu interfase wireless) y -c el archivo de configuración. -B le dice a wpa_supplicant que se ejecute como demonio. Deberas ejecutar wpa_supplicant como root (o con sudo), pero cualquier usuario en el grupo network puede ejecutar wpa_cli o wpa_gui.

Entonces ya deberias poder ejecutar wpa_cli o wpa_gui y agregar algunes redes para conectarte. Si prefieres ejecutar el archivo de configuración manualmente sigue leyendo. De hecho, parte de la siguiente información es algo importante aún si no defines tus redes en /etc/wpa_supplicant.conf, asi que deberias leerla de todas formas.

Método Clásico: /etc/wpa_supplicant.conf

El ssid y el password para tu red wireless encriptada debe ser codificado en una cadena hexadecimal. Lograr esto es realmente simple utilizando la utilidad wpa_passphrase, que forma parte del paquete de wpa_supplicant. Usa la sintaxis wpa_passphrase [ssid] "[password]"

  • Un ejemplo:
# wpa_passphrase mi_wireless "password_secreto"

This should generate something like the below:

network={
       ssid="mi_wireless"
       #psk="password_secreto"
       psk=5a5a4dabde69d62436b31894af8b0dbf4e40a5e377feb36aab842beb7f7ed5a3
}

Esta es la configuración básica requerida para hacer funcionar WPA. La primera linea es la apertura de la declaración de la red, la segunda el SSID del la estación a la que quieres conectarte, la 3ra linea es el password, y la cuarta la llave hexadecimal requerida para conectarse.

  • Utilizando wpa_passphrase, especifica tu SSID y password, y redirecciona la salida a /etc/wpa_supplicant.conf:
# wpa_passphrase mi_wireless "password_secreto" > /etc/wpa_supplicant.conf

cambiando los detalles donde aplique con tu información especifica. Esto entonces creará un /etc/wpa_supplicant.conf básico de la salida del comando wpa_passphrase.

Por ejemplo si usas el protocolo WPA2-Personal deberas agregar unas pocas lineas en la sección network:

network={
       ssid="mi_wireless"
       proto=RSN
       key_mgmt=WPA-PSK
       pairwise=CCMP TKIP
       group=CCMP TKIP 
       psk=5a5a4dabde69d62436b31894af8b0dbf4e40a5e377feb36aab842beb7f7ed5a3
}
Note: La información de la red se almacenará en formato de texto, asi que deberias cambiar los permisos del archivo /etc/wpa_supplicant.conf (ejemplo: chmod 0600 /etc/wpa_supplicant.conf para hacerlo solo leible por root), dependiendo de que tan consciente seas sobre seguridad.

Agregar una red adicional puede hacerse de la siguiente manera:

# wpa_passphrase ssid_adicional "password_adicional" >> /etc/wpa_supplicant.conf

El >> redireccionara y agregara la salida a /etc/wpa_supplicant.conf sin sobreescribir.

Hay un gran número de opciones disponibles para user que puedes investigar mirando al archivo de configuración original. En la mayoria de los casos se puede dejar las opciones por defecto y no especificar nada mas en la sección por el momento.

Finalmente, agrega esta linea adicional al principio de /etc/wpa_supplicant.conf con un editor de tu elección:

ctrl_interface=DIR=/run/wpa_supplicant GROUP=wheel

Si necesitas contectarte a varias redes solo define un bloque de red en el mismo archivo. Cambia la prioridad a voluntad, recordando que las prioridades con numeros mayores son probadas primero.

Ahora puedes probar conectarte manualmente.

Primero levanta la interfase Wi-Fi. Para el proposito de este ejemplo usaremos la interfase wlan0.

# ip link set wlan0 up

A continuación asocia la interfase con el SSID del punto de acceso:

# iwconfig wlan0 essid [ssid]

Una vez q la asociación es exitosa (después de unos 10 segundos en promedio) necesitas ejecutar wpa_supplicant para completar la asociación encriptada. Típicamente podras usar el driver WEXT (Wireless EXTensions) para wpa_supplicant, si no, deberias chequear como hacerlo con tu dispositivo en Internet.

Lanza el siguiente comando como root:

# wpa_supplicant -B -Dwext -i wlan0 -c /etc/wpa_supplicant.conf 

Esta sintaxis dice a wpa_supplicant que use la configuración de hardware por defecto (WEXT - Linux Wireless EXTensions) y que se asocie con el SSID especificado en /etc/wpa_supplicant.conf. Esta asociación también debe ser realizada a través de la interfase wireless wlan0 y el proceso debe moverse a segundo plano (-B). Para salida detallada agrega la opción -d o -dd (debug) para mostrar mas información en la consola. Puedes encontrar ejemplos adicionales aquí.

In la salida de la consola deberia haber una linea que diga 'Associated:' seguida por una dirección MAC. Lo único que se necesita ahora es una dirección IP. Como root ejecuta:

# dhcpcd wlan0
Note: *No* solicites una IP inmediatamente! Debes esperar para asegurar una asociación apropiada. Si usas un script puedes usar sleep 10s para esperar por 10 segundos.

Verifica que la interfase haya recibido una dirección IP usando iproute:

# ip addr show wlan0

   wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
   link/ether 00:1C:BF:66:4E:E0 brd ff:ff:ff:ff:ff:ff
   inet 192.168.0.62/24 brd 192.168.0.255 scope global eth0
   inet6 fe80::224:2bff:fed3:759e/64 scope link 
      valid_lft forever preferred_lft forever

Si la salida es similar a la de arriba, estas conectado. Si es asi puedes investigar como usar los scripts netcfg para configurar esto de una forma mas permanente y tenerlo funcionando cuando arrancas la computadora.

Dependiendo dela enfoque que hayas elegido para configurar el adaptador wireless, puedes decidir si usar una herramienta grafica --pero no invasiva-- como Wicd o elegir los perfiles de red provistos por netcfg.

Configuraciones mas sofisticadas como autentificación EAPOL o RADIUS estan muy bien detalladas en la pagina de manual de wpa_supplicant.conf (man wpa_supplicant.conf). Estas configuraciones estan fuera del ámbito de este documento.

Método alternativo: Recompilar wpa_supplicant

Obtén una copia del código fuente de wpa_supplicant desde su sitio web o desde ABS. Una vez descargado y desempaquetado, mira el archivo '.config' (si, esta oculto). El archivo luce como una configuración del kernel, solo que mucho mas pequeño. Busca las secciones llamadas CONFIG_DRIVER_DRIVERNAME y elige si o no (yes o no), dependiendo de tu driver. Cuidado con las opciones que eliges, porque necesitaras especificar una ruta adicional a los fuentes de tu driver a fin de compilar correctamente el componente de asociación de bajo nivel. Algunas tarjetas Atheros raras podran necesitar una conpilacion contra el último release de madwifi-svn disponible. Si este es el caso, aqui hay un ejemplo para iluminarte a través del proceso de compilación:

ejemplo de madwifi: edita las siguientes lineas en el archivo de configuración para lucir como estas. Esto asume que compilastes madwifi con ABS y que el codigo fuente esta almacenado en /var/abs/local/madwifi/src.

#Driver interface for madwifi driver
CONFIG_DRIVER_MADWIFI=y
#Change include directories to match with the local settings
CFLAGS += -I/var/abs/local/madwifi/src/madwifi

Una vez configurado puedes proceder con makepkg como es usual.

Gestión

netcfg

La manera mas simple de arrancar wpa_supplicant al bootear es usando netcfg. No es necesario especificar el SSID de la red a la que quieres conectarte (típicamente no puedes hacerlo de todas formas ya que la red variará segun el lugar), wpa_supplicant se conectará automaticamente a una red disponible de las especificadas en /etc/wpa_supplicant.conf.

Entonces, instala netcfg si no esta instalado aún y crea un perfil de red copiando el archivo de ejemplo:

# cp /etc/network.d/examples/wireless-wpa-config /etc/network.d/wpa_suppl

Edita el nuevo archivo para asegurar que utiliza la interface adecuada, ejemplo:

INTERFACE="wlan0"

El resto del archivo debe dejarse tal cual está. Luego edita /etc/rc.conf. Agrega el perfil de red al array NETWORKS:

NETWORKS=(wpa_suppl)

y agrega el demonio net-profiles a la lista de demonios para iniciar al bootear:

DAEMONS=(... @net-profiles)

Eso es todo. En el proximo booteo la interfase wireless se levantará y wpa_supplicant sera iniciado. Si una red conocida esta disponible, se establecera la conexión. Para mas información sobre netcfg mira Network Profiles.

Solo gestión wireless

Como ya fué mencionado, hay dos interfases para wpa_supplicant escrita por los mismo desarrolladores de wpa_supplicant, "wpa_cli" y "wpa_gui". wpa_cli es, como esperarás. una interfase de linea de comando, mientras que wpa_gui es una interfase basada en Qt. wpa_cli es incluida en el paquete wpa_supplicant, wpa_supplicant_gui es el otro paquete. Los detalles de como configurar wpa_supplicant para trabajar con cualquiera de estas dos interfases estan en la sección #Método dinamico: 'wpa_gui', 'wpa_cli'.

Cuando wpa_cli es invocado sin argumentos presentará un entorno de comandos, prueba tipeando help para abtener ayuda.

wpa_gui es realmente sensillo, si presionas "scan" te presentara una lista de SSIDs detectados, puedes hacer doble click para agregar uno, se te presentara un dialogo que te permitirá ingresar la información que necesites para asociarte con tu red, lo mas probable es que solo tengas que ingresar tu PSK si usas wpa/wpa2 o tu "key0" para una conexión WEP. El protocolo para WPA/WPA2/WEP/Desencriptada deberia ser autodetectado. Cosas como 802.1x requeriran un poco mas de configuración.

Después de que agregues una red podras modificarla si por ejemplo modificas el PSK, cambia al tab "Manage Networks" y selecciona la red que quieras Editar/Remover. También puedes agregar una red sin escanear, lo que necesitaras hacer si no transmites tu SSID.

Nota: wpa_cli y wpa_gui no te daran una dirección ip o configuraran una tabla de ruteo apropiada, solo te asociaran con un punto de acceso wireless. Los scripts wpa_auto de aur pueden usarse para ejecutar wpa_supplicant al bootear y automaticamente ejecutar dhcp para configurar la conexión despues de asiciarse a una red wireless, o tal vez escribas tu propio script. Hay también disponibles utilidades de gestión de red/wireless de mayor nivel, que son capaces de manejar tanto conexiones wireless como cableadas.

Wicd

Instala Wicd:

# pacman -S wicd

Wicd es muy simple; scanea redes, ingresa la informacion requerida y conecta. Podrás necesitar agregar /usr/lib/wicd/autoconnect.py a scripts de inicio y de gestión de energia para reconectar a las redes si esperas auto-conectarte.

Solución de problemas

La mayoria de los problemas estan relacionados con la asociación. Asi que mira detenidamente la salida de wpa_supplicant cuando sospeches este comportamiento. Agrega -d (debug) para incrementar la verbosidad. Usualmente -dd es suficiente. -dddd puede ser exagerada.

Cuando estes inspeccionando el log, presta atencion a entradas como esta:

ioctl[WHATEVER]: Operation not supported

En este caso, estas experimentando un problema de driver. Actualiza los drivers o cambia el parametro -D.

Otro problema común son mensajes No suitable AP found. wpa_supplicant parece tener problemas encontrando ESSIDs escondidos. Usualmente poniendo scan_ssid=1 en el bloque de red se hará cargo de esto.

Ninguna IP del servidor DHCP

Lo siguiente es una experiencia personal. No se porque funciona de esta manera pero tal vez otros tengan el mismo problema: Despues de

ifconfig wlan0
iwconfig wlan0 essid "mi_essid"
wpa_supplicant -B -D wext  -i wlan0 -c /etc/wpa_supplicant.conf
sleep 15; dhcpcd wlan0 #or dhclient wlan0

No obtengo una dirección IP. Uso esta solución (despues de que lo ya mencionado se haya hecho):

killall wpa_supplicant -SIGHUP
iwconfig wlan0 essid "myEssid" key on #tal vez "key on" sea opcional
sleep 15; dhcpcd wlan0

Cuando hago

ps aux | grep wpa

Obtengo un wpa_supplicant en ejecución, aún despues de haberlo matado. Aparentemente iwconfig inicio el servicio por mi.

Mi tarjeta wireless:

Intel Corporation PRO/Wireless 3945ABG [Golan] Network Connection (rev 02)