25 de outubro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Raspberry como Access Point WiFi

DNS no Raspberry | Access Point WiFi | Raspbian Buster para Raspberry Pi 4

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.

Recursos a serem configurados

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”.

Configurar o Raspberry como access point WiFi local

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:

Configurar o IP estático

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

Configuração do servidor DHCP com dnsmasq

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

Configurar o access point com o hostapd

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

Configurar forwarding

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

Mascaramento de IP com iptables e NAT

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

Script de inicialização

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