Manual
do
Maker
.
com
Vamos pensar que temos um sistema configurado no Raspberry para implementar em um cliente. Daí, ou deixamos a rede pré-configurada antes de levar o sistema ou conectamos ao sistema no cliente para fazer a configuração. Fazer a configuração no cliente tem um desconforto, pois precisaremos de monitor e teclado para conectar ao Raspberry. Então, porque não deixar um access point configurado para não precisar conectar fisicamente ao Raspberry? Daí a solução. Veremos agora como configurar um Raspberry como Access Point WiFi.
Se a ideia for fazer um access point utilizando também a ethernet, sugiro esse outro tutorial.
Precisaremos configurar o servidor DHCP, DNSMasq, bridge, forwarding, iptables e algumas coisinhas mais. Não se preocupe, basta seguir o artigo e tudo funcionará no final.
Já escrevi sobre cada um desses recursos separadamente, mas não quero ter que procurar, deve aparecer alguma coisa mais próximo do rodapé, em "Artigos Relacionados".
Primeiramente, vamos configurar o access point. Para tal, devemos instalar dois recursos fundamentais (talvez haja outra maneira, ignorem o "fundamentais" nesse caso). O DNS Masq e o Host AP:
apt-get install dnsmasq hostapd
Pacotes adicionais dependentes serão instalados automaticamente:
A interface WLAN precisará ser configurada com um IP estático. Para quem não sabe a diferença, um IP dinâmico é aquele pego por DHCP com lease time, podendo (ou não) ser entregue novamente ao mesmo dispositivo. O IP estático é um IP que sempre estará na interface, independente de outras configurações.
Use seu editor preferido. Faço tudo sempre pelo terminal, costumo usar o edito vim, mas se você não conhece esse editor, dificilmente conseguirá sair dele sem reiniciar o Raspberry. Então vamos utilizar o nano:
sudo nano /etc/dhcpcd.conf
Adicione ao final do arquivo a seguinte configuração à interface uap0:
interface uap0
static ip_address=192.168.4.1/24
nohook wpa_supplicant
Isso deixará mais cômodo para quem já usa ESP8266 e/ou ESP32, porque a rede access point será a mesma; classe C com máscara 24. Não estranhe em estarmos utilizando uma interface que não existe no sistema, iremos criá-la mais adiante.
Feita essa configuração, salve o arquivo (Ctrl+X, Y, Enter) e reinicie o serviço dhcpcd:
sudo systemctl restart dhcpcd
Se desejar, observe o arquivo de configuração padrão. Diversas dessas configurações não são necessárias para esse artigo e será mais rápido reescrever o arquivo de configuração. Faça backup da configuração original antes de criar a sua:
sudo su
cd /etc/
mv dnsmasq.conf dnsmasq.conf-orig
nano dnsmasq.conf
Nesse arquivo teremos apenas a interface e a range do DHCP. Seu conteúdo deve se algo como:
interface=uap0
dhcp-range=192.168.4.2,192.168.4.10,255.255.255.0,12h
bind-interfaces
server=8.8.8.8 #aqui utilizo meu servidor DNS, mas usem o 8.8.8.8
domain-needed bogus-priv
O IP 192.168.4.1 está fora da range porque é o IP configurado na interface wlan0. Na range passamos também a máscara de rede padrão da classe C e o lease time de 24 horas, antes de renovar o IP do client que se conectar à rede criada. Salve o arquivo modificado (Ctrl+X, Y, Enter), volte ao diretório anterior (cd -).
Agora devemos reiniciar o serviço para que a configuração seja assumida:
systemctl enable dnsmasq
service dnsmasq stop
service dnsmasq start
Essa configuração tem mais parâmetros, mas não precisa se preocupar com os detalhes. Apenas troque o SSID e a senha, e o restante deixe como está descrito mais abaixo.
Edite o arquivo (até então inexistente) /etc/hostapd/hostapd.conf e inclua a configuração:
interface=uap0
driver=nl80211
ssid=SuaRedeAqui
hw_mode=g
channel=7
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=SuaSenhaAqui
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
Salve o arquivo e agora edite o próximo, localizado em /etc/default/hostapd:
nano /etc/default/hostapd
Na linha DAEMON_CONF, insira o path para o arquivo de configuração recém criado:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
Salve o arquivo e conclua a habilitação do serviço:
systemctl unmask hostapd
systemctl enable hostapd
systemctl start hostapd
Agora vamos utilizar um recurso do sysctl (não confunda com o systemctl). Diversos parâmetros do kernel space são configurados através do sysctl. Há um arquivo de configuração para predefinições, cujo arquivo se encontra em /etc/sysctl.conf.
Se desejar ver os parâmetros já definidos, utilize:
sysctl -a
Ou então, por categoria:
sysctl vm
O que precisaremos modificar é o net.ipv4.ip_forward, habilitando-o com a flag 1. Para saber se já está configurado assim, basta chamar:
sysctl net.ipv4.ip_forward
Que deve retornar algo como:
Mas no meu caso eu já havia configurado forwarding em meu notebook por outra razão. O normal é que retorne com a flag 0.
Para mudar a flag por linha de comando, utilize algo como:
A flag -w permite modificar um parâmetro qualquer. Mas para que haja persistência, é necessário adicioná-lo ao arquivo /etc/sysctl.conf. Essa linha já está lá, porém, comentada. Basta remover do início da linha a cerquilha (ou 'jogo da velha' (ERRADO), ou 'trena', ou 'tralha', ou 'sustenido' (ERRADO), ou 'sharp', ou 'antífen', ou 'cardinal', ou 'octothorpe', ou 'cancela'... [ref: Cerquilha]).
O comando só é assumido imediatamente através do comando sysctl, um reboot ou uma carga forçada do arquivo de predefinições, ou dos parâmetros do sistema. Ex.:
sysctl --system
Ou do arquivo sysctl.conf:
sysctl -p
Uma das formas de adicionar rotas de saída é através de um conjunto de regras que permitam um host chegar a um destino, mas quando é necessário sair para a Internet, fundamentalmente deve ser um IP público, não de rede privada. Nessa condição, podemos utilizar um recurso de NAT chamado MASQUERADE, que validará a conexão do host da rede privada com a Internet.
Nesse artigo mostrei como configurar um firewall com Raspberry, agora vamos fazer algo mais simples ainda.
Precisamos colocar uma regra, mas para que seja persistente, deveremos adicioná-la à inicialização do sistema. Isso pode ser feito através do arquivo /etc/rc.local, antes do comando exit 0 ao final do arquivo.
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 ! -d 192.168.4.0/24 -j MASQUERADE
Esse script não é uma beleza, mas resolverá o problema de inicialização do Access Point WiFi sem ter que ajustar os serviços já instalados.
#!/bin/bash
echo "Parando servicos..."
systemctl stop hostapd.service
systemctl stop dnsmasq.service
systemctl stop dhcpcd.service
echo "Garantindo remocao da interface uap0..."
iw dev uap0 del
echo "Criando interface uap0..."
iw dev wlan0 interface add uap0 type __ap
echo "Habilitando IP forwarding..."
sysctl net.ipv4.ip_forward=1
echo "Adicionando mascaramento..."
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 ! -d 192.168.4.0/24 -j MASQUERADE
ifconfig uap0 up
echo "Iniciando hostap..."
systemctl start hostapd.service
sleep 10
echo "Iniciando dhcpcd..."
systemctl start dhcpcd.service
sleep 5
echo "Iniciando dnsmasq..."
systemctl start dnsmasq.service
echo "Feito"
Chame o script como quiser. Eu coloquei esse conteúdo em um script chamado ap.sh e adicionei os bits de execução para owner e group:
chmod 755 ap.sh
Como entrou a regra de iptables nele, podemos colocar apenas esse script para inicializar em /etc/rc.local, antes do comando exit 0 ao final do arquivo. Se quiser criar um serviço de sistema, recomendo o artigo "Como criar serviço no Raspberry".
Dá pra fazer mais algumas configurações, mas vou deixar como está e se me animar, escrevo outro artigo relacionado ao tema.
Até a próxima!
Revisão: Ricardo Amaral de Andrade
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.