OpenWrt en mi router Linksys

openwrt-logo.png

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:

#### VLAN configuration
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:

config wifi-device  wl0
        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:

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:

### WLAN Forwarding
# 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 22 -j DROP
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:

installed_packages.png

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:

#!/bin/sh
#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.