Flasheando un D-Link Dir-300
Si sos adverso al riesgo ESTE NO ES EL ROUTER PARA VOS. Si te quedás sin electricidad (mbuejeje yo tengo UPS) o se te desenchufa el router (yo uso cinta en los conectores) en el momento inadecuado, lo podés romper y vas a tener que hacerte el boludo e ir a que te lo cambien a la garantía que obviamente no te cubre este procedimiento.
Buenos Aires Libre no se hace responsable si este tutorial te rompe el router. Le anduvo al menos a PedroVarangot en dos DIR-300 comprados el 9 de Diciembre de 2008.
Los firmwares que hay para ponerle al Dir-300 son principalmente el DD-WRT y el OpenWRT. EduardoMizerit está haciendo Balero.
DD-WRT soporta bien este router desde la versión 24 sp1. El OpenWRT al día de escribir esto solo lo soporta en la versión 8.09 RC1, o en una compilación custom de CVS. En la 8.09 RC1 no anda el switch y se ve una sola LAN, para hacer andar el switch hay que hacerte una compilación propia con algunos parches que están detallados acá: Ticket sobre switch del DIR-300 en OpenWRT.
Tanto DD-WRT como OpenWRT andan bien en modo AP, y pueden rutear con OLSR. En el OpenWRT no anda al momento de escribir esto el modo cliente bridged 1 (es el que seguramente querés para poner un AP en la terraza de cliente de BAL), en DD-WRT sí.
En ambos se debería poder configurar el portal cautivo.
Para poder flashear el router hay que cambiarle el bootloader que trae. Eso se puede con el cable serie cuya construcción está documentada en ConsolaSerieDir-300 o se puede hacer por telnet.
Para hacerlo por telnet hay una ventana de 1 segundo de booteo del router en la que hay que mandar un Ctrl-C por telnet a una IP que toma el router temporariamente. Para esto está bueno dejar un ping corriendo atrás a esa ip, y cuando aparece conectarse rápido con el Putty, que manda el Ctrl-C solo.
Para poder hacer el update del bootloader y el flasheo de firmware via telnet o consola hay que tener un servidor de TFTP levantado (como atfptd2 para Linux o PumpKIN para Windows) con los siguientes archivos compartiéndose:
Si queremos OpenWRT: openwrt-atheros-vmlinux.lzma y openwrt-atheros-root.squashfs (se obtienen compilando con target atheros o se pueden bajar los de 8.09rc1 de acá).
Si queremos DD-WRT: linux.bin, se puede bajar de acá.
Las instrucciones de flasheo las saqué de acá para DD-WRT y de acá para OpenWRT.
La primer parte es para actualizar el bootloader, y es igual para todos los casos:
- Enchufa el puerto de WAN del router a tu PC
- Configurá en tu PC la IP 192.168.20.80 con máscara 255.255.255.0.
- Poné a correr un ping en tu PC a la IP 192.168.20.81.
- Prendé el router teniendo apretado el botón de reset por 30 segundos, a los 30 segundos soltalo.
- En algún momento de eso debería empezar a responderte ping el router con la IP 192.168.20.81.
- Hacé telnet a 192.168.20.81 puerto 9000
Debería aparecerte el prompt del redboot que trae el router. Vamos a ponerle una versión más nueva que nos permite flasher el router y bootear OpenWRT o DD-WRT.
Las cosas entre // y // (por ejemplo // Hola lector! //) son comentarios del tutorial. No te lo tiene que mostrar el router ni lo tenés que escribir.
// Esto trae del TFTP el archivo, tenelo prendido. Algunos servidores te piden confirmación por cada acceso a un archivo, en especial el PumpKIN para Windows. //
RedBoot> load ap61.ram
Using default protocol (TFTP)
Entry point: 0×800410bc, address range: 0×80041000-0×800680d8
RedBoot> goEso lo que hizo fue cambiarle el bootloader al router en memoria. O sea, te va a desconectar del router, pero no lo apagues ni nada porque vas a volver al bootloader viejo.
Ahora cambiá tu IP a 192.168.1.2 con máscara 255.255.255.0. Ahora la IP del router cuando está dando consola por telnet es 192.168.1.1, cambiá el ping que tenés corriendo atrás a esta ip.
Después hacé telnet a la 192.168.1.1 puerto 9000, que es donde está el router ahora que le cambiamos el bootloader. Debería aparecerte un prompt nuevo que en lugar de decir RedBoot dice DD-WRT> (eso es porque este bootloader está modificado por la gente de DD-WRT, si estás poniendo OpenWRT igual te sirve.
DD-WRT> fconfig -i
// Estas opciones deberían ua estar puestas y solo tenés que tocar enter o poner y //
Initialize non-volatile configuration - continue (y/n)? y
Run script at boot: false
Use BOOTP for network configuration: true
Default server IP address:
Console baud rate: 9600
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0×80ff0000-0×81000000 at 0xbffe0000: .
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 0×807f0000-0×80800000 at 0xbffe0000: .
DD-WRT> ip_address -h 192.168.1.2
Default server: 192.168.1.23
// Esto le va a volver a pegar al TFTP //
DD-WRT> load -r -b %{FREEMEMLO} ap61.rom
Using default protocol (TFTP)
Raw file loaded 0×80080000-0×800a8717, assumed entry at 0×80080000
DD-WRT> fis create -l 0×30000 -e 0xbfc00000 RedBoot
An image named ‘RedBoot’ exists - continue (y/n)? y
... Erase from 0xbfc00000-0xbfc30000: ...
... Program from 0×80080000-0×800a8718 at 0xbfc00000: ...
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0×807f0000-0×80800000 at 0xbffe0000: .
DD-WRT> resetEsto te vuelve a reiniciar el router. Debería tardar unos 30 segundos en volver online, cuando veas que responde ping (sigue en 192.168.1.1) volvé a entrar por telnet (192.168.1.1 puerto 9000).
Ahora vamos a preparar el router para bajar su nuevo firmware por TFTP.
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
DD-WRT> fis init
About to initialize [format] FLASH image system - continue (y/n)? y
*** Initialize FLASH Image System
... Erase from 0xbfc30000-0xbffe0000: ........................................................
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0×80ff0000-0×81000000 at 0xbffe0000: .Esta parte cambia depende de si querés OpenWRT o DD-WRT.
Para DD-WRT (tenés que tener el linux.bin que decíamos donde conseguir arriba en tu server de TFPT en tu IP 192.168.1.2) es así:
DD-WRT> load -r -b 0×80041000 linux.bin
Using default protocol (TFTP)
Raw file loaded 0×80041000-0×803cffff, assumed entry at 0×80041000
// ¡Este comando tarda un rato! no te asustes... //
DD-WRT> fis create linux
... Erase from 0xbfc30000-0xbffbf000: ................................................
... Program from 0×80041000-0×803d0000 at 0xbfc30000: .......................................
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0×80ff0000-0×81000000 at 0xbffe0000: .Para OpenWRT tenés que tener openwrt-atheros-vmlinux.lzma y openwrt-atheros-root.squashfs en el server de TFTP. Los comandos son:
DD-WRT> load -r -b %{FREEMEMLO} openwrt-atheros-vmlinux.lzma
Using default protocol (TFTP)
Raw file loaded 0x80040800-0x801007ff, assumed entry at 0x80040800
// Por si tu font es muy chota, abajo dice vmlinux.bin.ELE7, es una ELE, no un UNO. //
DD-WRT> fis create -e 0x80041000 -r 0x80041000 vmlinux.bin.l7
... Erase from 0xbfc30000-0xbfcf0000: ............
... Program from 0x80040800-0x80100800 at 0xbfc30000: ............
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x80ff0000-0x81000000 at 0xbffe0000: .
DD-WRT> load -r -b %{FREEMEMLO} openwrt-atheros-root.squashfs
Using default protocol (TFTP)
Raw file loaded 0x80040800-0x802207ff, assumed entry at 0x80040800
DD-WRT> fis create rootfs
... Erase from 0xbfcf0000-0xbffe0000: ...............................................
... Program from 0x80040800-0x80220800 at 0xbfcf0000: ..............................
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0x80ff0000-0x81000000 at 0xbffe0000: .Después de eso tenemos que configurar el router para bootear nuestro kernel nuevo. En el caso de DD-WRT está en la partición que le pusimos linux, en el caso de OpenWRT está en la que se llama vmlinux.bin.l7. Donde dice PARTICION_NO_HAGAS_COPY_PASTE_Y_CAMBIAME tenés que poner linux en caso de DD-WRT y vmlinux.bin.l7 en caso de OpenWRT.
Donde dice PARTICION_NO_HAGAS_COPY_PASTE_Y_CAMBIAME tenés que poner linux en caso de DD-WRT y vmlinux.bin.l7 en caso de OpenWRT
// Estas tres opciones que le ponemos a la configuración con una linea cada una son porque después sino cuando ejecutamos fconfig no es fácil mandarle por telnet el caracter de backspace que borra las opciones que ya están por defecto. Con Putty no pude. //
DD-WRT> fconfig boot_script true
boot_script: Setting to true
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0×80ff0000-0×81000000 at 0xbffe0000: .
// Esto es cuantos segundos querés tener al router esperando con el telnet en el 9000 para el bootloader, 3 segundo está bien, si le ponés mucho tarda más en bootear, y menos es difícil de agarrar. //
DD-WRT> fconfig boot_script_timeout 3
boot_script_timeout: Setting to 3
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0×80ff0000-0×81000000 at 0xbffe0000: .
DD-WRT> fconfig bootp false
bootp: Setting to false
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0×80ff0000-0×81000000 at 0xbffe0000: .
DD-WRT> fconfig
Run script at boot: true
// Si ya tenías otro script de booteo (por ejemplo si pusiste OpenWRT y estás cambiando DD-WRT, te lo va a mostrar acá //
Enter script, terminate with empty line
// Donde dice PARTICION_NO_HAGAS_COPY_PASTE_Y_CAMBIAME va linux para DD-WRT y vmlinux.bin.l7 para OpenWRT. //
>> fis load -l PARTICION_NO_HAGAS_COPY_PASTE_Y_CAMBIAME
>> exec
>> // aca va un enter //
Boot script timeout (1000ms resolution): 3
Use BOOTP for network configuration: false
Gateway IP address:
Local IP address: 192.168.1.1
Local IP address mask: 255.255.255.0
Default server IP address:
Console baud rate: 9600
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xbffe0000-0xbfff0000: .
... Program from 0×80ff0000-0×81000000 at 0xbffe0000: .
DD-WRT> resetCharán. Terminaste. El DD-WRT lo podés acceder en 192.168.1.1 con user root y password admin por web o ssh. El OpenWRT está con user root y sin password. O con user root y password root por ssh.
Para cambiar entre firmwares o reflashear tenés que repetir la parte específica de ese firmware por telnet al 9000. Si estás poniendo el mismo después de eso hacés reset y listo. Si estás poniendo otro tenés que cambiar tambien el script de booteo (el de PARTICION_...) ejecutando fconfig y ahí hacer reset.
El modo "cliente bridged" clásico a-lá Nanostation involucra un parche al kernel para poder usando ebtables reescribir MACs, dd-wrt lo aplica pero OpenWRT no. Ver por ejemplo http://forum.openwrt.org/viewtopic.php?id=17957 o ver también acá, acá y acá para más información. (1)
Si lo instalamos con apt-get, símplemente descargamos los archivos en /srv/tftp y ya queda listo. (2)