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:
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.