WPA Supplicant (Español)

From ArchWiki
Revision as of 16:05, 11 February 2010 by IR3uL (talk | contribs)
Jump to: navigation, search

Tango-preferences-desktop-locale.pngThis article or section needs to be translated.Tango-preferences-desktop-locale.png

Notes: please use the first argument of the template to provide more detailed indications. (Discuss in Talk:WPA Supplicant (Español)#)

Template:I18n links start Template:I18n entry Template:I18n entry Template:I18n entry Template:I18n entry Template:I18n links end

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 'Template:Codeline':

# 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 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 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 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 wpa_supplicant.conf, asi que deberias leerla de todas formas.

Método Clásico: 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]"[ssid] "[passphrase]"

  • 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=/var/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 wifi. Para el proposito de este ejemplo usaremos la interfase wlan0.

#  ifconfig 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 aqui wpa_supplicant.

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 ifconfig:

# ifconfig wlan0

wlan0     Link encap:Ethernet  HWaddr 00:1C:BF:66:4E:E0 
         inet addr:192.168.0.62  Bcast:192.168.0.255  Mask:255.255.255.0
         inet6 addr: fe80::21c:bfff:fe66:4ee0/64 Scope:Link
         UP BROADCAST MULTICAST  MTU:1500  Metric:1
         RX packets:140387 errors:0 dropped:0 overruns:0 frame:0
         TX packets:96902 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:125513183 (119.6 Mb)  TX bytes:12299192 (11.7 Mb)

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. Estas configuraciones estan fuera del ámbito de este documento.

Fallback: Recompiling wpa_supplicant

Grab a copy of wpa_supplicant source from the homepage or from the ABS. Once downloaded and untarred, have a look at the file '.config' (yeah, it's hidden). The file looks like a kernel config, only much smaller. Have a look at the sections named CONFIG_DRIVER_DRIVERNAME and choose yes or no, depending upon your driver. Be careful with the options chosen, because you will need to specify an additional path to your wireless drivers' source in order to correctly compile the low-level association component. Some weird atheros cards may need a fresh wpa_supplicant build compiled against the latest madwifi-svn relase available. If this is the case, here is an example to enlighten you through the compilation process:

madwifi example: edit the following lines in the config file to look like this. This assumes that you have built madwifi with abs and that the source from the build is stored in /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

Once configured, you can proceed with makepkg as usual.

Management

netcfg

The easiest way to have wpa_supplicant start at boot is to use netcfg. It is not necessary to specify which network SSID you want to connect to (typically you can't do that anyways since the desired network will vary depending on location), wpa_supplicant will automatically connect to an available network from those specified in Template:Filename.

So, install netcfg if it is not already installed and then create a network profile configuration by copying the example file:

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

Edit the new file to make sure it specifies the right interface, e.g.

INTERFACE="wlan0"

The rest of the file should be left as it is. Next, edit Template:Filename. Add the network profile to the NETWORKS array:

NETWORKS=(wpa_suppl)

And, add the net-profiles daemon to the list of daemons started at boot:

DAEMONS=(... @net-profiles)

That's it. On the next reboot, the wireless interface will be brought up and wpa_supplicant started. If a known network is available, a connection will be established. For more information on netcfg see Network Profiles.

Wireless management only

As mentioned above, there are two frontends to wpa_supplicant actually written by the wpa_supplicant developers themselves, "wpa_cli", and "wpa_gui". wpa_cli is, as you might expect, a command line front end, while "wpa_gui" is a qt-based frontend to wpa_supplicant. wpa_cli is include with the wpa_supplicant package, wpa_supplicant_gui is it's own package. The details on how to setup wpa supplicant to work w/ either wpa_cli or wpa_supplicant are in section #Dynamic method:'wpa_gui', 'wpa_cli'.

wpa_cli, when invoked without options, will give you a prompt environment, try typing "help" for help.

wpa_gui is pretty straightforward, If you hit "scan" you will be presented with a list of detected SSIDs, you can double click to add one, you will be given a dialogue box that will let you enter information that you need to associate with your network, most likely, you will only have to enter your PSK if you use wpa/wpa2 or your "key0" for a WEP connection. The protocal for WPA/WPA2/WEP/Unencrypted should be autodetected. Things like 802.1x will require a bit more configuration.

After you add a network you can modify it if you do something like changing the PSK, switch to the 'Manage Networks' tab and select the network you want to Edit / Remove. You can also add a network without scanning, which you will need to do if you don't broadcast your SSID.

Note: wpa_cli and wpa_gui will not get you an ip address or set up a proper routeing table, they will only associate you with a wireless access point. The wpa_auto scripts from the aur can be used to start wpa_supplicant at boot and automatically run dhcp to configure your network connection after you associate to a wireless network, or you might right your own scripts. Higher level, wireless/network management utilites are also available, that are capable of managing both wireless connections and wired connections:

Wicd

Install Wicd:

# pacman -S wicd

Wicd is very straightforward; scan for networks, fill in the required data and connect. You might need to add Template:Filename to init and power management scripts for reconnecting to networks if auto-connection behavior is expected.

Troubleshooting

Most of the issues are related to the association. So, have a deep look at wpa_supplicant's output when you suspect it's misbehaving. Add '-d' (for debug) to increase the verbosity. Usually '-dd' is enough. '-dddd' might be overkill.

When you're inspecting the log, have a look at entries like this one:

ioctl[WHATEVER]: Operation not supported

If this is the case, you're experiencing a driver issue. Upgrade drivers, or change the -D parameter.

Another common problem is No suitable AP found messages. Wpa_supplicant seems to have trouble finding hidden essids. Usually setting scan_ssid=1 in your network block will take care of this.


No IP from DHCP Server

The following is a personal experience. I don't know why it works this way but maybe orthers have the same issue: After

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

I don't get an IP adress. I use this Workaround (after the stuff just mentioned has been done):

killall wpa_supplicant -SIGHUP
iwconfig wlan0 essid "myEssid" key on #maybe "key on" is optional
sleep 15; dhcpcd wlan0

When I do

ps aux | grep wpa

I get a running wpa_supplicant even though i just killed it. Seems like iwconfig started the service for me.

My wireless card:

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