19-04-2012
https://dev.openwrt.org/ticket/10492
En esta receta es para compilar OpenWRT para un TP-Link WR740n (Versión 4 pero sirve para las otras versiones de este modelo).
OpenWRT es una versión del sistema GNU/Linux especializada en dispositivos de red. Comunmente se ha usado en routers-wifi de bajo coste.
En la receta se incluye una versión del firmware ya compilada pero se ponen las intrucciones por si alguien quiere hacerse una versión con otros paquetes. Si se añaden otros paquetes hay que seleccionarlo bien porque a poco que pongamos nos saldrá una imagen que no cabrá en la memoria flash (4Megabytes en este modelo) que es donde se guarda el sistema operativo.
En la versión que dejamos compilada hemos incluido el cliente vpnc que es el que actualmente se usa para conectar con la red de la Universidad Jaume I (UJI). La idea es que con un router de este tipo (muy económico, alrededor de 20€) el túnel se abre desde el TP-Link y luego lo que conectemos con él ya tiene acceso directo a la red de la UJI y salida a internet pasando por la UJI (para la comunidad universitaria); por ejemplo las tablillas con Android no tienen un cliente VPN que funcione con el servidor de túneles de la UJI. En la receta se propone una configuración del router para hacer esto una vez ya se ha instalado OpenWRT.
Hemos añadido en el inicio de esta receta una guía rápida para pasar de un TP-Link WR740n con el software original a tenerlo con openwrt y configuración vpn uji en 5 pasos.
Guía rápida de configuración. Si necesitas más información sobre cada paso la encontrarás más adelante en la receta.
Firmware para el tp-link TL-WR841N V8.*. (Hay que hacer unzip)
Configuración completa para el WR841 V8.*
Firmware para el tp-link TL-WR841N V9.*. (Hay que hacer unzip; está por comprobar)
: Deprecated
mkdir OPENWRT-TPLINK cd OPENWRT-TPLINK svn co svn://svn.openwrt.org/openwrt/trunk/
cd trunk ./scripts/feeds update -a ./scripts/feeds install -a
Luego seleccionamos los paquetes:
make menuconfig Target System Atheros AR7xxx/AR9xxx Target Profile TP-LINK TL-WR740N/ND Luci ---> Collections ---> luci-ssl Network ---> VPN ---> vpnc
Luego lanzamos la compilación, que le cuesta un buen rato.
make V=99
Luego, el firmware es …/OPENWRT-TPLINK/trunk/bin/ar71xxx/openwrt-ar71xx-generic-tl-wr740n-v4-squashfs-factory.bin
Nuestra versión del TP-Link WR740n la podemos ver en la pegatina que hay bajo del router.
Versión ya compilada para descargar:
Firmware ya compilado (hay que hacer gunzip). (ATTITUDE ADJUSTMENT (Bleeding Edge, r31342))
Para cargarlo se puede hacer desde el sistema de TP-Link —> System —> upgrade
El TP-Link de fábrica viene con la 192.168.0.1 en el switch y la cuenta admin con password admin.
Se carga el firmware y se reinicia el router.
Ahora la IP es 192.168.1.1/24. Hay que entrar por telnet con el login root sin password. Se pone el password de root (orden passwd root) y salimos con exit. Entonces se desactiva el telnet y se activa ssh.
Luci debe funcionar en https://192.168.1.1 (Luci es el entorno gráfico de OpenWRT).
Ponerse en le ordenador La ip 192.168.0.10/24 (bueno, una IP que permita conectar con el TP-Link a través de una de las bocas amarillas del switch ethernet).
Hacer:
atftp -p -l openwrt-ar71xx-generic-tl-wr740n-v4-squashfs-factory.bin --verbose --trace 192.168.0.1
o con tftp:
tftp 192.168.0.1 tftp> bin tftp> tra tftp> put openwrt-ar71xx-generic-tl-wr740n-v4-squashfs-factory.bin
La configuración para que funcione abriendo un túnel con la UJI.
En /etc/vpnc/default.conf:
IPSec gateway vpn-server.uji.es IPSec ID UJI IPSec secret 12345678 #IKE Authmode hybrid Xauth username AQUI_TU_USUARIO Xauth password AQUI_TU_CONTRASEÑA
Ya podemos probar el túnel ejecutando vpnc en el terminal (vpnc-disconnect para parar el túnel). Para poder probar el túnel debemos estar conectados a guifi.net o a la freenet o debemos poder hacer ping a una de las IPs del vpn-server.uji.es .
Ahora que ya funciona el túnel debemos hacer que lo inicie en el arranque y que periódicamente pruebe si está funcionando por si hay que volverlo a levantar.
# Put your custom commands here that should be executed once # the system init finished. By default this file does nothing. cat > /etc/vpnc/default.conf <<EOF IPSec gateway vpn-server.uji.es IPSec ID UJI IPSec secret 12345678 Xauth username AQUI_TU_USUARIO Xauth password AQUI_TU_CONTRASEÑA EOF exit 0
Para los pasos siguientes nos hemos basado en: https://forum.openwrt.org/viewtopic.php?id=31853 y http://wiki.openwrt.org/oldwiki/vpn.client.vpnc
Crear el fichero /etc/init.d/vpnc :
#!/bin/sh /etc/rc.common START=75 STOP=10 start() { mkdir -p -m777 /var/run/vpnc vpnc --non-inter /etc/vpnc/default.conf } stop() { PID_F=/var/run/vpnc/pid if [ -f $PID_F ]; then PID=$(cat $PID_F) kill $PID while [ -d /proc/$PID ]; do sleep 1 done fi }
Por si el túnel se cuelga, conviene tener un script que prueba ping a dos IPs a las que debería llegar cuando el túnel funciona. /usr/local/vpn-keepalive :
#!/bin/sh # #no hacer nada si el vpn está deshabilitado, para evitar bloqueo de password por reintentos [ ! -f /etc/rc.d/S75vpnc ] && exit 0 # Restart VPNC if both of the specified hosts on the command line are unavailable if ! [ $(ping -q -c 1 ${1} 2>&1 | grep "1 packets received" | sed "s/.*\(1\) packets received.*/\1/") ] || ! [ $(ping -q -c 1 ${2} 2>&1 | grep "1 packets received" | sed "s/.*\(1\) packets received.*/\1/") ]; then echo Not alive $1 or $2, restarting VPNC /etc/init.d/vpnc stop /etc/init.d/network restart sleep 5 /etc/init.d/vpnc start else echo Alive $1 or $2 fi
Una alternativa que realiza hasta 3 pings (o n) a las IPs dadas y comprueba si se han perdido todos:
#!/bin/sh # #no hacer nada si el vpn est.. deshabilitado, para evitar bloqueo de password por reinten [ ! -f /etc/rc.d/S75vpnc ] && exit 0 # Restart VPNC if both of the specified hosts on the command line are unavailable if [ $(ping -q -c 3 ${1} 2>&1 | grep "100% packet loss" | sed "s/.*\(100%\) packet loss.* [ $(ping -q -c 3 ${2} 2>&1 | grep "100% packet loss" | sed "s/.*\(100%\) packet loss.* echo Not alive $1 or $2, restarting VPNC /etc/init.d/vpnc stop # /etc/init.d/network restart sleep 5 /etc/init.d/vpnc start else echo Alive $1 or $2 fi
El código anterior se pone crontab para ejecutarse cada 2 minutos. Si falla un ping se volverá a ejecutar el vpnc para abrir el túnel. Deben ponerse dos IPs a las que se llega sólo si el túnel está abierto. Por ejemplo 8.8.8.8. Para ponerlo en crontab la siguiente orden abre el editor para incluirlo en crontab (los asteriscos son minutos horas días semanas meses): crontab -e
*/2 * * * * /usr/local/vpn-keepalive 192.168.0.1 192.168.0.10 &
Otra versión de vpn-keepalive, en la que se comprueba si existe la interfaz del túnel (tun0) en vez de usar ping:
#!/bin/sh # # Restart VPNC if both of the specified hosts on the command line are unavailab # Do nothing if vpn is not set. [ ! -f /etc/rc.d/S75vpnc ] && exit 0 # vpn deshabilitado # Do nothing if vpn-keepalive is already running. [ -f /var/run/vpn-keepalive ] && exit 0 # vpn-keepalive ejecutandose # We are running vpn-keepalive. touch /var/run/vpn-keepalive #if ! [ $(ping -q -c 1 ${1} 2>&1 | grep "1 packets received" | sed "s/.*\(1\) p # ! [ $(ping -q -c 1 ${2} 2>&1 | grep "1 packets received" | sed "s/.*\(1\) p # echo Not alive $1 or $2, restarting VPNC if ! [ $(route -n | grep "tun0" | awk '/tun0/ {++x} END {print x}') ]; then echo Tunnel not alive, restarting VPNC /etc/init.d/vpnc stop /etc/init.d/network restart sleep 5 /etc/init.d/vpnc start else echo vpn seems alive fi # vpn-keepalive is not running anymore. rm /var/run/vpn-keepalive
crond -c /etc/crontabs -l ${loglevel:-5}
por
crond -c /etc/crontabs -l -L /dev/null
No lo he probado.
Puedes cargar esta configuración para saltarte algunos de los siguientes pasos.
La carga de la configuración se realiza desde System→ Backup / Flash Firmware → Restore Backup.
Esta configuración deja preparado:
Así que sólo queda:
Aquí está la En esta versión parece que se resuelve la configuración de la wifi, la nueva versión error wifi corregido. Faltan detalles por pulir, pero es funcional. Incluye los cambios siguientes:
Ya por último faltan los detalles de configuración del router. Lo normal sería:
Si cambiamos la contraseña de la UJI y el router están intentando entrar con nuestra contraseña desfasada se nos bloqueará la cuenta y tendremos que molestar con un CAU para que nos la desbloqueen.
Si perdemos el acceso al router (olvidamos el password, ponemos mal alguna regla del firewall, etc), se puede volver a dejar el openwrt en su estado inicial, para ello hay que seguir estos pasos (de http://www.gargoyle-router.com/phpbb/viewtopic.php?f=8&t=2175):
telnet
a la dirección 192.168.1.1 - Se accederá a un shell de root del router sin necesidad de autenticarse firstboot
toda la configuración volverá a su estado inicial (de fábrica).
Si lo que se quiere es actualizar el firmware, hay que ejecutar los pasos anteriores, salvo el último (firstboot
) y una vez dentro del router transferir el firmware al router y actualizarlo.
Utilizando Netcat si se dispone de suficiente memoria RAM en el router se puede transferir y actualizar a la vez.
En las instrucciones de openwrt dice textualmente This method is NOT recommended! aunque lo hemos probado repetidas veces en los TP-Link WDR3600.
En el ordenador ejecutar
nc -q0 192.168.1.1 1234 < openwrt-ar71xx-tl-wr1043nd-v1-squashfs-sysupgrade.bin
En el router
nc -l -p 1234 | mtd write - firmware
Si no se dispone de suficiente memoria RAM, el siguiente método es más seguro. Primero se transfiere el firmware.
En el ordenador ejecutar
cat [specified firmware].bin | pv -b | nc -l 3333
En el router
nc 192.168.1.111 3333 > /tmp/[specified firmware].bin
Donde 3333 es el puerto que se ha elegido (puede ser cualquier otro) y 192.168.1.111 es la IP que se le ha puesto al PC. [specified firmware].bin
es el nombre del fichero que contiene el firmware que se quiere transferiri. La orden 'pv -b' es opcional y sirve para visualizar el avance del proceso.
Ahora se puede actualizar el firmware con sysupgrade
o mtd
:
sysupgrade -v /tmp/[specified firmware].bin
o
mtd -r write /tmp/[specified firmware].bin firmware
También se puede transferir el firmware wget
, en el ordenador hay que poner el firmware en el directorio de apache (o del servidor web que se esté utilizando) y en el router ejecutar
wget http://192.168.1.111/[specified firmware].bin
En el wiki de openwrt está explicado el modo failsafe: http://wiki.openwrt.org/doc/howto/generic.failsafe y como actualizar el firmware http://wiki.openwrt.org/doc/howto/generic.sysupgrade