Configure sua Raspberry Pi como ponto de acesso para WiFi Deixe um comentário

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. Em caso de dúvidas, caso queira trocar uma ideia, ou até mesmo dividir seu projeto, acesse nosso Fórum!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *