Este artigo é de co-autoria de
Rodrigo Troian e
Vinicius John.
Estudando e testando redes Mesh nos deparamos com a necessidade de trocar o firmware original dos roteadores para firmwares livres. Neste pequeno artigo demonstraremos a troca do firmware para o
roteador D-Link modelo
DIR-300, um equipamento barato e de fácil acesso no mercado brasileiro, que após a troca do sistema operacional deve agregar alguns reais a mais, pois o mesmo passa a permitir seu uso com WDS, múltiplas interfaces wifi virtuais, estatísticas, acesso ssh, QOs, rodar protocolos de rede mesh (olsr, b.a.t.m.a.n., etc.) enfim, coisas que só o
GNU/Linux faz para você!
Tenha clareza de que você estará modificando o software que controla todo o hardware do seu equipamento, o sistema operacional. Qualquer problema que ocorra principalmente durante os processos críticos de gravação poderá danificar o hardware permanentemente, faça por sua conta e risco! Mas os resultados compensam, e como! :-)
A parte inicial da troca do firmware deste router é igual tanto para DD-WRT como OpenWRT. Este script foi escrito e testado usando sistema operacional GNU/Linux e OS X como estação.
Dicas: tenha paciência e vá com calma. Verificando duas vezes antes de dar os comandos. No caso de uploads de arquivo, verifique se os arquivos existem e o servidor tftp está escutando. Aguarde os comandos retornarem ao prompt, muitas vezes demoram um pouco na execução. Se houver possibilidade, conecte seu roteador e micro a nobreak.
Material necessário: microcomputador com placa de rede disponível, servidor tftp (no GNU/Linux usamos atftpd), putty no GNU/Linux e telnet no OS X, cabo de rede, roteador D-Link Dir-300 e o seguinte script para abrir o gerenciador de boot do roteador, conforme segue:
# cat scriptdd.bash
#!/bin/bash
echo ""
echo "Usando IP padrao gerenciador boot original do DIR-300: 192.168.20.81"
host="192.168.20.81"
#Para acessar o gerenciador de boot do dd-wrt comente as duas linhas acima e
#descomente as duas abaixo
#echo "Usando IP padrao do dd-wrt: 192.168.1.1"
#host="192.168.1.1"
while true
do
if eval "ping -c 1 -s 1 $host" > /dev/null; then
echo "Acordou o roteador. Tentando conectar via telnet"
#no machintoch, somente o comando telnet funcionou
#telnet $host 9000
#para micros com sistema gnu/linux, precisamos instalar o putty e criar um arquivo
#ctrlc.txt com o conteudo "^C" (sem aspas) e colocar no mesmo diretorio deste script
putty telnet://$host:9000 -m ctrlc.txt
break
else
echo "Esperando pelo gerenciador de boot. Pressione CTRL + C para sair."
sleep 1
fi
done
Começando então:
Para saber os detalhes técnicos do seu roteador, coisa que estranhamente os fabricantes não disponibilizam, um caminho é acessar o site do DD-WRT e encontrar o seu roteador (marcar/modelo), lá estão quantidade de memória ram, memória flash e processador do equipamento.
0. Baixar os arquivos necessários:
No site do DD-WRT baixe os arquivos ap61.ram e ap61.rom.
No site do OpenWRT.org, encontre a versão que você quer (kamikaze/backfire - última), acesse a pasta correspondente ao sistema, no caso do DIR-300 atheros, e baixe openwrt-atheros-vmlinux.lzma e openwrt-atheros-root.squashfs. Cuidado com estes arquivos, é importante um correto download. Já copie os arquivos na raiz do servidor tftp. Nós utilizamos o OpenWRT na versão kamikaze 8.09.2.
1. Configurar IP local manualmente para 192.168.20.80/24 (255.255.255.0). Se estiver usando o network-manager no GNU/Linux, faça através dele ou desative-o e faça manualmente.
2. Conectar o cabo de rede no micro e na porta WAN do roteador.
3. Desligar a energia elétrica do router e religar, já pressionando o botão reset localizado na parte de trás do router. Assim que ligar, inicie o script no micro (conforme comando abaixo) e mantenha o reset pressionado até a mensagem "Router Awake" aparecer já como saída do script.
# bash scriptdd.bash
4. Aguarde o prompt do RedBoot aparecer (gerenciador de boot padrão do DIR-300).
Usando IP padrao DIR-300: 192.168.20.81
Waiting for Redboot to boot. Press CTRL + C to quit
Router Awake
Trying 192.168.20.81...
Connected to 192.168.20.81.
Escape character is '^]'.
RedBoot>
5. Levante o tftp server (no Debian/Ubuntu atftpd), com os arquivos necessários já copiados para sua raiz (ap61.ram e ap61.rom para /tftpboot). Tenha certeza que o tftp esteja rodando ("ps aux | grep ftp" ou "netstat -anp | grep ftp"). Caso utilize firewall, desative-o ou libere a porta padrão do tftp (69).
6. Digite no prompt do RedBoot. Estaremos carregando o sistema de boot do dd-wrt para a memória ram. Se houver interrupção de energia, será necessário gravar novamente a ram.
RedBoot>
load ap61.ram
Using default protocol (TFTP)
Entry point: 0x800410bc, address range: 0x80041000-0x800680d8
Caso dê timeout na saída do comando load, o router não está conseguindo conectar ao servidor tftp, reveja suas configurações. Também é útil utilizar um sniffer de pacotes para ver o que está acontecendo.
Reiniciando o router:
RedBoot>
go
7. Troque o IP da placa de rede do micro para 192.168.1.2/24. O equipamento agora já irá carregar o gerenciador de boot do dd-wrt gravado na ram.
# telnet 192.168.1.1 9000
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
DD-WRT>
Observe que o prompt já é diferente. Lembre-se de reiniciar o servidor tftp depois da mudança de IP da placa de rede.
Continuando então...
Apagando a flash de inicialização, incluindo a rom de inicialização original, portanto a partir de agora, não pode haver interrupção de energia.
DD-WRT>
fis init
About to initialize [format] FLASH image system - continue (y/n)?
y
*** Initialize FLASH Image System
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x80ff0000-0x81000000 at 0xbffe0000: .
DD-WRT>
Confirmando endereço IP do micro:
DD-WRT>
ip_address -h 192.168.1.2
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.2
Carregando a ROM de inicialização:
DD-WRT>
load -r -b %{FREEMEMLO} ap61.rom
Using default protocol (TFTP)
Raw file loaded 0x80080000-0x800a8717, assumed entry at 0x80080000
Montando a imagem da rom.
DD-WRT>
fis create -l 0x30000 -e 0xbfc00000 RedBoot
An image named 'RedBoot' exists - continue (y/n)?
y
... Erase from 0xbfc00000-0xbfc30000: ...
... Program from 0x80080000-0x800a8718 at 0xbfc00000: ...
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x80ff0000-0x81000000 at 0xbffe0000: .
Reiniciando o router:
DD-WRT>
reset
Conectando novamente:
# telnet 192.168.1.1 9000
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
DD-WRT>
Confirmando mais uma vez o IP do micro:
DD-WRT>
ip_address -h 192.168.1.2
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.2
Gravando a imagem da rom de boot do dd-wrt.
DD-WRT>
fis init
About to initialize [format] FLASH image system - continue (y/n)?
y
*** Initialize FLASH Image System
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x80ff0000-0x81000000 at 0xbffe0000: .
Trocado o boot loader do roteador, não há problemas com interrupção de energia. Começamos os procedimentos para instalar o firmware OpenWRT do DD-WRT são diferentes e seguem separados.
telnet 192.168.1.1 9000
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.