martes, 22 de septiembre de 2009

Flasheando el dir 300

Hace unos días, después de una visita al canal de chat de Buenos Aires Libre (#buenosaireslibre en freenode) me arme de valor y la instale DD-WRT (Un firmware basado en Linux para routers, con una gran cantidad de funcionalidades) a mi DIR-300. Use dos guías diferentes: la oficial, que es bastante escueta, y otra, para un router similar, que explica como configurar nuestra máquina para que el flasheo sea un éxito. Decidí escribir una guía en castellano, con bastante información que no hay sobre el proceso.

Conceptos Generales:
Herramientas que vamos a utilizar:

-GNU/Linux, en el sabor que mas nos guste. (Yo personalmente utilice Ubuntu Jaunty 9.04)

-Un servidor tftp (En Debían y derivados sudo apt-get install tftp xinetd tftpd).

-El archifamoso Putty (sudo apt-get install putty)

-Un cable de Red (Elemental Watson!)

-Los archivos ap61.ram, ap61.rom, linux.bin y dir300-firmware.bin (En su versión mas actualizada, desde el sitio oficial)

Hay cinco pasos principales para flashear el router:
1)Configurar el servidor tftp en la máquina que vamos a utilizar y verificar su funcionamiento.
2)Entrar al RedBoot del DIR- 300. Para eso vamos a usar un script de bash, que nos va a simplificar el trabajo.
3)Cargar el RedBoot modificado(ap61.ram) en la memoria del router.
4)Cargar la imagen de linux, linux.bin.
5)Configurar el script de inicio del router.

--Configurando el servidor tftp---

1-Instalamos, usando apt-get xinetd, tftpd y tftp
Bash:~$ sudo apt-get install xinetd tftpd tftp

2-Creamos el archivo de configuración en /etc/xinetd.d
Bash:~$ sudo gedit /etc/xinetd.d/tftp
Y le ponemos como contenido:

----Código----
service tftp
{
protocolo = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
server = /usr/sbin/in.tftpd
server_args = /tftpboot
disable = no }
----/Código----

3- Creamos el directorio /tftpboot, que es la carpeta que contiene los archivos compartidos por tftp y le damos permisos para que sea de acceso irrestricto, y no sea propiedad de nadie

Bash:~$ sudo mkdir /tftpboot
Bash:~$ sudo chown -R nobody /tftpboot/
Bash:~$ sudo chmod -R 777 /tftpboot/

4- Si no descargamos los archivos aun, lo hacemos ahora y los ponemos en nuestro directorio /tftpboot/ (son cuatro archivos en total)

5-Reiniciamos xinetd
Bash:~$ sudo /etc/init.d/xinetd stop
Bash:~$ sudo /etc/init.d/xinetd start

6- Probamos que todo funcione correctamente:
Bash:~$ tftp 127.0.0.1 #Nos conectamos por loopback al servidor que esta corriendo en nuestro equipo
tftp> verbose #Ponemos a la sesion en modo verbose, asi tenemos mas feedback de lo que pasa.
Verbose mode on.
tftp> get linux.bin #pedimos el archivo linux.bin
getting from 127.0.0.1:linux.bin to linux.bin [netascii]
Received 3764422 bytes in 0.5 seconds [60230752 bits/sec]]]
tftp> quit #terminamos la sesión
Nuestro servidor tftp funciona!!!!!

----Entrando al RedBoot----
No es fácil entrar al RedBoot sin la ayuda del siguiente script:

---Codigo---
#!/bin/bash
echo

echo ""
echo "Ingrese el nombre o la direccion IP del host: "
read host
while true
do
if eval "ping -c 1 -s 1 $host" > /dev/null; then
echo "Router Awake"
putty telnet://$host 9000 -m redboot.txt
break
else
echo "Esperando al Redboot para iniciar. Presione CTRL + C para salir"

sleep 1
fi done
---/Código---


Le ponemos el nombre que mas nos guste, en mi caso router.sh.

Tenemos que crear también un archivo redboot.txt que contenga lo siguiente:
---Código---
^C
-
--/Código---

Ahora empieza la acción!!!

-Desconectá el router (todos los cables de red y la energía), dale un besito de buenas noches y prometele que después de la operación va a sentirse mucho mas enérgico, animado, y funcional.
-Enchufa la computadora al router, usando el cable de red, en el puerto WAN.
-Cambia la ip de tu equipo a 192.168.20.80
Bash:~$ sudo ifconfig eth0 192.168.20.80 up #cambia eth0 por la interface que estes usando.
-ejectuta el script router.sh:
---Sesión de Bash---
Bash:~$ sudo ./router.sh

Ingrese el nombre o la direccion IP del host:

192.168.20.81 #esto lo ingresamos nosotros y le damos enter
Esperando al Redboot para iniciar. Presione CTRL + C para salir # Ahora conectamos la energia al router, despues de un momento nos tendria que abrir una ventana de putty
---Sesión de Putty---
RedBoot> load ap61.ram #Ojo!! es el ap61.ram, no se confundan con el ap61.rom!

RedBoot> go #La sesión va a ser terminada, ni se te ocurra resetear el router!

---/Sesión de Putty---

#Nos conectamos por cualquier puerto LAN del router, teniendo cuidado de no desconectar la alimentación
Bash:~$ sudo ifconfig eth0 192.168.1.20 up #Cambiamos la Ip a 192.168.1.20
Bash:~$ sudo ./router.sh #volvemos a usar nuestro lindo script para conectarnos al router
Ingrese el nombre o la direccion IP del host:
192.168.1.1

Esperando al Redboot para iniciar. Presione CTRL + C para salir.

---Sesión de Putty---

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 0x807f0000-0x80800000 at 0xbffe0000: .
DD-WRT> ip_address -h 192.168.1.20
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.20
DD-WRT> load -r -b %{FREEMEMLO} ap61.rom

Using default protocol (TFTP)
Raw file loaded 0x80080000-0x800a8717, assumed entry at 0x80080000
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 0x807f0000-0x80800000 at 0xbffe0000: .
DD-WRT> reset
#El Router se va a reiniciar, con el nuevo bootloader, por lo tanto, cerramos la ventana de putty y esperamos ~1 minuto, para volver a lanzar el script de conexión.
---/Sesión de Putty---
Bash:~$ sudo ./router.sh #volvemos a usar nuestro lindo script para conectarnos al router
Ingrese el nombre o la direccion IP del host:

192.168.1.1
Esperando al Redboot para iniciar. Presione CTRL + C para salir.
---Sesión de Putty---
DD-WRT> ip_address -h 192.168.1.20
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.2

DD-WRT> load -r -b 0x80041000 linux.bin #tomate unos segundo para chequear bien los números en Hexadecimal.
DD-WRT> fis create linux # Esta operación tarda unos minutos, tené paciencia
DD-WRT> fconfig boot_script true

DD-WRT> fconfig boot_script_timeout 4
DD-WRT> fconfig
Run script at boot: true
Boot script: Enter script, terminate with empty line
>> fis load -l linux
>> exec
>> Boot script timeout (1000ms resolution): 3 #Apretamos Enter
Use BOOTP for network configuration: false #Apretamos Enter
Gateway IP address: #Apretamos Enter
Local IP address: #Apretamos Enter
Local IP address mask: #Apretamos Enter

Default server IP address: #Apretamos Enter
Console baud rate: 9600 #Apretamos Enter

GDB connection port: 9000 #Apretamos Enter

Force console for special debug messages: false #Apretamos Enter

Network debug at boot time: false #Apretamos Enter
Update
RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0×80ff0000-0×81000000 at 0xbffe0000: .
DD-WRT> reset
---/Sesión Putty---
---/Sesión Bash---

Ya tenemos el ddwrt instalado!
Normalmente, no te va a levantar la ip automagicamente, para eso, desconecta el cable de red, espera que el router termine de arrancar, y volvelo a conectar, es un bug conocido de DD-WRT.

Para entrar a la configuración web:
http://192.168.1.1

Fuentes:
Sitio Oficial
Guia Oficial
Guia Copada del foro ddwrt
Archivos para el DIR-300 (Poniendo DIR 300 en el cuadro de busqueda)


2 comentarios:

Anónimo dijo...

¿Qué tal va el soporte de DD-WRT para el DIR300?

He usado DD-WRT en Linksys que he tenido y me gustaría ponérselo a un DIR300 pero he leído bastaantes problemas con el uPNP, lo de la IP en el puerto WAN, cuelgues, etc.

Joac dijo...

Yo lo uso con DD-WRT desde hace 1 año, y no tuve ningun problema, y se a bancado situaciones con muchos clientes conectados. Al lado del firmware de fabrica, es miles de veces mejor.