Desenvolvimento

4 out, 2017

Criando um roteador IoT com Raspberry Pi 3

Publicidade

Quando falamos de Internet das Coisas, pensamos muito nos dispositivos e na núvem, as vezes esquecendo dos elementos que irão compor a rede local, os roteadores. No mundo da Internet das Coisas, vamos precisar repensar o modo como hoje utilizamos a rede WiFi de casa, com aumento do número de dispositivos, os problemas também irão aumentar.

Sabemos que, no geral, o consumo de banda de um dispositivo não será muito grande, exceto os dispositivos de monitoramento por video, mas que no combinado de dispositivos, o roteador convencional poderá sofrer uma sobrecarga.

Roteadores para IoT

O que já se tornou comum em algumas arquiteturas, é o uso de um roteador especifico para os dispositivos IoT, paralelo ao roteador convencional. Isso faz com que um roteador, fique com foco nesses dispositivos, podendo atender até a regras especificas de segurança, diferentes da rede convencional.

Já existem roteadores ou gateways para IoT, mas no geral são mais caros que o normal e na maioria das vezes são específicos para os dispositivos do mesmo fabricante. Muitas vezes o usuário acaba por utilizar um roteador comum para esse fim.

Alguns exemplos de roteadores para IoT são:

Google WiFi Router

Securify Almond

Engenius IoT Intelligent Cloud Gateway

Criando o nosso próprio roteador IoT

Uma alternativa para contornar esse “problema”, é criar o nosso próprio roteador WiFi, que aos iniciantes, isso pode parecer uma missão quase impossível, mas não é.

Para iniciar o projeto do roteador, vamos primeiramente precisar do hardware, que nesse caso será uma Raspberry Pi 3, que já conta com WiFi e Bluetooth. A Raspberry utilizada neste artigo, foi cedida pela loja Usinainfo.

O próximo passo será criar a imagem do sistema operacional, que nesse caso, será o LEDE (Linux Embedded Development Environment). O LEDE é um fork do openWRT, sistema operacional baseado em Linux bem conhecido nos roteadores.

Vantagens e desvantagens em criar o nosso próprio roteador IoT

Devemos pensar nos motivos de criar ou não o nosso próprio roteador IoT e avaliar se essa será a melhor solução aos problemas que podemos enfrentar.

Vantagens:

  • Processamento superior aos roteadores convencionais
  • Memoria superior
  • Maior Armazenamento
  • 4 portas USB
  • Bluetooth nativo
  • GPIOs e outros periféricos

Desvantagens:

  • Custo superior aos roteadores de entrada
  • Antena interna sem conector para antena externa
  • Não é 5GHz
  • Apenas uma porta de rede Ethernet
  • Configuração inicial não intuitiva
  • Já sabendo das vantagens e desvantagens, podemos seguir com a construção ou buscar por uma solução alternativa, ou apenas servir de conhecimento.

Mas é só isso?

Não! A criação de um roteador IoT, vai além de apenas ter um novo hardware.

Em um roteador IoT, podemos ter um broker MQTT, banco de dados, APIs, regras de firewall especificas para os dispositivos entre outras aplicações locais. Podemos deixar parte do processamento ocioso para fazer analises dos dados, além de poder integrar as soluções diretamente com plataformas como o node-red, de forma bem fácil.

Outra opção é colocar outros rádios na porta USB, como modem 3G/4G, LoRa ou qualquer outro dongle USB.

Em outras palavras, o roteador será um dispositivo de borda, com um enorme poder de processamento local.

Além do roteador IoT

Devemos também dizer, que essa solução não é apenas para roteadores IoT. Podemos utilizar uma Raspberry como roteador para substituir, provisoriamente um roteador danificado, caso uma Raspberry esteja dando bobeira, criar um novo spot de internet auxiliar, uma extensão WiFi (repetidor) ou um conversor WiFi para rede cabeada (ethernet).

Existem inúmeras aplicações para uma Raspberry Pi na rede!

Criando uma imagem LEDE

Para criar uma nova imagem, vamos seguir os mesmos passos do artigo “Customizando e atualizando a Omega2”, apenas mudando a plataforma no ambiente Linux.

Na configuração da build, podemos escolher pacotes para compor a imagem, como o broker MQTT Mosquitto, mas o mesmo poderá ser instalado posteriormente, se necessário.

Passos

Primeiro devemos fazer o clone do projeto LEDE:

$ git clone https://github.com/lede-project/source.git
$ cd source
$ ./scripts/feeds update -a
$ ./scripts/feeds install -a

Feito o clone e o link para os pacotes, vamos configurar a imagem a ser criada:

$ make menuconfig

Agora devemos selecionar a plataforma Raspberry Pi 3

Target System (Broadcom BCM27xx)
Subtarget (BCM2710 64 bit based boards)
Target Profile (Raspberry Pi 3B (64 bit))

Saia da configuração, salvando as alterações.

Para facilitar futuras configurações, podemos instalar também o pacote LuCi (interface web de configuração).

Agora podemos seguir com a build da imagem:

$ make -j1 V=s

Esse processo deverá levar pelo menos 40 minutos, dependendo das configurações do computador que está fazendo a build.

Caso não queira fazer a própria imagem, baixe aqui: LEDE Raspberry Pi 3

Gravando a imagem no cartão SD

Para gravar a imagem no cartão SD, vamos utilizar o comando “dd”, que deve ser utilizado com cautela, já que pode causar danos no sistema.

Passos:

Descompacte o arquivo “lede-brcm2708-bcm2710-rpi-3-ext4-sdcard.img.gz” para obter a imagem.

Identifique o cartão SD no sistema pelo comando dmesg no terminal.

No meu caso o resultado foi o seguinte: mmcblk0: mmc0:1234 SA04G 3.65 GiB.

Execute o comando: $ sudo dd if=”arquivo.img” of=/dev/mmcblk0

Quando o processo finalizar:

$ sync

Configurando o LEDE

Feita a criação do cartão SD com a imagem, já podemos fazer o boot do LEDE na Raspberry.

Após o primeiro boot, já podemos configurar as interfaces para a Raspberry Pi operar como roteador WiFi, pegando Internet pela porta Ethernet.

A forma mais conveniente de fazer a primeira configuração, é colocar o cartão SD no computador e alterar os arquivos de configuração diretamente.

Os arquivos para serem alterados são:

  • /etc/config/wireless
  • /etc/config/network
  • /etc/config/dhcp
  • /etc/config/firewall

Arquivo wireless

config wifi-device 'radio0'
	option type 'mac80211'
	option channel '11'
	option hwmode '11g'
	option path 'platform/soc/3f300000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1'
	option htmode 'HT20'
	option country '00'

config wifi-iface 'default_radio0'
	option device 'radio0'
	option network 'lan'
	option mode 'ap'
	option ssid 'IoTRouter'
	option encryption 'psk2+tkip+ccmp'
	option key 'iotrouter'

As opções SSID e KEY (senha), podem ser alteradas conforme as necessidades.

Arquivo network

config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option ula_prefix 'fd6a:c05d:0fe5::/48'

config interface 'lan'
	option type 'bridge'
	option ifname 'eth0'
	option proto 'static'
	option ipaddr '192.168.1.1'
	option netmask '255.255.255.0'
	option ip6assign '60'

config interface 'wan'
	option proto 'dhcp'
	option ifname 'eth0'

Arquivo dhcp

config dnsmasq
	option domainneeded '1'
	option boguspriv '1'
	option filterwin2k '0'
	option localise_queries '1'
	option rebind_protection '1'
	option rebind_localhost '1'
	option local '/lan/'
	option domain 'lan'
	option expandhosts '1'
	option nonegcache '0'
	option authoritative '1'
	option readethers '1'
	option leasefile '/tmp/dhcp.leases'
	option resolvfile '/tmp/resolv.conf.auto'
	option nonwildcard '1'
	option localservice '1'

config dhcp 'lan'
	option interface 'lan'
	option start '100'
	option limit '150'
	option leasetime '12h'
	option dhcpv6 'server'
	option ra 'server'

config dhcp 'wan'
	option interface 'wan'
	option ignore '1'

config odhcpd 'odhcpd'
	option maindhcp '0'
	option leasefile '/tmp/hosts/odhcpd'
	option leasetrigger '/usr/sbin/odhcpd-update'
	option loglevel '4'

Arquivo firewall

config defaults
	option syn_flood '1'
	option input 'ACCEPT'
	option output 'ACCEPT'
	option forward 'REJECT'

config zone
	option name 'lan'
	option input 'ACCEPT'
	option output 'ACCEPT'
	option forward 'ACCEPT'
	option network 'lan wan'

config zone
	option name 'wan'
	option input 'REJECT'
	option output 'ACCEPT'
	option forward 'REJECT'
	option masq '1'
	option mtu_fix '1'
	option network 'wan6'

config forwarding
	option src 'lan'
	option dest 'wan'

config rule
	option name 'Allow-DHCP-Renew'
	option src 'wan'
	option proto 'udp'
	option dest_port '68'
	option target 'ACCEPT'
	option family 'ipv4'

config rule
	option name 'Allow-Ping'
	option src 'wan'
	option proto 'icmp'
	option icmp_type 'echo-request'
	option family 'ipv4'
	option target 'ACCEPT'

config rule
	option name 'Allow-IGMP'
	option src 'wan'
	option proto 'igmp'
	option family 'ipv4'
	option target 'ACCEPT'

config rule
	option name 'Allow-DHCPv6'
	option src 'wan'
	option proto 'udp'
	option src_ip 'fc00::/6'
	option dest_ip 'fc00::/6'
	option dest_port '546'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-MLD'
	option src 'wan'
	option proto 'icmp'
	option src_ip 'fe80::/10'
	list icmp_type '130/0'
	list icmp_type '131/0'
	list icmp_type '132/0'
	list icmp_type '143/0'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-ICMPv6-Input'
	option src 'wan'
	option proto 'icmp'
	list icmp_type 'echo-request'
	list icmp_type 'echo-reply'
	list icmp_type 'destination-unreachable'
	list icmp_type 'packet-too-big'
	list icmp_type 'time-exceeded'
	list icmp_type 'bad-header'
	list icmp_type 'unknown-header-type'
	list icmp_type 'router-solicitation'
	list icmp_type 'neighbour-solicitation'
	list icmp_type 'router-advertisement'
	list icmp_type 'neighbour-advertisement'
	option limit '1000/sec'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-ICMPv6-Forward'
	option src 'wan'
	option dest '*'
	option proto 'icmp'
	list icmp_type 'echo-request'
	list icmp_type 'echo-reply'
	list icmp_type 'destination-unreachable'
	list icmp_type 'packet-too-big'
	list icmp_type 'time-exceeded'
	list icmp_type 'bad-header'
	list icmp_type 'unknown-header-type'
	option limit '1000/sec'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-IPSec-ESP'
	option src 'wan'
	option dest 'lan'
	option proto 'esp'
	option target 'ACCEPT'

config rule
	option name 'Allow-ISAKMP'
	option src 'wan'
	option dest 'lan'
	option dest_port '500'
	option proto 'udp'
	option target 'ACCEPT'

config include
	option path '/etc/firewall.user'

Com essas configurações, o Raspberry pode ser ligado em um cabo de rede com internet, para fazer o roteamento da internet pelo WiFi. Logo após o boot, o SSID configurado deverá aparecer.

Em um artigo futuro, poderá ser utilizado como um broker de MQTT.

Conclusão

Se você precisar de um roteador para IoT, e estiver com tempo para criar o seu próprio, essa alternativa cairá como uma luva. Mas se você também quiser estudar o sistema LEDE para roteadores, será uma excelente alternativa, já que o risco de “brickar” a Raspberry é praticamente nula, uma vez que basta regravar o cartão SD e tudo volta ao normal.

Criar o seu próprio roteador pode ser uma boa diversão, além de ser muito útil!

Happy Hacking!