Criando um script para ativar a rede wireless

Hoje em dia, quase todas as distribuições incluem utilitários para configurar a rede wireless. O Ubuntu, por exemplo, inclui o network-manager, o Kubuntu inclui o knetworkmanager (uma variação dele), o OpenSuSE inclui opções dentro do Yast e assim por diante. Isso faz com que, na maioria dos casos, configurar a rede wireless seja bastante simples.

Apesar disso, existem sempre casos em que os utilitários de configuração não funcionam como deveriam, casos onde você está usando alguma distribuição onde eles não estão disponíveis ou simplesmente casos em que você resolveu colocar a mão na massa e fazer as coisas manualmente.

Nesta dica vamos ver como criar um script de conexão, para acesso a redes wireless com encriptação via WPA, que inclui funções para detectar erros comuns e pode ser executado durante o boot, automatizando a ativação da rede. Ela inclui também dicas diversas sobre shell script.

Para usá-lo é necessário que a placa wireless tenha sido detectada pelo sistema e o pacote “wpasupplicant” (necessário para conectar a redes com encriptação WPA) esteja instalado.

O primeiro passo é criar o arquivo de configuração do wpa_supplicant (note que o comando é diferente do nome do pacote), que contém o ESSID e a chave de autenticação da rede onde ele deve se conectar. Para isso, use o comando:

# wpa_passphrase minharede passphrase > /etc/wpa_supplicant.conf

Como em:

# wpa_passphrase casa 12345678 > /etc/wpa_supplicant.conf

O (criado automaticamente) arquivo ficará assim:

network={
ssid=”casa”
#psk=”12345678″
psk=bedc07580f71c85d6e0029f3663bab5cbe0720cc84bf94eb7c20722208b7f004
}

Como você pode ver, a terceira linha contém a passphrase da rede em modo texto, o que não é nada bom do ponto de vista da segurança. Apesar disso, ele não é necessária (tanto que está comentada) pois a linha seguinte contém um hash, que é suficiente para que a conexão seja efetuada. É sempre recomendável que você edite o arquivo e apague a terceira linha, deixando apenas o hash.

Com isso, precisamos apenas ativar o wpa_supplicant, usando o comando:

# wpa_supplicant -i eth1 -c /etc/wpa_supplicant.conf -d -D wext

O “eth1” no comando indica a interface de rede, e naturalmente deve ser alterado conforme necessário. O “wext” é o driver (interno do wpa_supplicant) que será usado. Atualmente, o wext é usado em quase todos os casos, inclusive no caso de placas configuradas através do ndiswrapper. A única exceção fica por conta das placas com chipset Atheros, onde você deve substituir o “wext” por “madwifi”.

Se a conexão for bem-sucedida, você terá (depois de uma rápida sucessão de mensagens), algo como:

State: GROUP_HANDSHAKE -> COMPLETED
CTRL-EVENT-CONNECTED – Connection to 00:50:50:81:81:01 completed (auth)
EAPOL: External notification – portValid=1
EAPOL: External notification – EAP success=1
EAPOL: SUPP_PAE entering state AUTHENTICATING
EAPOL: SUPP_BE entering state SUCCESS
EAP: EAP entering state DISABLED
EAPOL: SUPP_PAE entering state AUTHENTICATED
EAPOL: SUPP_BE entering state IDLE
EAPOL: startWhen –> 0

Estas mensagens indicam que ele se conectou ao ponto de acesso com o endereço MAC “00:50:50:81:81:01” e que a conexão está disponível para transmitir dados.

Para confirmar, rode o comando “iwconfig” que mostrará algo como:

# iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
eth1 IEEE 802.11g ESSID:”casa

Mode:Managed Frequency:2.447 GHz Access Point: 00:50:50:81:81:01
Bit Rate=54 Mb/s Tx-Power:32 dBm
RTS thr=2347 B Fragment thr=2346 B
Encryption key:
Security mode:restricted
Power Management:off
Link Quality:65/100 Signal level:-54 dBm Noise level:-96 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0

Isso significa que ele se conectou com sucesso ao ponto de acesso. Falta agora apenas fazer a configuração manual da rede, o que pode ser feito usando os comandos “ifconfig” e “route”. Note que estou usando os comandos manuais, pois a idéia é justamente que possamos transformá-los em um script mais tarde.

# ifconfig eth1 192.168.1.65 netmask 255.255.255.0 up
# route del default
# route add default gw 192.168.1.1 dev eth1
# echo ‘nameserver 208.67.222.222’ > /etc/resolv.conf

Nesses 4 comandos eu configurei a rede, especificando o endereço IP e a máscara, removi a rota padrão (só para garantir, já que em um micro com duas placas de rede é normal que a primeira fique como rota padrão e você não consiga navegar através da segunda), configurei o gateway padrão da rede, colocando a rota padrão na interface wireless (eth1) e aproveitei para colocar o endereço do DNS no arquivo /etc/resolv.conf.

Com isso, a rede estaria configurada. Vamos então à criação do script.

Como a idéia é que ele seja executado durante o boot, vamos colocá-lo na pasta /etc/init.d”, onde ficam os scripts de configuração do sistema. Vou chamá-lo de “/etc/init.d/wireless“.

Vamos começar “limpando a casa”, para ter certeza de que o script encontrará um ambiente previsível. Estes passos são opcionais e você pode incluir outros comandos que achar necessários:

# Desativa o network-manager do Ubuntu/Kubuntu
/etc/dbus-1/event.d/??NetworkManagerDispatcher stop
/etc/dbus-1/event.d/??NetworkManager stop

# Fecha outras instâncias ativas do wpa_supplicant
killall wpa_supplicant

# Desativa a interface de rede cabeada
ifconfig eth0 down
Desativa o cliente dhcp
killall dhclient3

O network-manager, usado no Ubuntu “sabota” a configuração manual, por isso é necessário desativá-lo usando os dois comandos. No caso do Kubuntu, é necessário também desativar o knetworkmanager dentro do ambiente gráfico, desmarcando o início automático nas configurações do programa.

Um problema comum em scripts de configuração da rede é que pode acontecer da interface de rede mudar ao reiniciar o sistema ou ao instalar uma nova placa de rede. Se o script espera que a placa wireless seja a “eth1” e a muda para “eth2”, o script deixa de funcionar.

Podemos tornar o script mais inteligente, detectando sozinho qual é a interface da rede wireless. Isso é simples, pois o sistema guarda a informação no arquivo “/proc/net/wireless”. Veja só:

# cat /proc/net/wireless

Inter-| sta-| Quality | Discarded packets | Missed | WE
face | tus | link level noise | nwid crypt frag retry misc | beacon | 21
eth1: 0000 65 202 160 0 0 0 0 0 0

Podemos filtrar a informação, ficando apenas com o device da placa de rede e atribuí-lo a uma variável que poderemos usar mais adiante no script, usando o pipe, o tail e o cut, veja só:

# Descobre qual é o device da placa wireless
placa=`cat /proc/net/wireless | tail -n 1 | cut -f 1 -d “:” | cut -c 3-`

A variável “placa” passa a conter o “eth1”, que é o device atual da placa de rede. Com isso, o script se adapta automaticamente a mudanças.

Falta agora adicionar as linhas que configuram a rede. Note que fiz uma pequena mudança no comando do wpa_supplicant, substituindo o “-d” por “-B”. Isso faz com que ele rode em modo daemon, sem travar o terminal. Sem isso o script não funcionaria, pois o comando do wpa_supplicant pararia a execução do script, não deixando que os comandos seguintes fossem executados.

# Configura a rede
wpa_supplicant -i $placa -c /etc/wpa_supplicant.conf -B -D wext
ifconfig $placa 192.168.1.65 netmask 255.255.255.0 up
route del default
route add default gw 192.168.1.1 dev $placa
echo “nameserver 208.67.222.222” > /etc/resolv.conf

O script completo ficaria:

#!/bin/sh
# script para configurar a rede wireless

# Desativa o network-manager do Ubuntu/Kubuntu
/etc/dbus-1/event.d/??NetworkManagerDispatcher stop
/etc/dbus-1/event.d/??NetworkManager stop

# Fecha outras instâncias ativas do wpa_supplicant
killall wpa_supplicant

# Desativa a interface de rede cabeada
ifconfig eth0 down

# Desativa o cliente dhcp
killall dhclient3

# Descobre qual é o device da placa wireless
placa=`cat /proc/net/wireless | tail -n 1 | cut -f 1 -d “:” | cut -c 3-`

# Configura a rede
wpa_supplicant -i $placa -c /etc/wpa_supplicant.conf -B -D wext
ifconfig $placa 192.168.1.65 netmask 255.255.255.0 up
route del default
route add default gw 192.168.1.1 dev $placa
echo “nameserver 208.67.222.222” > /etc/resolv.conf

Você poderia também torná-lo mais elegante, declarando os parâmetros da rede no início do script:

#!/bin/sh
# script para configurar a rede wireless

endip=”192.168.1.65″
masc=”255.255.255.0″
gtw=”192.168.1.1″
enddns=”208.67.222.222″

# Desativa o network-manager do Ubuntu/Kubuntu
/etc/dbus-1/event.d/??NetworkManagerDispatcher stop
/etc/dbus-1/event.d/??NetworkManager stop

# Fecha outras instâncias ativas do wpa_supplicant
killall wpa_supplicant

# Desativa a interface de rede cabeada
ifconfig eth0 down

# Desativa o cliente dhcp
killall dhclient3

# Descobre qual é o device da placa wireless
placa=`cat /proc/net/wireless | tail -n 1 | cut -f 1 -d “:” | cut -c 3-`

# Configura a rede
wpa_supplicant -i $placa -c /etc/wpa_supplicant.conf -B -D wext
ifconfig $placa $endip netmask $masc up
route del default
route add default gw $gtw dev $placa
echo “nameserver $enddns” > /etc/resolv.conf

Ao terminar, transforme o arquivo em executável e crie um link para ele dentro da pasta “/etc/rc5.d”, de forma que ele seja executado durante o boot:

# chmod +x /etc/init.d/wireless
# cd /etc/rc5.d
# ln -s ../init.d/wireless S99wireless

Se preferir, você pode também adicionar o comando “/etc/init.d/wireless” em algum dos arquivos de inicialização, como o “/etc/rc.local”, de forma que ele seja executado diretamente. Vai do que achar mais prático de acordo com a situação.

Terminado, é só reiniciar o micro e testar. 🙂

Este script “base” pode ser adaptado de acordo com a necessidade, incluindo outros comandos que você precise executar para ativar a placa de rede (ou ativar o transmissor ou para resolver problemas diversos).

Por exemplo, em um Acer 5043, preciso rodar os dois comandos abaixo para ativar o transmissor da placa wireless, caso contrário a placa simplesmente não transmite dados:

# modprobe acer_acpi
# echo “enabled : 1” > /proc/acpi/acer/wireless

Em outro (com uma placa Atheros) notei um problema estranho onde a placa é detectada apenas às vezes ao ativar o módulo. Às vezes é necessário carregar e descarregar o módulo várias vezes antes da rede ser detectada. Resolvi o problema na base da “força bruta” usando esse função, que continua carregando e descarregando os módulos até que a placa seja ativada e o device apareça no arquivo /proc/net/wireless:

atheros=`cat /proc/net/wireless | grep ath0`
while [ -z “$atheros” ]; do
/sbin/modprobe -r ath_pci
/sbin/modprobe -r ath_hal
sleep 3
/sbin/modprobe ath_hal
/sbin/modprobe ath_pci
atheros=`cat /proc/net/wireless | grep ath0`
done

Em ambos os casos, os comandos poderiam ser adicionados no início do script, de forma que a rede fosse ativada antes dos demais comandos, como em:

#!/bin/sh
# script para configurar a rede wireless

endip=”192.168.1.65″
masc=”255.255.255.0″
gtw=”192.168.1.1″
enddns=”208.67.222.222″

atheros=`cat /proc/net/wireless | grep ath0`
while [ -z “$atheros” ]; do
/sbin/modprobe -r ath_pci
/sbin/modprobe -r ath_hal
sleep 3
/sbin/modprobe ath_hal
/sbin/modprobe ath_pci
atheros=`cat /proc/net/wireless | grep ath0`
done

# Desativa o network-manager do Ubuntu/Kubuntu
/etc/dbus-1/event.d/??NetworkManagerDispatcher stop
/etc/dbus-1/event.d/??NetworkManager stop

# Fecha outras instâncias ativas do wpa_supplicant
killall wpa_supplicant

# Desativa a interface de rede cabeada
ifconfig eth0 down

# Desativa o cliente dhcp
killall dhclient3

# Descobre qual é o device da placa wireless
placa=`cat /proc/net/wireless | tail -n 1 | cut -f 1 -d “:” | cut -c 3-`

# Configura a rede
wpa_supplicant -i $placa -c /etc/wpa_supplicant.conf -B -D wext
ifconfig $placa $endip netmask $masc up
route del default
route add default gw $gtw dev $placa
echo “nameserver $enddns” > /etc/resolv.conf

Naturalmente, escrever o script do zero pode ser bem mais complicado do que simplesmente configurar a rede usando as ferramentas disponíveis, mas agora que você tem um modelo pronto, pode usá-lo de forma bastante prática, simplesmente substituindo as informações que forem diferentes em cada situação. Esta é a beleza dos scripts de configuração: eles podem ser escritos uma vez e depois usados indefinidamente, com pequenas alterações.

Ver Mais

Postagem relacionada