OpenWrt en mi router Linksys

Me animé a instalarlo. Ahora mi router Linksys WRT54GL v1.1 (los que comienzan su número de serie con CL7B) corre una distribución GNU/Linux, OpenWrt. Cuando comencé a averiguar sobre la posibilidad de cambiar mi firmware por un GNU/Linux, me topé con varias cositas que hacían abstenerme. Por ejemplo, en la página oficial animaban a actualizarlo vía web, diciendo que era lo más fácil… pero en otros lugares, como en Linux.com, recomendaban utilizar este método fácil sólo para los impacientes y valientes
Aunque en el ejemplo no utilizaban exactamente este modelo, y el artículo es un poco viejo.
Luego me topé con esta otra página. El tipo simplemente decía que si tenés un WRT54GL y querés instalarle OpenWrt Kamikaze (la última versión liberada), lo hagas por la interfáz web y listo. Nada de tftp, ni boot_wait. Así que me animé. Me bajé esta imagen (notar que tiene la versión 2.4 del kernel, ya que la 2.6 tiene problemas con wireless), chequeé que el md5 sea correcto, fui a la página para actualizar el firmware, elegí el archivo, y Upgrade…
Mientras la barra de progreso aumentaba, yo rogaba que no se corte la luz o algo así. Fue lindo ver el mensaje “Successfully upgraded” al final. Sin embargo eso no me dejó del todo tranquilo. Intenté ingresar via web, pero no funcionó… luego recordé que esta imagen oficial no trae webif. Como decían las instrucciones, me conecté via telnet a la dirección del router. Anduvo perfectamente. Así que cambié el password del root y automáticamente se activó ssh y se desactivó telnet.
Tuve que desenchufar y volver a conectar la energía en el modem, ya que aparentemente cambió la MAC del router, y no se conectaba a Internet. Después de eso todo anduvo perfectamente.
El paso siguiente fue activar, inmediatamente, boot_wait. Es una opción del router, que activa algo así como un boot loader. Tarda un poco más en bootear, pero nos habilita a cambiar fácilmente (en teoría) el firmware via TFTP.
OpenWrt tiene un manejador de paquetes tipo APT: ipkg. Con “ipkg install algo” instalan los programas, igual que en cualquier distro basada en Debian. De esta forma instalé webif, ya que la imagen que me bajé (la oficial) no lo traía por defecto. Si quieren una imagen que sí lo traiga, pueden pegarle un vistazo a esta web. Son las imágenes del proyecto X-Wrt.
Si bien todavía no está estable para Kamikaze, webif está muy bueno. Pueden ver algunos screenshots acá. Desde aquí se pueden acceder a gráficas, estado, manejo de paquetes, reglas iptables, logs, cron, opciones generales del sistema, de la red, edición de archivos, etc… muy completo. También es posible tenerlo en varios lenguajes, simplemente instalando los paquetes correspondientes.
Sin embargo, aunque todavía no lo he explorado mucho, el firmware oficial de Linksys parecía brindar más facillidad para realizar algunas tareas como, por ejemplo, filtrado por MAC. En OpenWrt también se puede, obviamente, pero me refiero a webif: no parece facilitar las cosas para realizar ese tipo de filtrado.
Configuración
Esta buena la idea de bridging. Pero complicó, por lo visto, algunas cosas. Digo “por lo visto” porque no tengo muchos conocimientos de configuración de redes. Cuando quería filtrar tráfico de la interfaz wl0 (wireless) no funcionaba. Después de una serie de pruebas concluí que el bridge complicaba las cosas, por lo tanto lo quité, y simplemente ruteo los paquetes entre la red cableada a la inalámbrica. Ahora las reglas iptables funcionan.
Mis archivos de configuración cambiados son:
/etc/config/network:
config switch eth0
option vlan0 "0 1 2 3 5*"
option vlan1 "4 5"
#### Loopback configuration
config interface loopback
option ifname "lo"
option proto static
option ipaddr 127.0.0.1
option netmask 255.0.0.0
#### LAN configuration
config interface lan
#option type bridge
option ifname "eth0.0"
option proto static
option ipaddr 192.168.1.1
option netmask 255.255.255.0
#### WiFi configuration
config interface wifi
option ifname wl0
option proto static
option ipaddr 192.168.2.1
option netmask 255.255.255.0
#### WAN configuration
config interface wan
option ifname "eth0.1"
option proto dhcp
/etc/config/wireless:
option type broadcom
option channel 5
option distance 10
option disabled 0
config wifi-iface
option device wl0
option network wifi
option mode ap
option ssid wasabi-depto
option encryption psk2
option key laClave
option hidden 0
option isolate 0
option bgscan 0
/etc/config/dhcp:
option interface wifi
option start 100
option limit 150
option leasetime 12h
config dhcp
option interface lan
option start 100
option limit 150
option leasetime 12h
config dhcp
option interface wan
option ignore 1
Entre otras cosas, para permitir forward entre la red wireless e Internet y la red cableada, agregamos al archivo /etc/firewall.user esto:
# Entre clientes de la red wireless
iptables -A FORWARD -i wl0 -o wl0 -j ACCEPT
# Acceso a Internet desde la red wireless
iptables -A FORWARD -i wl0 -o eth0.1 -j ACCEPT
# Acceso a los hosts de la red cableada y viceversa
iptables -A FORWARD -i wl0 -o eth0.0 -j ACCEPT
iptables -A FORWARD -i eth0.0 -o wl0 -j ACCEPT
Una cosita que no encontré (en las opciones de webif) es el bloqueo de la interfaz web a todo lo que venga desde la conexión wireless, como sí está en el firmware oficial. Eso no es un problema, ya que al contar con iptables, simplemente bloqueo el acceso a webif y también a SSH:
iptables -A input_rule -p tcp -i wl0 –dport 80 -j DROP
En el firmware oficial, esta protección está en nivel de aplicación, no a niver kernel como aquí.
Otras cositas que hice fue quitar los paquetes relacionados con ppp, ya que no los necesito. A esto se lo puede hacer desde la interfaz web, es muy sencillo:

En la misma sección se listan todos los paquetes disponibles que se pueden instalar. También es posible agregar nuevos repositorios o instalar un paquete remotamente.
Algunos problemas y sus soluciones
Para poder acceder a las opciones del router a través de webif o SSH desde la facultad u otro lugar con acceso a Internet, utilizaba updatedd. En la sección “DynDNS” de webif se prepara todo automáticamente al indicar qué servicio queremos utilizar. Yo utilizo FreeDNS, y no está disponible para este servicio. No me había preocupado mucho por esto, así que simplemente saqué una cuenta en DynDNS y listo.
Tengo que aclarar que esto no funcionó muy bien. Las opciones que setea automáticamente webif no son las correctas. Sin embargo, una vez corregido el problema, aparentemente updatedd no se fija, antes de actualizar, si la IP realmente cambió. De esta forma realiza actualizaciones innecesarias, y así la gente de DynDNS terminó por bloquear mi cuenta temporalmente. Dudo que al cambiar la IP realice la actualización, simplemente parece ejecutarse al inicio y no queda ningún proceso en background…
La solución fue directamente quitar updatedd y utilizar un simplemente script desde cron:
#FreeDNS updater script
UPDATEURL="http://freedns.afraid.org/dynamic/update.php?TjdnR25nZTBWNXhlTEN0OXJrMks6MjM1Mzc2MA=="
DOMAIN="router.miltonpividori.com.ar"
registered=$(nslookup $DOMAIN|tail -n2|grep A|sed ’s/Address: //g’|cut -f1 -d ‘ ‘)
current=$(ifconfig eth0.1 | sed -e ‘/inet/!d’ -e ’s/.*addr://’ -e ’s/[ ].*//’)
[ "$current" != "$registered" ] && {
wget -q -O /dev/null $UPDATEURL
logger "IP actualizada en freedns.afraid.org"
}
Otras cosas interesantes
Otras de las cositas que me interesaron es un cliente NTP. De esta forma al iniciar el router la hora es sincronizada. No funciona si se utiliza simplemente el comando date para setearla: se borrará al reiniciar el router. Me pareció interesante este servicio, así en los logs, por ejemplo, queda registrada la hora correcta de los accesos, fallas, y demás cositas.
Finalmente, aclaro que hay bastante documentación al respecto. Por ahí no es tan exacta, y cuesta encontrarla, sobre todo porque Kamikaze es un versión bastante nueva, y a veces al leer algunas instrucciones se ve que todavía no fueron actualizadas para esta versión.

October 16th, 2007 at 7:04 pm
jaja te animaste nomás! Así me gusta!
Muy buen post, me lo tenés que mostrar en acción. Quizá compre uno para casa y el SAGEM me lo lleve al consultorio de mi viejo. Ya tengo a quién consultar.
Un abrazo
PD: Kamikaze? buen nombre
October 17th, 2007 at 5:49 pm
Muy buen post Milton. A ver si con toda esta información algún día me animo yo también.
October 18th, 2007 at 11:54 am
Felicitaciones Milton! te animaste a hacer lo que vengo demorando
Aunque el nombre de “Kamikaze” no me tranquiliza mucho….
May 25th, 2008 at 4:22 am
Sin duda con el Linksys empezo el OpenWrt, pero hay otros routers que lo pueden llevar, por ejemplo el ASUS WL-500g y versiones posteriores, los cuales tienen puertos usb (1 o 2 depende de la version) a los cuales puedes enchufar discos duros, pendrive, etc, lo cual te da mas posibilidades de juego.
El Script desde cron es interesante, andaba buscando como meterle dyndns, pero creo que ese script me va a resultar para lo que yo quiero, aunque tendre que aprender a usar Cron…
Gracias por el articulo.
June 23rd, 2008 at 7:12 am
[...] Mas info aquí, aquí, aquí, aquí, aquí, aquí, aquí y aquí. [...]
July 10th, 2008 at 9:51 pm
hola.
Sabes si es posible con openwrt determinar cuanto ancho e banda su upload y download le puedo asignar a las pcs que se conecten via el wrt54gl?
En posible volver al firmware original una vez instalado openwrt?
Muchas Gracias.
July 11th, 2008 at 2:23 pm
Qué tal Seba? Si que se puede hacer lo que querés, aunque personalmente nunca lo probé. Lo que estas buscando se llama QoS (Quality Of Service). Si no conoces mucho sobre el tema podés leer algo en Wikipedia por ejemplo.
En éste link y en éste otro hay info para configurar esto en OpenWRT (ahora no tengo acceso a mi router, pero recuerdo que en la interfaz web había una sección llamada QoS, por lo que me imagino que no será difícil configurarlo).