2. OpenWrt

Prezado(a) leitor(a)!

Organizei mais essa seção para compartilhar informações sobre o projeto OpenWrt.

O OpenWrt é uma distribuição do GNU/Linux, altamente customizável, direcionada a sistemas embarcados (frequentemente roteadores wireless).(Fonte: OpenWrt).

Para dar os primeiros passos consultar o tutorial https://wiki.openwrt.org/doc/playground/newcomer.

A primeira notícia que tive sobre este projeto foi através do nosso amigo Nelson Saraiva que utilizou um mini roteador TPLink modelo MR3020 (Figura 2) para fazer uma conexão wifi com uma placa Arduino.

2.1. Instalação

O primeiro passo foi providenciar a compra do roteador no site do BoaDica.

Figura 2. Conectores do mini roteador TL-MR3020 (Fonte: Guia do usuário)

Conectores do mini roteador TL-MR3020 (Fonte: Guia do usuário)

As informações sobre a compatibilidade desse modelo com o OpenWrt estão disponíveis na página https://wiki.openwrt.org/toh/tp-link/tl-mr3020.

A tabela Supported Hardware Versions informa quais versões do firmware são compatíveis com as diferentes versões de hardware. Verifiquei na etiqueta que o roteador (figura 3) era da versão 1.9 e portanto seria compatível com o firmware a partir da versão 12.09 (Attitude Adjustment).

Figura 3. Etiqueta com o modelo e o número da versão do roteador.

Etiqueta com o modelo e o número da versão do roteador.

Seguindo a sugestão Use the latest available release for new deployments unless you know exactly what you do baixei a última versão (Chaos Calmer 15.05.1) do OpenWrt para o roteador MR3020: openwrt-15.05.1-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin.

Nota

Esse download foi feito no dia 04/08/2016, e portanto verifique a versão do firmware compatível com a versão do seu hardware e procurei baixar a última versão.

Baixei também o arquivo md5sum e comparei o md5sum do arquivo .bin com a tabela para verificar a integridade do arquivo e evitar problemas.

Em seguida liguei o roteador, conectei com o PC através do cabo Ethernet, abri o navegador e digitei o endereço 192.168.0.254. Alguns tutoriais recomendam resetar o roteador para restaurar as configurações de fábrica antes de fazer a atualização do firmware.

O login padrão é admin, senha admin, e em seguida selecione a opção System Tools e Firmware Upgrade. Na tela seguinte, selecione o arquivo .bin do firmware e clique em Upgrade.

No meu caso, ele não reconheceu o arquivo e pediu para selecionar novamente o arquivo .bin. Nessa hora me lembrei de ter lido em algum lugar para renomear o arquivo com um nome menor no caso de não ser reconhecido. Apenas troquei o nome para openwrt-15.05.1.bin e pude dar prosseguimento à atualização. Enquanto isso fui fazer um lanche para não ficar ansioso esperando o resultado. :-)

Após a atualização digitei no browser o endereço 192.168.1.1 e pude ver a tela de login (figura 4).

Figura 4. Tela de login após instalação do OpenWrt.

Tela de login após instalação do OpenWrt.

Segundo a seção Log into your Router Running OpenWrt basta clicar em Login sem precisar,por enquanto, digitar a senha de root.

É possível visualizar informações do roteador na opção Status -> Overview, mas para definir a senha de root selecionar no menu System -> Administration (figura (figura 5), digitar a senha de root e clicar no botão Save & Apply.

Figura 5. Tela de login após instalação do OpenWrt.

Tela de login após instalação do OpenWrt.

Depois de definir a senha de root segui os tutoriais Nelson Saraiva e Secure and Turn on Wifi para ativar o Wifi e definir a senha para os clientes.

O meu objetivo inicial é configurar o roteador para funcionar como cliente WISP (Wireless Internet Service Provider) conforme a figura 6.

Figura 6. Roteador com OpenWrt operando no modo Cliente.

Roteador com OpenWrt operando no modo Cliente.

Mas fiquei muito confuso com tantas opções de modo de operação na seção: Network -> Wifi -> Edit -> Interface Configuration -> Mode:

  • Access Point

  • Client

  • Ad-Hoc

  • 802.11s

  • Pseudo Ad-Hoc (ahdemo)

  • Monitor

  • Access Point (WDS)

  • Client (WDS)

Comecei a encontrar informações mais esclarecedoras de como configurar o roteador para diferentes funções quando passei a pesquisar com as seguintes palavras chaves: OpenWrt AND client.

Escolhi o vídeo Configurar Router con Firmware OpenWRT en Modo Cliente e consegui, pela primeira vez, fazer o roteador MR3020 com OpenWrt (Cliente) acessar a Internet através do roteador Huawei E156B da Vivo (Master) obtendo a configuração como indicada na figura 7.

Figura 7. Roteador com OpenWrt operando no modo WISP (Fonte: guia de instalação rápida do fabricante TP-Link).

Roteador com OpenWrt operando no modo WISP (Fonte: guia de instalação rápida do fabricante TP-Link).

Essa configuração foi obtida com as seguintes etapas:

  1. Abrir o browser, digitar o endereço 192.168.1.1 e logar como root

  2. Network -& Wifi & Scan, para identificar as redes disponíveis

  3. Selecionar a rede para acessar a Internet e clicar em Join Network

  4. Digitar a senha para acesso à rede wifi master e clicar em Submit

    Figura 8. Join Network: Settings

    Join Network: Settings

  5. Na tela seguinte (Network -> Wifi -> Edit -> Interface Configuration -> Mode) selecionar o modo Client e clicar em Save & Apply

    Figura 9. Interface Configuration

    Interface Configuration

  6. No meu caso, o endereço do roteador master era 192.168.1.1, ou seja, o mesmo endereço do roteador OpenWrt e para evitar conflito alteramos o IP do roteador cliente para 192.168.2.1 (mantendo a máscara de rede em 255.255.255.0), selecionando no menu Network -> Interfaces e clicando em Edit da interface LAN

    Figura 10. Alteração do endereço IP do roteador OpenWrt para 192.168.2.1

    Alteração do endereço IP do roteador OpenWrt para 192.168.2.1

  7. Após alterar o IP clicar o botão Save & Apply.

Após essas alterações me loguei no OpenWrt com o comando:

ssh root@192.168.2.1

E pude verificar o acesso à Internet com o comando ping:

  root@OpenWrt:~# ping www.google.com
PING www.google.com (201.87.209.181): 56 data bytes
64 bytes from 201.87.209.181: seq=0 ttl=60 time=15.170 ms
64 bytes from 201.87.209.181: seq=1 ttl=60 time=17.943 ms

Com o comando ifconfig verifiquei que a interface wlan0 do roteador MR3020 recebeu o IP 192.168.0.102 do roteador Huawei (C2O), e a interface br-lan (MR3020) ficou com o IP fixo de 192.168.2.1. Um Laptop conectado na porta Ethernet do MR3020 recebeu o IP 192.168.2.141, e um tablet conectado na rede C2O recebeu o IP 192.168.0.103, conforme a figura 11.

Figura 11. Configuração final no modo Client.

Configuração final no modo “Client”.

Fiquei satisfeito pois, pelo menos, poderia dar prosseguimento à instalação de pacotes usando o gerenciador de pacotes OPKG, visando habilitar o uso da porta USB para instalação de pacotes adicionais e a conexão de uma placa Arduino.

Mas ainda queria encontrar uma maneira de criar uma rede Wifi exclusiva para o roteador MR3020, ou seja, criar uma rede sem fio privada apenas com o roteador MR3020 com OpenWrt e independente de um segundo roteador com acesso à Internet.

Encontrei um tutorial muito didático para a configuração do OpenWrt em diferentes modos: Modo Cliente/Repetidor/WDS con Openwrt, e resolvi experimentar a parte 2 do tutorial Parte 2 :: Modo repetidor sobre cliente enrutado (repetidor em cliente em modo roteado).

  1. Após me logar na interface LuCI selecionei Network -> Wifi e cliquei no botão Add para criar uma nova configuração de Ponto de Acesso. Após a criação, clicar no botão Edit.

  2. Na aba General Setup da seção Interface Configuration defini o ESSID como OpenWrt, Mode como Access Point e em Network selecionei a opção lan.

    Figura 12. Configuração do modo Access Point na seção Interface Configuration.

    Configuração do modo “Access Point” na seção Interface Configuration.

  3. Após clicar em Save & Apply a tela Wireless Overview mostra:

    Figura 13. Tela Wireless Overview com os modos Client e Access Point.

    Tela “Wireless Overview” com os modos “Client” e “Access Point”.

Com essa nova configuração é possível identificar a rede wifi OpenWrt na qual foi possível conectar um laptop e um tablet.

Com o comando ifconfig identifiquei no roteador MR3020 a interface br-lan com IP 192.168.2.1, wlan0 com IP 192.168.0.100 e wlan0-1 sem IP. Um Laptop conectado na rede OpenWrt mostra um interface wlan0 com IP 192.168.2.126 e um tablet conectado na rede OpenWrt recebeu o IP 192.168.2.148, conforme a figura 14.

Figura 14. Tela Wireless Overview com os modos Client e Access Point.

Tela “Wireless Overview” com os modos “Client” e “Access Point”.

Resolvi fazer um teste e desligar o roteador principal (C2O) para verificar se o roteador MR3020 manteria as conexões. Após desligar o roteador principal os dispositivos conectados perdem a conexão mas o sinal da rede OpenWrt reaparece após alguns instantes e foi possível reconectar o laptop e o tablet ao roteador MR3020. :-)

2.2. Modos de operação do roteador

Encontrei algumas informações que foram muito úteis para entender os modos de operação nos excelentes tutoriais do Luiz Angelo Daros de Luca que transcrevo literalmente a seguir:

...Durante a configuração do OpenWRT, não vemos as usuais interfaces do Linux (eth1, wlan0,...). O que encontramos são interfaces de "mais alto nível" como LAN e WAN. Estas interfaces podem ser mapeadas diretamente para uma única interface do roteador (agora sim eth0, etc) ou agrupá-las em uma bridge.

Por padrão, existem duas interfaces: WAN (Wide area network) e a LAN (Local area network). A WAN normalmente é composta apenas de uma interface (eth1), normalmente destacada das demais portas, utilizada para a conexão com a Internet. A LAN é uma bridge que junta a eth0 (portas da rede local) e a interface wireless (wlan0).

A interface wlan0 pode se juntar com a WAN, as portas da LAN serem usadas para conexões diversas com a Internet ou juntar tudo e tornar o roteador um simples ponto de acesso (access-point) sem qualquer roteamento.

Alguém pode perguntar: "mas as portas da rede local, aquelas 4, são mapeadas para uma única interface, a eth0?". Sim, são. Mas isto não é um limitador. Apesar de, por padrão, estarem juntas, as portas, se o HW permitir, podem ser isoladas em diversas redes, enviar pacotes com tags de VLANs e assim por diante. Porém, isto é um tema para um artigo isolado.

Em geral, não é alterada a rede LAN e a WAN opera configurada por DHCP, PPPoE, dependendo do seu provedor.

OK, até agora como qualquer roteador. Porém, agora entra a flexibilidade do OpenWRT. As funções das interfaces podem ser:

  • Alteradas

  • Alternadas

  • Agregadas

  • Divididas

Para os roteadores wireless, é provavel que o desejo seja ativar o rádio. Isto é feito na configuração Wifi. SSID, criptografia (WPA ou WPA2, por favor. Esqueça que WEP existe), uma senha razoável, potência, canal, tudo isto que já encontramos em todos os firmwares. Vou focar nas diferenças: modo de operação.

Existe uma boa gama de opções do modo de operação desde o clássico "AP", passando pelo simplório Ad-hoc e por coisas mais interessantes como redes Mesh (802.11s), WDS cliente ou servidor, ou até mesmo se comportando como um cliente wireless comum, conectando-se a outro roteador Wireless. Há também o modo "monitor", para realizar captura de pacotes wireless.

Passando rapidamente, outra coisa interessante pode não ser notada. Na configuração do Wifi, existe um botão para "Adicionar".

Adicionar o que?

Outra configuração wireless.

Se o HW permitir, e normalmente permite, você pode ter múltiplas configurações de rede sem fio, operando em modos diferentes, com senhas diferentes, com SSID diferentes, cada uma representando uma interface. Vou tentar fazer um artigo somente sobre casos interessantes de uso da rede sem fio múltipla. ...

2.3. Suporte a USB

Seguindo as dicas do Nelson Saraiva e da página USB Basic Support atualizei os pacotes com o gerenciador de pacotes OPKG:

opkg install kmod-usb-core

Mas aparentemente esse pacote já estava instalado:

root@OpenWrt:~# opkg install kmod-usb-core
Package kmod-usb-core (3.18.23-1) installed in root is up to date.

Depois instalei o pacote kmod-usb-ohci:

opkg install kmod-usb-ohci

Mas ao carregar o módulo com o comando insmod usb-ohci retorna a mensagem:

root@OpenWrt:~# insmod usb-ohci
Failed to find usb-ohci. Maybe it is a built in module ?

Não entendi a mensagem, então removi o ohci e instalei o uhci e o kmod-usb2 conforme as mensagens:

root@OpenWrt:~# opkg remove kmod-usb-ohci
Removing package kmod-usb-ohci from root...
root@OpenWrt:~# opkg install kmod-usb-uhci
Installing kmod-usb-uhci (3.18.23-1) to root...
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/base/kmod-usb-uhci_3.18.23-1_ar71xx.ipk.
Configuring kmod-usb-uhci.
root@OpenWrt:~# insmod usbcore
module is already loaded - usbcore
root@OpenWrt:~# insmod uhci
Failed to find uhci. Maybe it is a built in module ?
root@OpenWrt:~# opkg install kmod-usb2
Package kmod-usb2 (3.18.23-1) installed in root is up to date.
root@OpenWrt:~# insmod ehci-hcd
module is already loaded - ehci-hcd

Conectei um pen-drive na porta USB e vi no final as mensagens do comando dmesg:

  [ 1481.830000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[ 1481.850000] ohci-platform: OHCI generic platform driver
[ 1629.140000] uhci_hcd: USB Universal Host Controller Interface driver
[ 1897.780000] usb 1-1: new high-speed USB device number 2 using ehci-platform

Parece que os drivers ohci, uhci e ehci já estavam instalados.

Considerando que o suporte básico a dispositivos USB já estava instalado parti para a seção USB Storage e foi então que percebi que não havia espaço para instalar o restante dos pacotes.

Cheguei a pedir ajuda no fórum do OpenWrt com a mensagem Need space to install package for USB storage e recebi diferentes sugestões. Alguns sugeriram preparar uma imagem menor com o Image Generator (Image Builder) mas não me pareceu uma alternativa trivial e não fiquei animado a seguir essa sugestão.

Uma outra sugestão foi instalar uma imagem mais antiga e menor, para evitar ficar com pouco espaço e impedido de instalar os pacotes para suporte a USB storage (kmod-usb-storage block-mount kmod-fs-ext4).

Acabei optando pela instalação de uma versão mais antiga do OpenWrt e resolvi utilizar a mesma versão usada no tutorial do Nelson Saraiva (Attitude Adjustment 12.09).

Baixei o arquivo openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin, calculei o md5sum e fiz a nova gravação pela interface LuCI selecionando System > Backup/Flash Firmware > Flash operations > Flash new firmware image.

Selecionar o arquivo openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin, desmarcar a opção Keep settings e iniciar a gravação clicando no botão Flash image.

Não tive nenhum sinal do final da operação, os LEDs ficaram piscando e não vi o roteador reiniciar. Depois de alguns minutos fui almoçar e deixei o processo rodando.

Depois de aproximadamente 1 hora os LEDs continuavam piscando e a interface LuCI continuava aguardando a conexão.

Achei que tinha dado errado e resolvi desligar/religar o roteador e após alguns instantes, consegui reconectar abrindo o navegador no endereço 192.168.1.1. :-)

A seguir providenciei a configuração da senha de root, alteração do endereço IP do roteador OpenWrt para 192.168.2.1, ativação da interface wifi e configuração do roteador no modo client conforme descrito na seção de instalação.

Reiniciei o roteador, me conectei com o comando ssh root@192.168.2.1 e tive que executar alguns comandos sugeridos pelo ssh para criar nova chave. Apos criar uma conexão ssh testei a conexão com o comando ping pelo terminal.

Fiz a instalação dos pacotes sugeridos na seção USB Storage:

opkg update
opkg install kmod-usb-storage block-mount kmod-fs-ext4

Nota

O gerenciador de pacotes se encarregou de instalar as dependências necessárias.

Em seguida, utilizei outro computador para particionar e formatar um pen-drive de 4GB com o sistema de arquivos ext4 com os comandos fdisk e mkfs.ext4 conforme o tutorial https://wiki.openwrt.org/doc/howto/storage.

Conectei um pen-drive em um hub USB conectado na porta USB e pude ver as mensagens de reconhecimento do dispositivo do final do comando dmesg:

hub 1-0:1.0: USB hub found
[    8.050000] hub 1-0:1.0: 1 port detected
[    8.070000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    8.130000] Initializing USB Mass Storage driver...
[    8.140000] usbcore: registered new interface driver usb-storage
[    8.140000] USB Mass Storage support registered.
[    8.380000] usb 1-1: new full-speed USB device number 2 using ehci-platform
[    8.540000] hub 1-1:1.0: USB hub found
[    8.540000] hub 1-1:1.0: 4 ports detected
[    8.830000] usb 1-1.1: new full-speed USB device number 3 using ehci-platform
[    8.970000] usb 1-1.1: not running at top speed; connect to a high speed hub
[    8.990000] scsi0 : usb-storage 1-1.1:1.0
[    9.990000] scsi 0:0:0:0: Direct-Access     Generic  Flash Disk       8.07 PQ: 0 ANSI: 4
[   10.010000] sd 0:0:0:0: [sda] 15728640 512-byte logical blocks: (8.05 GB/7.50 GiB)
[   10.020000] sd 0:0:0:0: [sda] Write Protect is off
[   10.020000] sd 0:0:0:0: [sda] Mode Sense: 23 00 00 00
[   10.030000] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[   10.060000]  sda: sda1
[   10.070000] sd 0:0:0:0: [sda] Attached SCSI removable disk
[   28.710000] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)

2.4. Montando o sistema de arquivos em um pendrive

Após o reconhecimento do pendrive a próxima etapa era configurar o sistema para montar o sistema de arquivos no pendrive.

Alguns links importantes para essa etapa:

Criei o diretório /mnt/usb e montei o pendrive:

root@OpenWrt:~# mount /dev/sda1 /mnt/usb

Em seguida criei o arquivo /etc/config/fstab:

cat /etc/config/fstab 
config global automount
	option from_fstab 1
	option anon_mount 1
	
config global autoswap
	option from_fstab 1
	option anon_swap 0
	
config mount
	option target	/mnt/usb
	option device	/dev/sda1
	option fstype	ext4
	option options	rw,sync
	option enabled	1
	option enabled_fsck 0

config swap
	option device	/dev/sda2
	option enabled	0
 

Em seguida copiar os arquivos da /overlay para a nova partição:

   tar -C /overlay -cvf - . | tar -C /mnt/usb -xf -
 

Após reiniciar foi possível ver as seguintes informações:

   root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                    7.5G    255.6M      6.8G   4% /
/dev/root                 2.0M      2.0M         0 100% /rom
tmpfs                    14.3M     92.0K     14.2M   1% /tmp
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/sda1                 7.5G    255.6M      6.8G   4% /overlay
overlayfs:/overlay        7.5G    255.6M      6.8G   4% /

root@OpenWrt:~# mount
rootfs on / type rootfs (rw)
/dev/root on /rom type squashfs (ro,relatime)
proc on /proc type proc (rw,noatime)
sysfs on /sys type sysfs (rw,noatime)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime,size=14608k)
tmpfs on /dev type tmpfs (rw,noatime,size=512k,mode=755)
devpts on /dev/pts type devpts (rw,noatime,mode=600)
/dev/sda1 on /overlay type ext4 (rw,sync,relatime,user_xattr,barrier=1,data=ordered)
overlayfs:/overlay on / type overlayfs (rw,relatime,lowerdir=/,upperdir=/overlay)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
none on /proc/bus/usb type usbfs (rw,relatime)

2.5. Conectando o Arduino

Alguns links importantes para essa etapa:

Para a montagem do dispositivo /dev/ttyACM instalei o pacote:

opkg update
opkg install kmod-usb-acm

E ao conectar a placa Arduino no hub USB pude ver a mensagem de reconhecimento com o comando dmesg:

 ...
  usb 1-1.3: new full-speed USB device number 4 using ehci-platform
[ 4823.100000] cdc_acm 1-1.3:1.0: ttyACM0: USB ACM device

Para minha surpresa descobri que havia no repositório um pacote para o interpretador tcl:

  root@OpenWrt:~# opkg list | grep tcl
...
tcl - 8.5.8-1 - Tcl (Tool Command Language) is a very powerful but easy to learn dynamic programming language,
suitable for a very wide range of uses, including web and desktop applications, networking, administration, testing and many more.
Open source and business-friendly, Tcl is a mature yet evolving language that is truly cross platform,
easily deployed and highly extensible.

Então fiz a instalação com o comando:

opkg install tcl

Mas ao executar o interpretador aparecia a seguinte mensagem:

  Can't find a usable init.tcl in the following directories:
    /usr/lib/tcl8.5 /usr/lib/tcl8.5 /lib/tcl8.5 /usr/library /library /tcl8.5.8/library /tcl8.5.8/library

Encontrei a solução na mensagem tcl 8.5 in AA and trunk, error with init.tcl and other library.

Mas não consegui criar um diretório:

root@OpenWrt:/# mkdir /usr/lib/tcl8.5
mkdir: can't create directory '/usr/lib/tcl8.5': Read-only file system

Não consegui descobrir o motivo, mas depois de reinicializar o roteador o problema sumiu e pude criar o diretório e copiar o arquivo init.tcl para a pasta /usr/lib/tcl8.5 com o comando:

scp /home/markos/init.tcl root@192.168.2.1:/usr/lib/tcl8.5/init.tcl

E finalmente tive acesso ao interpretador Tcl dentro do OpenWrt sem mensagens de erro:

root@OpenWrt:~# tclsh8.5 
tclsh8.5.8> 

Mas ao tentar configurar os parâmetros de comunicação serial recebia uma mensagem de erro:

tclsh8.5.8> fconfigure $porta -mode 9600,n,8,1
[Error] bad option "-mode": should be one of -blocking, -buffering, -buffersize, -encoding, -eofchar, or -translation

Então instalei o pacote coreutils-stty:

opkg install coreutils-stty

E fiz a configuração dos parâmetros de comunicação serial com o comando: (Fonte: http://www.tldp.org/LDP/nag2/x-087-2-serial-configuration.html)

stty -F /dev/ttyACM0 9600 cs8 -parenb -cstopb

E finalmente pude ver as mensagens do Arduino com o loop:

tclsh8.5.8> while 1 {
after 500
puts [gets $porta]
}
Clicks em 10 segundos - 0

Volume em 10 segundos - 0.00

Clicks em 10 segundos - 0

Volume em 10 segundos - 0.00

Dica

Esta placa Arduino estava sendo usado no projeto Pluviômetro.

Simple TCP/IP to serial port gateway http://wiki.tcl.tk/10042