Aprendiendo OpenWrt con La Fonera
Lo que vamos a hacer
Vamos a instalar OpenWrt Kamikaze a una fonera modelo 2100 y a agregarle una tarjeta SD para aumentar su espacio de almacenamiento. Por último vamos a instalar nagios en la fonera, moviendo parte de la aplicación a la tarjeta SD. Prepara un cable para conexión directa al PC, un soldador, estaño, cables y un lector SD que no utilices. |
De donde salió
Hace unos meses Javier Turégano se fue de Ándago a Australia y empezó a repartir sus bienes entre los compañeros.
A mi me tocó una fonera, modelo 2100.
Instalar OpenWrt
En el wiki de OpenWrt vienen las instrucciones para su instalación que detallaré más abajo.
Lo que voy a decir a continuación es verdad a medias pero es muy didáctico:
- Si nunca has usado este tipo de máquinas pero si has trasteado con Android, debes saber que el Android System Recovery para nuestros propósitos viene a hacer lo mismo que RedBoot. Desde el RedBoot podrás escribir en la memoria del cacharrito, pero también hacer más cosas como cargar imágenes por tftp.
- Si nunca has trasteado con Android, el RedBoot viene a ocupar la parte del grub. Es lo que se arranca al principio y permite ejecutar comandos antes de arrancar el sistema operativo de verdad.
Paso 1: Obtener acceso por ssh a la fonera
Se podría conectar a la fonera con un conversor TTL a USB y ya tendríamos acceso, pero entrar usando una vulnerabilidad es más divertido. ;-) |
La foneras vienen con OpenWRT instalado pero con todos los puertos cerrados por iptables. Se trata de abrir el puerto 22 y arrancar dropbear que es un servidor de ssh.
En esta página, cuya lectura completa recomiendo encarecidamente, vienen varias formas de hacer esto. En mi caso la versión del firmware era la 0.7.1-1 así que ejecutando el comando fondue.pl me conecté por ssh a la fonera.
Paso 2: Conseguir acceso por ssh permanente
En esta otra página vienen los pasos para conseguir el acceso ssh de forma permanente.
Para ellos activamos dropbear de forma permanente en el arranque:
mv /etc/init.d/dropbear /etc/init.d/S50dropbear
abrir el puerto 22 en el firewall agregando estas dos líneas en /etc/firewall.user:
iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 22 iptables -A input_rule -i $WAN -p tcp --dport 22
evitar que se ejecute código desde los servidores de fon comentando una línea en /bin/thinclient
# . /tmp/.thinclient.sh
Paso 3: Cambiar la configuración de RedBoot para activar el acceso por telnet
Copio liberalmente los pasos de la guía.
Reemplazar el kernel para desactivar la protección de escritura:
root@OpenWrt:~# cd /tmp root@OpenWrt:~# wget http://ipkg.k1k2.de/hack/openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma root@OpenWrt:~# Connecting to ipkg.k1k2.de[85.10.200.90]:80 openwrt-ar531x-2.4-v 100% |**************************| 512 KB 00:00 ETA root@OpenWrt:~# mtd -e vmlinux.bin.l7 write openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma vmlinux.bin.l7 Unlocking vmlinux.bin.l7 ... Erasing vmlinux.bin.l7 ... Writing from openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma to vmlinux.bin.l7 ... [w] root@OpenWrt:~# reboot
Sobreescribir la configuración de redboot:
root@OpenWrt:~# cd /tmp root@OpenWrt:~# wget http://ipkg.k1k2.de/hack/out.hex root@OpenWrt:~# Connecting to ipkg.k1k2.de[85.10.200.90]:80 out.hex 100% |*******************************| 4096 00:00 ETA root@OpenWrt:~# mtd -e "RedBoot config" write out.hex "RedBoot config" Unlocking RedBoot config ... Erasing RedBoot config ... Writing from out.hex to RedBoot config ... [w] root@OpenWrt:~# reboot
Esta configuración configura la IP 192.168.1.254 en la fonera y abre un servicio de telnet en el puerto 9000 durante 10 segundos.
Con un ifconfig eth0:0 192.168.1.222 netmask 255.255.255.0 estarás en la misma red que el RedBoot de tu fonera.
A partir de ahora utiliza el putty para conectarte por telnet a la fonera, ya que el cliente de consola puede darte problemas en algunas ocasiones.
Y esta era la parte peligrosa. Si consigues conectarte por telnet al puerto 9000 el resto ya no tiene porque enladrillar la fonera. ¿A lo mejor te lo tenía que haber dicho antes? ;-)
Instalar OpenWrt
Instala un servidor de tftp
Necesitamos instalar un servidor de tftp en el que dejar los archivos que luego cargará la fonera.
Para ello puedes instalar el paquete tftpd-hpa y todo lo que dejes en /var/lib/tftpboot podrá verlo la fonera.
Descarga del sistema operativo
Descarga el kernel y el sistema de archivos desde:
- http://downloads.openwrt.org/kamikaze/8.09.2/atheros/openwrt-atheros-vmlinux.lzma
- http://downloads.openwrt.org/kamikaze/8.09.2/atheros/openwrt-atheros-root.squashfs
Deja ambos archivos en /var/lib/tftpboot.
Configura en RedBoot la IP del servidor de tftp y la suya propia
Tenemos que decirle donde está el servidor de tftp y en caso de que esté en otra red, configurársela.
RedBoot> ip_address -h-l /24 IP: [...], Gateway: 0.0.0.0 Default server: [...]
Por ejemplo, si has instalado el servidor de tftp en tu PC con la ip 192.168.1.222 el comando siguiente debería servirte:
RedBoot> ip_address -h 192.168.1.222 -l 192.168.1.254/24
Descarga e instala las imágenes
Cargamos el kernel:
RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-vmlinux.lzma Using default protocol (TFTP) Raw file loaded [...], assumed entry at [...]
Inicializamos la tabla de particiones (FIS):
RedBoot> fis init
Ahora volcamos la imagen del kernel. Ten en cuenta que en el par de minutos que tarda parecerá que la fonera se ha frito. Pero no te preocupes que, como dije antes, la parte peligrosa ya pasó:
RedBoot> fis create -e 0x80041000 -r 0x80041000 vmlinux.bin.l7 ... Erase from 0xa8730000-0xa87e0000: ........... ... Program from 0x80041000-0x800f1000 at 0xa8730000: ........... ... Erase from 0xa87e0000-0xa87f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Ahora volcamos el sistema de archivos:
RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-root.squashfs Using default protocol (TFTP) Raw file loaded 0x80041000-0x80200fff, assumed entry at 0x80041000 RedBoot> fis create rootfs ... Erase from 0xa8030000-0xa8730000: ................................................................................................................ ... Program from 0x80041000-0x80741000 at 0xa8030000: .............................................................................................................. ... Erase from 0xa87e0000-0xa87f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Comprobamos con un fconfig -l -nque en el script de arranque se hace referencia al kernel que hemos instalado y sino lo cambiamos:
RedBoot> fconfig boot_script_data boot_script_data: .. fis load -l vmlinux.bin.1 .. exec Enter script, terminate with empty line >> fis load -l vmlinux.bin.l7 >> exec >> Update RedBoot non-volatile configuration - continue (y/n)? y ... Erase from 0xa87e0000-0xa87f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: . RedBoot>
Reiniciar el router.
RedBoot> reset
Recuerda que todavía no estás en OpenWrt donde el comando si sería reboot.
Configuración inicial de OpenWrt
Cambia la contraseña
Te conectas por telnet al router (puerto 23, no 9000). La contraseña es admin.
Dentro ejecutas passwd y le cambias la contraseña a root. Reinicia y podrás conectarte por ssh a la fonera.
Configuración de la red
OpenWrt arranca un interfaz web muy chulo para su configuración a golpe de click.
Para familiarizarte con ella ponle una IP de tu red y reinicia usando la interfaz web.
Un primer contacto con OpenWrt
Capacidades
El problema de estas máquinas es que tienen una capacidad extremadamente limitada. No puedes ponerte a instalar paquetes sin parar porque solo tienes 5MB de sitio en disco. Si, 5.4MB, no me he equivocado al escribirlo.
root@pandora:/etc/config# df -h Filesystem Size Used Available Use% Mounted on rootfs 1.5M 1.5M 0 100% / /dev/root 1.5M 1.5M 0 100% /rom tmpfs 6.7M 40.0k 6.6M 1% /tmp tmpfs 512.0k 0 512.0k 0% /dev /dev/mtdblock3 5.4M 5.1M 308.0k 94% /jffs mini_fo:/jffs 1.5M 1.5M 0 100% / root@pandora:/etc/config#
Y la memoria, 16MB ¡más memoria que disco de datos!
root@pandora:/etc/config# free total used free shared buffers Mem: 13672 11960 1712 0 1088 Swap: 0 0 0 Total: 13672 11960 1712 root@pandora:/etc/config#
Ten esto siempre en mente antes de instalar cualquier cosa.
Instalación y configuración del sistema
Siempre que arranques la fonera la lista de paquetes disponibles habrá desaparecido. Utiliza opkg update para bajártela cada vez que arranques. Sino te ocurrirá esto:
root@OpenWrt:~# opkg install luci-app-mmc_over_gpio An error ocurred, return value: 716563936. root@OpenWrt:~#
Si, como yo, eres un adicto al Ctrl-r, puedes instalarte la bash con un opkg install bash y luego, en el home de root crear un archivo .profile con el contenido /bin/bash.
root@OpenWrt:~# opkg install bash Installing bash (3.2-2) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/bash_3.2-2_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) bash_3.2-2_mips.ipk 100% |*********************************************************************************************| 297k 00:00:00 ETA Installing libncurses (5.6-1) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/libncurses_5.6-1_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) libncurses_5.6-1_mip 100% |*********************************************************************************************| 135k --:--:-- ETA Configuring bash Configuring libncurses root@OpenWrt:~#
¡Ya tenemos history!
Prueba a configurar el hostname en /etc/config/system a ver que pasa.
Como ves, es otro linux.
Alimentación por USB
Como no me apetecía tener que llevar el transformador de un lado para el otro corté un cable usb por la mitad, le soldé un terminal con el positivo (rojo) en el centro y el negativo (negro) en el cuerpo.
Y ya tenemos fonera portable.
Si quisiéramos alimentación PoE, hubiera bastado con usar dos de los cables que no usa la fonera, por ejemplo los marrones, y conectarlos a las patas de alimentación.
Instalación del lector de tarjetas SD
Para quitarnos el problema del almacenamiento vamos poner una tarjeta SD en la máquina, la formateamos como ext3, la montamos en /mnt/sdcard y luego movemos las cosas que nos interesan a la tarjeta para dejar espacio libre y hacemos enlaces blandos.
Hay una guía bastante buena en la que se explica como hacer las conexiones pero se deja cosas sueltas así que la he intentado aclarar un poco
Extracción y localización del lector de tarjetas
Utilizamos un lector de tarjetas roto:
Normalmente la gente usa el soldador pero yo lo intento usar lo menos posible por eso de que al plástico no le gusta el calor y tal.
Aprovechando que las soldaduras son superficiales y que el estaño es blando, se corta con una navaja el estaño del lector:
Tras ponerlo en la parte de atrás, vemos que los cables coinciden exactamente con los agujeros ¿que mejor sitio que este para ponerlo?
Cables a utilizar
Recomiendo siempre utilizar cables de red rígidos para estas cosas. El estaño se agarra bien y son flexibles pero rígidos cuando nos interesa.
Eliminar condensadores
Elimina estos condensadores con el soldador. No se porqué hay que hacerlo pero si no se quitan no funciona:
Soldar cables a la tarjeta SD
El esquema de conexiones desde el punto de vista de la tarjeta SD en texto sería algo así:
SD Card ----- Fonera CS (pin 1) SW6 DI (pin 2) SW5 Gnd (pin 3) Gnd Vcc (pin 4) Vcc CLK (pin 5) SW2 Gnd (pin 6) Gnd DO (pin 7) SW1
El orden de los cables del 1 al 7 es azul, marrón claro, blanco-azul, naranja, verde, blanco-azul, marrón oscuro.
Fíjate en como están soldados el 3 y el 6 ya que en realidad son el mismo cable.
Alimentación del lector de tarjetas
El naranja y el blanco-azul son el positivo y el negativo y van a los conectores que se usan también para el puerto serie:
Soldar los cables a la fonera
El esquema de conexiones desde el punto de vista de la fonera en texto sería algo así:
SD Card ----- Fonera DO (pin 7) SW1 CLK (pin 5) SW2 DI (pin 2) SW5 CS (pin 1) SW6 Gnd (pin 3 and 6) Gnd Vcc (pin 4) Vcc
Donde el 1 está al lado del conector ethernet y el 6 es el que está más lejos.
Y el orden de los cables es marrón, verde, _ , _ , marrón claro, azul.
Como se puede ver los condensadores ya no están.
Conexiones terminadas
Aquí se puede ver una foto de todas las conexiones desde arriba:
Y aquí como queda la tarjeta SD pegada a la parte de abajo:
Instalación y configuración del lector de tarjetas
Instalar el software para la detección de tarjeta
Actualizamos con opkg update e instalamos el software necesario con opkg install luci-app-mmc_over_gpio:
root@OpenWrt:~# opkg update Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/Packages.gz Connecting to downloads.openwrt.org (78.24.191.177:80) Packages.gz 100% |**********************************************************************| 142k 00:00:00 ETA Inflating http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/Packages.gz Updated list of available packages in /var/opkg-lists/snapshots root@OpenWrt:~# opkg install luci-app-mmc_over_gpio Installing luci-app-mmc_over_gpio (0.8.8-1) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/luci-app-mmc_over_gpio_0.8.8-1_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) luci-app-mmc_over_gp 100% |**********************************************************************| 2079 --:--:-- ETA ....
Y editamos la sección de start() en el archivo /etc/init.d/mmc_over_gpio. Donde pone add_device "default" 5 4 3 7 0 tenemos que comentarla y agregar unas líneas:
#add_device "default" 5 4 3 7 0 add_device "default" 1 3 4 14 0 sleep 2 remove_device "default" sleep 2 add_device "default" 1 3 4 7 0
Si ejecutamos /etc/init.d/mmc_over_gpio start y ejecutamos dmesg deberíamos ver al final algo como esto:
mmc0: new SD card on SPI mmcblk0: mmc0:0000 SD128 123008KiB mmcblk0: p1
Si esto funciona, ya tienes la tarjeta funcionando.
Sistema de archivos de la tarjeta
Si intentas montar la partición donde está el sistema de archivos te dirá algo como file not found.
Eso es porque faltan los módulos del kernel para vfat, ext3 y casi todos los sistemas de archivos que se usan en otros sistemas operativos.
Vamos a instalarlos tanto para vfat como para ext3, que será el que usaremos:
root@OpenWrt:~# opkg install kmod-fs-vfat kmod-fs-ext3 kmod-nls-cp437 kmod-nls-cp850 kmod-nls-iso8859-15 Installing kmod-fs-vfat (2.6.26.8-atheros-1) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/kmod-fs-vfat_2.6.26.8-atheros-1_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) kmod-fs-vfat_2.6.26. 100% |*********************************************************************************************| 37598 --:--:-- ETA Installing kmod-fs-ext3 (2.6.26.8-atheros-1) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/kmod-fs-ext3_2.6.26.8-atheros-1_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) kmod-fs-ext3_2.6.26. 100% |************************************************************************************************************| 92529 --:--:-- ETA Installing kmod-nls-base (2.6.26.8-atheros-1) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/kmod-nls-base_2.6.26.8-atheros-1_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) kmod-nls-base_2.6.26 100% |*********************************************************************************************| 3719 --:--:-- ETA Installing kmod-nls-cp437 (2.6.26.8-atheros-1) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/kmod-nls-cp437_2.6.26.8-atheros-1_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) kmod-nls-cp437_2.6.2 100% |*********************************************************************************************| 2968 --:--:-- ETA Installing kmod-nls-cp850 (2.6.26.8-atheros-1) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/kmod-nls-cp850_2.6.26.8-atheros-1_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) kmod-nls-cp850_2.6.2 100% |*********************************************************************************************| 2930 --:--:-- ETA Installing kmod-nls-iso8859-15 (2.6.26.8-atheros-1) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/kmod-nls-iso8859-15_2.6.26.8-atheros-1_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) kmod-nls-iso8859-15_ 100% |*********************************************************************************************| 2722 --:--:-- ETA Configuring kmod-fs-vfat Configuring kmod-fs-ext3 Configuring kmod-nls-base Configuring kmod-nls-cp437 Configuring kmod-nls-cp850 Configuring kmod-nls-iso8859-15 root@OpenWrt:~#
Ahora creamos el directorio en el que montar la tarjeta y la montamos ahí. Si es vfat tendremos que pasarle a mount la opción -t vfat y si es ext3 tendremos que pasarle -t ext3.
root@pandora:/jffs/usr/libexec/nagios# mkdir /mnt/sdcard/ root@pandora:/jffs/usr/libexec/nagios# mount /dev/mmcblk0p1 /mnt/sdcard/ -t ext3
Y ahora vamos a instalar algo sin tener espacio para hacerlo, como por ejemplo nagios. Tras instalar el nagios y el nagios-nrpe con un opkg install nagios nagios-plugins nrpe se instala todo menos nagios porque dice que no tiene espacio. Vamos a solucionarlo:
root@pandora:/jffs/usr/libexec/nagios# cd .. root@pandora:/jffs/usr/libexec# mv nagios/ /mnt/sdcard/;ln -s /mnt/sdcard/nagios/ root@pandora:/jffs/usr/libexec# opkg install nagios Installing nagios (2.10-1) to root... Collected errors: * Only have 3468 available blocks on filesystem /, pkg nagios needs 5112 root@pandora:/jffs/usr/libexec# df -h Filesystem Size Used Available Use% Mounted on rootfs 1.5M 1.5M 0 100% / /dev/root 1.5M 1.5M 0 100% /rom tmpfs 6.7M 752.0k 5.9M 11% /tmp tmpfs 512.0k 0 512.0k 0% /dev /dev/mtdblock3 5.4M 2.1M 3.3M 39% /jffs mini_fo:/jffs 1.5M 1.5M 0 100% / /dev/mmcblk0p1 116.2M 6.7M 103.5M 6% /mnt/sdcard root@pandora:/jffs/usr/libexec#
El no sabe que en realidad si tiene espacio, pero en la tarjeta SD. Vamos a ver si se puede forzar a instalar:
root@pandora:/jffs/usr/libexec# opkg opkg: opkg must have one sub-command argument opkg version 0.1.5 usage: opkg [options...] sub-command [arguments...] where sub-command is one of: Package Manipulation: update Update list of available packages upgrade Upgrade all installed packages to latest version installDownload and install (and dependencies) install Install package configure [ ] Configure unpacked packages remove Remove package flag ... Flag package(s) =hold|noprune|user|ok|installed|unpacked (one per invocation) Informational Commands: list List available packages and descriptions list_installed List all and only the installed packages and description files List all files belonging to search Search for a package providing info [pkg|regexp] Display all info for status [pkg|regexp] Display all status for download Download to current directory. compare_versions compare versions using <= < > >= = << >> print_architecture prints the architecture. print_installation_architecture whatdepends [-A] [pkgname|pat]+ whatdependsrec [-A] [pkgname|pat]+ whatprovides [-A] [pkgname|pat]+ whatconflicts [-A] [pkgname|pat]+ whatreplaces [-A] [pkgname|pat]+ prints the installation architecture. Options: -A Query all packages with whatdepends, whatprovides, whatreplaces, whatconflicts -V Set verbosity level to . If no value is --verbosity provided increase verbosity by one. Verbosity levels: 0 errors only 1 normal messages (default) 2 informative messages 3 debug output -f Use as the opkg configuration file -conf Default configuration file location is /etc/opkg.conf -d Use as the the root directory for -dest package installation, removal, upgrading. should be a defined dest name from the configuration file, (but can also be a directory name in a pinch). -o Use as the root directory for -offline offline installation of packages. Force Options (use when opkg is too smart for its own good): -force-depends Make dependency checks warnings instead of errors Install/remove package in spite of failed dependences -force-defaults Use default options for questions asked by opkg. (no prompts). Note that this will not prevent package installation scripts from prompting. -force-reinstall Allow opkg to reinstall a package. -force-overwrite Allow opkg to overwrite files from another package during an install. -force-downgrade Allow opkg to downgrade packages. -force_space Install even if there does not seem to be enough space. -noaction No action -- test only -nodeps Do not follow dependences -force-removal-of-dependent-packages -recursive Allow opkg to remove package and all that depend on it. -autoremove Allow opkg to remove packages that where installed automatically to satisfy dependencies. -test No action -- test only -t Specify tmp-dir. --tmp-dir Specify tmp-dir. regexp could be something like 'pkgname*' '*file*' or similar eg: opkg info 'libstd*' or opkg search '*libop*' or opkg remove 'libncur*' root@pandora:/jffs/usr/libexec#
Eso de -force_space tiene buena pinta:
root@pandora:/jffs/usr/libexec# opkg install -force_space nagios Installing nagios (2.10-1) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/nagios_2.10-1_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) nagios_2.10-1_mips.i 100% |*******************************| 2022k 00:00:00 ETA Installing libpthread (0.9.29-14.3) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/libpthread_0.9.29-14.3_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) libpthread_0.9.29-14 100% |*******************************| 19212 --:--:-- ETA Installing microperl (5.10.0-1) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/microperl_5.10.0-1_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) microperl_5.10.0-1_m 100% |*******************************| 434k 00:00:00 ETA Installing libltdl (1.5.24-1) to root... Downloading http://downloads.openwrt.org/kamikaze/8.09.2/atheros/packages/libltdl_1.5.24-1_mips.ipk Connecting to downloads.openwrt.org (78.24.191.177:80) libltdl_1.5.24-1_mip 100% |*******************************| 11443 00:00:00 ETA Configuring libltdl Configuring libpthread Configuring microperl Configuring nagios root@pandora:/jffs/usr/libexec#
Y ya tenemos nagios instalado en la fonera.
Adjunto | Tamaño |
---|---|
00_presentacion.320w.png | 85.94 KB |