Configurando o Linux como um Access Point

Como comentado em um artigo anterior, o smaug agora provê acesso wireless. Nesse artigo cobrirei a saga da configuração do Smaug como um access point rodando Linux.

Inicialmente, a configuração do smaug era simples:

  • Uma interface de rede externa conectada ao modem ADSL (eth0);
  • Uma interface PPPoE (ppp0);
  • Uma interface de rede interna conectada ao switch daqui de casa.
  • Obviamente um firewall (e outros serviços) rodando em smaug fazendo NAT e protegendo a rede interna e também implementando QoS usando tc (HTB)

Agora o objetivo era suportar uma rede sem fio de modo que todos os usuários da rede sem fio pudessem enxergar e se comunicar transparentemente com os usuários da rede cabeada. Mas primeiro eu deveria configurar a placa wireless…

Como eu não sabia absolutamente nada de redes sem fio (muito menos no Linux), optei ignorantemente pela solução mais difícil. Usar o ndiswrapper (que implementa uma API do kernel do windows que serve para usar drivers implementados para o Windows no Linux) para carregar o driver da minha placa wireless. Segui as instruções da página sem muito sucesso. Consegui acessar o dispositivo, mas não consegui fazê-lo funcionar.

A idéia de usar o ndiswrapper era idiota por que o chipset da minha placa wireless é Atheros e, para ele, existe uma implementação nativa no Linux, o madwifi. Então ele foi minha segunda (e acertada) opção.

Apesar de haver pacotes para o madwifi para Slackware, eu não uso o kernel padrão, então tive que compilar o meu próprio madwifi, que não foi complicado, pois meu sistema já estava de acordo com todos os pré-requisitos, como um chipset suportado, os pacotes para compilar o módulo e principalmente os do kernel: (Se você usa o kernel padrão de uma distribuição, é provável que ele também atenda os requisitos)

    * Linux Kernel 2.4.23+ and 2.6.x series
          o Others may work, but are unsupported
    * Kernel Source and Headers of running kernel
    * No module versioning support
          o option CONFIG_MODVERSIONS
    * Wireless Extensions support in kernel
          o v14+ required, v17+ recommended; option CONFIG_NET_RADIO
    * Sysctl support in kernel
          o option CONFIG_SYSCTL
    * Crypto API support in kernel
          o option CONFIG_CRYPTO
    * HMAC support
          o option CONFIG_CRYPTO_HMAC
    * AES support (for WPA networks)
          o option CONFIG_CRYPTO_AES 

Então a instalação dele foi simples, baixei a última versão do madwifi (no momento da escrita desse documento essa era a versão http://www.slackware.com/~alien/slackbuilds/wireless-tools/ e a página do projeto é http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html)

A partir desse ponto a interface estava criada. O guia do usuário do madwifi continua descrevendo o processo para se conectar A um Access Point, mas meu objetivo era FAZER um access point. Para isso pesquisei mais um pouco e vi que precisaria das bridge-utils para criar a ponte entre a interface wireless e a interface de rede interna. A criação da ponte é simples, bastando realizar os comandos

ifconfig eth1 0.0.0.0 up
ifconfig ath0 0.0.0.0 up
brctl addbr br0
brctl addif br0 eth1
brctl addif br0 ath0

E para destruí-la, basta executar o contrário (trocando ‘up’ por ‘down’ e na ordem inversa):

ifconfig br0 down
ifconfig eth1 0.0.0.0 down
ifconfig ath0 0.0.0.0 down
brctl delif br0 eth1
brctl delif br0 ath0
brctl delbr br0

No meu caso, tenho vários serviços executando no smaug, então era importante que ele tivesse um IP, então assim foi feito:

ifconfig br0 192.168.1.254

Outro problema que me ocorreu foi o de que máquinas que pegavam IP via DHCP não estavam conseguindo se conectar à rede, para isso tive que fazer

brctl setfd br0 0 #set bridge forward delay to zero

na criação da rede. Note, no entanto, que só é aconselhável setar o atraso de redirecionamento para redes que contém somente uma ponte.

A partir daí criei um script que é executado quando o sistema é iniciado chamado rc.bridge (e, em meu firewall, troquei as referências de eth1 para br0, minha nova interface interna).

Eis seu conteúdo:

 1 #!/bin/sh
 2 
 3 WIRED_IF=eth1
 4 WIRELESS_IF=ath0
 5 INTERNAL_IP=192.168.1.254
 6 
 7 prepare() {
 8   wlanconfig $WIRELESS_IF destroy
 9   wlanconfig $WIRELESS_IF create wlandev wifi0 wlanmode ap
10   iwpriv $WIRELESS_IF bgscan removed
11   ifconfig $WIRELESS_IF up
12   iwconfig $WIRELESS_IF essid "Middle Earth" rate auto
13   athctrl $WIRELESS_IF -d 20
14   sleep 5
15   iwconfig $WIRELESS_IF txpower 18
16   iwconfig $WIRELESS_IF channel 5
17   iwconfig $WIRELESS_IF rate 54M
18 }
19 
20 bridge_start() {
21   prepare
22   ifconfig $WIRED_IF 0.0.0.0 up
23   ifconfig $WIRELESS_IF 0.0.0.0 up
24   brctl addbr br0
25   brctl setfd br0 0 # Necessario para o DHCP funcionar
26   brctl addif br0 $WIRED_IF
27   brctl addif br0 $WIRELESS_IF
28   ifconfig br0 $INTERNAL_IP
29 }
30 
31 bridge_stop() {
32   ifconfig br0 down
33   ifconfig $WIRED_IF 0.0.0.0 down
34   ifconfig $WIRELESS_IF 0.0.0.0 down
35   brctl delif br0 $WIRED_IF
36   brctl delif br0 $WIRELESS_IF
37   brctl delbr br0
38 }
39 set -xv
40 case "$1" in
41 'start')
42   echo "Starting: Wireless Bridge"
43   bridge_start
44   ;;
45 'stop')
46   echo "Stopping: Wireless Bridge"
47   bridge_stop
48   ;;
49 'restart')
50   echo "Restarting: Wireless Bridge"
51   bridge_stop
52   sleep 2
53   bridge_start
54   ;;
55 *)
56   echo "usage $0 start|stop|restart"
57 esac

E é isso. O script é iniciado e é possível conectar clientes wireless e cabeados na mesma rede. Testei com o notebook Windows do meu pai e funcionou perfeitamente. O sinal pega bem por todo o apartamento e por alguma parte do prédio.

Estou tendo problemas para fazer a autenticação WEP2 funcionar (apresentada a mim pelo linux.com), o que o transformaria num access point 802.11i utilizando o hostapd. Se alguém tiver alguma sugestão, ela será bem vinda. Estou pensando em fazer algumas antenas em casa para melhorar o sinal, que está fraco. Mas consegui, gastando pouco, fazer um Access Point decente e customizável usando um sistema já existente.

Boa sorte para quem quiser tentar. Eu aconselho aos aventureiros que utilizem placas com chipset Atheros ou Prism, pois elas são mais fáceis de configurar no Linux.

5 Respostas para

  1. Gravatar Julia diz:

    ahh bomm :p

    como entendo NADA sobre instalações de rede *noob*, o que me impressionou de fato foi o resultado: nao sabia que era possivel conectar em rede computadores linux e windows *noob again*, muito menos sem fio, e menos ainda sem gastar muito.

    ps: sim, sou leitora assídua de blogs ..aliás talvez seja o meio de informação que mais utilizo, melhor que ver TV. :p

  2. Gravatar Renato Trovão diz:

    Sobre o lance das redes, interoperabilidade existe facilmente. Não por causa do Windows, claro. :) Mas existem vários serviços que permitem a comunicação tranqüila. A rede aqui de casa, por exemplo, é bem híbrida: cada hora tem um sistema plugado aparecendo. O wireless, no entanto, é mais complicado, por que não existe muita padronização (tem gente que diz que há, mas não há), então tudo acaba virando uma zona. :)

  3. Gravatar Leandro Costa diz:

    Ola,

    Parabens o seu artigos.
    Estou tentando reproduzir o seu artigo utilizando o Centos 5.

    Quando ficar pronto eu te aviso

    vc sabe onde consigo comprar uma antena para ampliar o sinal placa ENLWI-SG ?

    Nao entendo nada:
    Qual tipo de conector ?

  4. Gravatar Renato Trovão diz:

    Obeigado. O procedimento no CentOS não será muito diferente, exceto que você terá que deixar o script em /etc/init.d se você quiser que ele seja iniciado com “service bridge start/stop/restart” e terá que fazer os links para inicialização. Se for o caso…

    Quanto à antena, você pode encontrá-la na loja de redes mais próxima da sua casa (deve ter), ou você pode comprar no submarino, já vi lá em algum lugar ou no Mercado Livre.

    Se você não tiver problemas com inglês e gostar de fazer as coisas você mesmo, você pode tentar montar suas antenas feitas em casa: http://www.turnpoint.net/wireless/has.html

  5. Gravatar ::: Linux Access Point - UnderLinux Forums via Pingback:

    [...] addif br0 $WIRED_IF 27 brctl addif br0 $WIRELESS_IF 28 ifconfig br0 $INTERNAL_IP de acordo com Configurando o Linux como um Access Point « Vale do Trovão __________________ Dragões ou dragos (do grego drákon, δράκωυ) são [...]

Deixe uma resposta »

Bad Behavior has blocked 140 access attempts in the last 7 days.