ct

    Criando um script para ativar a rede wireless

    Dicas do Guia do Hardware

    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. Carlos E. Morimoto
    04/10/2007


    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.






    Blog:

    Add to Google

    » Gostou do texto? Veja nossos livros impressos:
    Hardware | Redes | Servidores | Kurumin 7

    ... ou encontre o que procura usando a busca:

cb
Livros de Carlos E. Morimoto Contato HOME