Configure sua Raspberry Pi como ponto de acesso para WiFi 8

A Raspberry Pi Zero W trata-se de uma poderosa e compacta placa de desenvolvimento, dispondo da mesma quantidade de I/Os da Raspberry Pi 3B, saída de vídeo HDMI, USB e conectividade wi-fi e Bluetooth. Dadas suas compactas dimensões físicas em relação às demais placas de desenvolvimento da linha Raspberry, a Raspberry Pi Zero W se encaixa muito bem em projetos que devem ser discretos , tais como sistemas de automação residencial e totens, por exemplo. Visando maior flexibilidade do uso dessa placa, este post irá tratar de uma interessante possibilidade de uso do wi-fi desta placa: a configuração de uma Raspberry Pi como access point e station/client simultaneamente.

Raspberry Pi Zero W

Material necessário

Para realizar o que é proposto no post, você deve dispor de:

De forma alternativa, exceto pelos itens cartão microSD, teclado USB, mouse USB e monitor/TV/display HDMI, você pode comprar de uma vez todo material no Kit Raspberry Pi Zero W Intermediate
Este post considera que sua Raspberry Pi Zero W já está totalmente operacional, ou seja, com Raspbian instalado e conectividade à Internet operando normalmente.

Wi-fi como access point e station/client simultaneamente: overview

O wi-fi possui, de forma simplificada, dois modos de operação:

  • Access Point (AP): neste modo de operação, o wi-fi serve como ponto de conexão para outros dispositivos (clients/stations), de forma similar a operação de um roteador doméstico comum, por exemplo. Os objetivos mais comuns do wi-fi operando como Acess Point são oferecer conectividade a outros dispositivos wi-fi, compartilhar conectividade à Internet e criar uma rede exclusiva para algum fim de configuração (como no caso de alguns roteadores domésticos, por exemplo).
  • Client/Station (ST): neste modo de operação, o wi-fi busca se conectar a um Access Point para obter acesso à uma rede sem fio, da mesma forma que você conecta seu smartphone em um roteador doméstico comum, por exemplo. Neste caso, o dispositivo que possui wi-fi operando como Station busca conectividade a uma rede wi-fi, seja para acesso a uma rede com fins específicos ou para obter conectividade à Internet.

Ambos os modos de operação permitem o envio e recepção de dados simultaneamente, logo a comunicação em ambos os modos é full-duplex.

Em termos de sistemas operacionais (sobretudo as distribuições Linux embarcado), um modo de operação de wi-fi é chamado de interface wi-fi. O número/limite e possibilidade de interfaces wi-fi operando simultaneamente é definido pelo hardware de wi-fi, ficando a cargo do sistema operacional gerenciar, dentro dos limites desse hardware, as interfaces desejadas. No caso da Raspberry Pi Zero W, o wi-fi da placa suporta tranquilamente duas interfaces operando como AP e ST simultaneamente. Ainda no caso deste post, as interfaces serão chamadas de:

  • wlan0: interface correspondente ao modo de operação do wi-fi como ST
  • ap0: interface correspondente ao modo de operação do wi-fi como AP

Configurando o wi-fi da Raspberry Pi Zero como Acess Point e Client/Station

Antes de iniciar, é necessário utilizar a Raspberry Pi Zero W ligada a um teclado USB, mouse USB e monitor/TV/display HDMI. Como configurações relativas ao wi-fi serão modificadas, não é recomendável fazer este processo utilizando conexão ssh com a placa, sob risco de queda de conexão e impossibilidade de reconexão via ssh. Feito isso, siga o procedimento abaixo:

1. Primeiramente, atualize os pacotes existentes na sua Raspberry Pi Zero W e instale os pacotes dsnmasq, dhcpcd e hostapd. Faça isso com os comandos abaixo:

sudo apt -y update
sudo apt -y upgrade
sudo apt -y install dnsmasq dhcpcd hostapd

2. Agora, deve-se descobrir o endereço físico (MAC address) do wi-fi da placa. para isso execute o comando abaixo e salve/guarde a resposta para uso futuro,

cat /sys/class/net/wlan0/address

3. Em posse do MAC address, o próximo passo é criar o arquivo /etc/udev/rules.d/70-persistent-net.rules. Crie este arquivo (e abra-o no editor nano) com o comando abaixo:

sudo nano /etc/udev/rules.d/70-persistent-net.rules

No arquivo, coloque o seguinte conteúdo:

SUBSYSTEM=="ieee80211", ACTION=="add|change", ATTR{macaddress}=="MAC_ADDRESS", KERNEL=="phy0", \
  RUN+="/sbin/iw phy phy0 interface add ap0 type __ap", \
  RUN+="/bin/ip link set ap0 address MAC_ADDRESS"

Onde MAC_ADDRESS corresponde ao MAC Address obtido neste passo.

4. Agora, abra o arquivo /etc/dnsmasq.conf com o editor nano (como sudo: sudo nano) e faça com que o conteúdo abaixo seja o conteúdo deste arquivo. Basicamente, estas configurações configuram o DHCP para a interface AP, incluindo o range de IPs possíveis de serem atribuídos aos que se irão se conectar na interface AP.

interface=lo,ap0
no-dhcp-interface=lo,wlan0
bind-interfaces
server=8.8.8.8
domain-needed
bogus-priv
dhcp-range=192.168.10.50,192.168.10.150,12h

5.  Agora é o momento de fazer as configuração da interface AP (incluindo o SSID/nome da rede e senha da mesma). Para isso, abra o arquivo /etc/hostapd/hostapd.conf com o editor nano(como sudo: sudo nano) e faça com que seu conteúdo seja conforme consta abaixo:

ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
interface=ap0
driver=nl80211
ssid=AP_SSID
hw_mode=g
channel=11
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2PASSPHRASE
wpa_passphrase= AP_PASSPHRASE
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP

Onde:

  • AP_SSID: nome desejado para o Access Point
  • AP_PASSPHRASE: senha para se conectar ao Access Point criado pela Raspberry Pi Zero W

6. Uma vez escritas as configurações da interface Access Point, o hostapd deve ter conecimento das mesmas. Para isso, abra o arquivo /etc/default/hostapd no editor nano(como sudo: sudo nano) e faça com que seu conteúdo seja conforme mostrado abaixo:

DAEMON_CONF="/etc/hostapd/hostapd.conf"

7. Agora é o momento de configurar a parte Station (ou seja a qual SSID/rede a Raspberry Pi Zero W deve se conectar). Para isso, abra o arquivo /etc/wpa_supplicant/wpa_supplicant.conf no editor nano(como sudo: sudo nano) e faça com que seu conteúdo seja conforme mostrado abaixo:

country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="CLIENT_SSID"
    psk="CLIENT_PASSPHRASE"
    id_str="AP1"
}

Onde:

  • CLIENT_SSID: nome da rede a qual a Raspberry Pi Zero W deve se conectar (esta rede irá prover conectividade Internet à Raspberry PI Zero W).
  • CLIENT_PASSPHRASE: senha da rede a qual a Raspberry Pi Zero W deve se conectar

8. Mais algumas configurações de ambas as interfaces wi-fi precisam ser feitas. Para isso, abra o arquivo /etc/network/interfaces no editor nano (como sudo: sudo nano) e faça com que seu conteúdo seja conforme mostrado abaixo:

source-directory /etc/network/interfaces.d
auto lo
auto ap0
auto wlan0
iface lo inet loopback
allow-hotplug ap0
iface ap0 inet static
    address 192.168.10.1
    netmask 255.255.255.0
    hostapd /etc/hostapd/hostapd.conf
allow-hotplug wlan0
iface wlan0 inet manual
    wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface AP1 inet dhcp

9. Todas as configurações necessárias foram feitas. Agora, é o momento de criar um script que, ao ser carregado a cada boot, vai ativar as interfaces conforme se deseja e , além disso, faz com a que interface AP possa prover acesso à Internet para os dispositivos que nela se conectem (redirecionamento de conectividade). Para isso, crie o arquivo /bin/start_wifi.sh com o editor nano (como sudo: sudo nano) e coloque o conteúdo abaixo no arquivo.
Note que a primeira linha é um sleep de 50 segundos. Ele faz com que as interfaces sejam configuradas conforme desejamos após 50 segundos do início do boot da placa, tempo mais do que suficiente para o sistema operacional ser carregado e operar plenamente.

sleep 50
sudo ifdown --force wlan0
sudo ifdown --force ap0
sudo ifup ap0
sudo ifup wlan0
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j MASQUERADE
sudo systemctl restart dnsmasq

10. Como o script do passo 9 deverá ser executado a cada boot, este deve ter permissão de execução. Conceda permissão de execução a ele com o comando abaixo:

sudo chmod +x /bin/start_wifi.sh

11. Agora, para garantir que o script do passo 9 seja executado a cada boot / reboot da placa, faremos uso do Cron. Para isso, utilize o comando abaixo para agendar a execução do script pelo cron a cada boot/reboot:

crontab -l | { cat; echo "@reboot /bin/start_wifi.sh"; } | crontab -

12. Pronto! Agora basta reiniciar a placa, aguardar aproximadamente 50 segundos e verificar com seu computador ou smartphone que uma rede wi-fi (AP) foi criada pela sua Raspberry PI Zero W!

Sugestões de utilizações da Raspberry Pi como Access Point

O projeto deste post pode ser usado como base para projetos muito interessantes, tais como:

  • Controle de utilização de wi-fi (utilizando a placa como roteador), de forma a controlar o acesso / tempo de acesso de quem se conecta à Raspberry Pi Zero W pela interface AP
  • Toten wi-fi, de modo que haja uma rede wi-fi privada para fins comerciais e informativos
  • Rede exclusiva para configuração de algum dispositivo eletrônico feito com base na Raspberry Pi Zero W (de forma similar a feita em alguns roteadores domésticos comuns)
  • Servidor privado de arquivos e banco de dados

Gostou deste post sobre como configurar o wi-fi da Raspberry Pi como access point e station/client simultaneamente? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

8 Comentários

  1. Bom dia! primeiramente agradeço o tutorial foi esclarecedor e funcionou muito bem para função que desejo!
    Porem sempre que reinicio o raspberry a conecção cai e preciso deletar a pasta “/var/run/hostapd/ap0/” para que o wifi funcione normalmente e fique visivel.
    tem alguma dica de como posso contornar esta situação? de modo que sempre que ligar o raspberry ele não baixar a pasta /var/run/hostapd/ap0/ automaticamente?

  2. ############ ATENÇÃO #############

    Demorei mais descobri o motivo do meu não funcionar, era pq o canal do AP deve ser o mesmo do client
    ou seja, conecte no sinal wifi, verifique o canal com o comando:

    iw dev

    altere o canal do arquivo /etc/hostapd/hostapd.conf

    Fonte: https://blog.thewalr.us/2017/09/26/raspberry-pi-zero-w-simultaneous-ap-and-managed-mode-wifi/

    1. Olá Danilo,

      Obrigado por compartilhar essa informação aqui no post!

      Abraços!
      Vinícius – Equipe MakerHero

  3. Olá Pedro, segui o processo passo a passo (alias muito bem explicado) porem após reiniciar meu Rpi não aparece a rede AP e também a placa não consegue se conectar na WiFi. No icone do Wifi aparece a seguinte mensagem:

    No Wireless interfaces found

    e ao passar o mouse aparece

    Connection to dhcpcd lost

    Vc poderia, por favor, me orientar sobre como proceder?

    Obrigado

    1. Pedro, consegui ativar a rede WiFi do RPi como AP (eu tinha cometido alguns erros de digitação nas configurações) porem continua sem accessar a rede WiFi do roteador…

      Aguardo suas dicas, obrigado

      1. Simon, boa noite.

        Primeiramente, obrigado pelo elogio (falar que o artigo estava bem explicado). Fico feliz que o artigo ficou claro.
        Sobre não ter acesso a rede wifi do roteador, vocẽ quis dizer que pode se conectar a rede que criou, mas o dispositivo não acessa a Internet? Se sim, faça o seguinte:

        1) verifique o conteúdo do arquivo /etc/resolv.conf (o comando pra isso é cat /etc/resolv.conf )
        2) Se o IP que estiver lá for diferente de 8.8.8.8 (DNS do Google), abra o arquivo com o editor nano e substitua o IP lá gravado pelo 8.8.8.8

        Se o problema for relativo a resolver DNS, isso deve corrigir.

        Atenciosamente,
        Pedro Bertoleti

        1. Olá Pedro, muito obrigado pela pronta resposta. Vc interpretou corretamente meu problema, o Rpi não consegue se conectar a internet, desculpe por não ter sido claro.

          Fiz como orientado e a boa noticia é que de fato o endereço IP estava diferente. O conteudo do arquivo /etc/resolv.conf é

          #generated by resolvconf
          nameserver 127.0.0.1

          Editei conforme informado e a noticia ruim é que após reiniciar o arquivo volta a ficar com o mesmo conteudo e o Pi continua sem conseguir se conectar à Internet…

          Onde posso estar errando?

          1. Caro Pedro, não sei o que houve mas após um novo reset estou conseguindo accessar a Internet embora a situação descrita no post anterior continua sendo verdadeira. Misterios da Eletronica.

            O único ponto a observar é que o icone da Wifi continua cinza indicando (desabilitado?) com dois “x” vermelhas e ao passar o mouse aparece a mensagem “Connection to dhcpcd lost”. Isso é normal? Se for sugiro incluir na documentação…

            Obrigado e abraço