lunes, agosto 06, 2007

Preparando la fonera

A estas alturas todos sabéis que es lo que quiero hacer con mi fonera, podéis ver las ideas aquí y aquí. Bueno el caso que ya tengo la fonera operativa, así que puedo ponerme manos a la obra con el proyecto y empezar a prepararlo todo. Pienso llevar a cabo ambas ideas, aunque tienen objetivos muy parecidos, sin embargo aunque el conseguir que una funcione bien elimina la utilidad de la otra, haré las dos. Como es lógico hay que preparar la fonera de dos formas, una para el primer experimento, y otra para el segundo, porque dispone de muy poco espacio (~5 MB), así que no se pueden hacer las dos cosas a la vez. Lo que pienso hacer es preparar la fonera para una cosa, comprobar que funciona y luego hacer un backup de la memoria flash. Luego flasheo y con la fonera desde cero preparo lo otro y de nuevo hago backup de la flash. Así cuando llegue el curso lo tendré todo listo, solo tendré que restaurar a partir del backup que me interese usar. Pero bueno hemos ido muy lejos, todavía estoy en el principio, os cuento:

Tras flashear la fonera, lo primero que hice fue configurar la red acorde con mi red, es decir, la puse en el mismo rango de ips, configure el gateway, dns y poco mas. Después mi intención era empezar montando el servidor de netboot para conseguir que uno de los portátiles del centro tic arrancara desde el y se quitara el password de root, dejando un backup del fichero original para poder restaurarlo posteriormente. Para conseguir este objetivo principalmente hacen falta 3 cosas, un servidor dchp, un servidor tftp y los archivos que se enviaran a la maquina cliente que requiera el netboot. Para el primer paso me di una vuelta por el repositorio de openwrt, a pesar de que podía haberlo hecho mediante ipkg, su gestor de paquetes, y encontré el paquete dhcp-server, lo instalé: ipkg install dhcp-server. Después intenté configurarlo, edité el archivo de configuración y todos los archivos que pedía, pero no funcionó, no puedo poner textualmente el mensaje de error porque no lo tengo anotado, pero en esencia venía a decir que verificara si había algún otro servicio dhcp, que el recurso ya estaba en uso, mas o menos eso era. Después navegando por el wiki de openwrt, fonera.info y los foros de fon (bueno aquí llegue vía google), encuentro un paquete perfecto, dnsmasq, es exactamente lo que necesito, es un paquete que incluye dns, servidor dhcp, y servidor tftp. Todo lo que hace falta para lograr mi objetivo está ahí. Ya está incluido, por lo que no tuve que instalarlo, lo que si tuve que hacer fue leerme la página man entera, para poder configurarlo correctamente. Dnsmasq por defecto busca la configuración en el archivo /etc/dnsmasq.conf, aunque se puede cambiar, o se puede no usar archivo de configuración, es un programa muy configurable, se adapta a las necesidades del usuario, aunque yo todavía no he podido correrlo. Lo que pasa es que yo entro a mi fonera por ssh a través del puerto ethernet, es decir la fonera está conectada a mi router (por ethernet) y yo desde el portátil me conecto vía wifi a la red inalámbrica de mi router, y conectado vía wifi a mi lan accedo por ssh a la fonera. Esto tiene un inconveniente obvio, a mi me interesa configurar el servidor dhcp para que funcione en la interfaz ethernet ya que será la que conecte a la laptop del centro tic, y si esta en uso conectada al router y enviando y recibiendo datos, puede ser que no funcione el servidor dhcp (como de hecho es), y ademas mi router no piensa pedirle una dirección a la fonera, en todo caso sería al revés. Como ya os he dicho antes no he podido hacerlo funcionar, mi archivo de configuración es este:

# filter what we send upstream
domain-needed
bogus-priv
filterwin2k
localise-queries

resolv-file=/tmp/resolv.conf.auto
dhcp-leasefile=/tmp/dhcp.leases

dhcp-range=vlan0,192.168.1.10,192.168.1.50,255.255.255.0

interface=eth0

enable-tftp
tftp-root=/mnt/tftp

#dhcp-boot=vlan0

Las primeras líneas, tal y como dice ese comentario, son para filtrar lo que se le envía al servidor dns (ahora explico), venían por defecto, y tras leer el man me pareció bien, así que las deje, a pesar de que el dns no es algo a lo que vaya a darle mucho uso, a mi me interesa el dhcp y el tftp. Lo que he dicho antes que iba a explicar, dnsmasq no incorpora realmente un servidor dns (bueno si pero no, según se mire), lo que hace es usar el /etc/hosts como dns "local" y las peticiones dns de otras maquinas se envían al servidor dns que este configurado en el archivo correspondiente, se especifica con el parámetro resolv-file. Después he indicado el rango de ips que quiero que asigne la fonera a los clientes. A continuación defino la interfaz sobre la que quiero que corra. Lo siguiente es el tftp y el directorio que usa. La última línea no la he terminado de configurar todavía, por eso la he comentado, es la que indica los paramétros del netboot, el archivo que se envía...

Bueno esa es mi configuración, y con ella puesta ejecuto dnsmasq pero me suelta esto:

dnsmasq: failed to create listening socket: Address already in use

Y obviamente deja de ejecutarse. Este es el problema que estoy intentando solucionar ahora, la idea que tengo es que a lo mejor no puede funcionar el dhcp porque la interfaz de red eth0 está en uso (de hecho mantiene una sesión ssh conmigo), lo que he pensado para solucionarlo era configurar el wifi (por defecto esta desactivado) en modo ap, para conectarme via wifi a la fonera, y desde su propia red inalámbrica conectarme a ella por ssh para poder controlarla, consiguiendo así tener el puerto ethernet libre, después conectarla a la segunda tarjeta de red de mi servidor e intentar que dnsmasq funcione, de ser así prepararía los archivos para el netboot y luego lo probaría en el portátil, en el sobremesa y en el server, si funcionara haría el backup de la flash, reflashearía y me pondría con el otro experimento (el de ponerla en modo cliente y que scanee de forma autónoma la red tic).

Eso último es la teoría, en la práctica me está resultando mas complejo. He activado el wifi e intenté conectarme, no conseguía ip, tuve que conectarme y asignarme manualmente la ip y ya funcionó. Sin embargo después mirando el archivo de configuración probé con otras opciones y conseguí que asignara dhcp por wifi y me conecté bien, pero a través de la lan cerró el ssh, lo sé porqué via ssh intente conectarme vía ssh vía ethernet a la fonera y no se podía, solo abrío el puerto 22 a la red que daba por la interfaz wifi (sin configuré las interfaces para que fueran por dos redes distintas). Pensé que ya valía así, pero quise ponerle cifrado a la red wifi, opté por lo mas rápido, wep, solo había que cambiar dos líneas, y ademas tampoco me interesaba que fuera la red mas segura, simplemente alejar a los curiosos. Lo hice, rebooteo la fonera (al contrario que firmware de fon, este si rebootea en condiciones, ejecutas reboot y se reinicia, con fon si ejecutabas reboot ya te podías quedar esperando, porque hasta que no desenchufaras/enchufaras no ibas a conseguir nada) una vez reiniciada (cuando comprobé que respondía a los pings, cuando reinicio la fonera ejecuto ping fonera, y al principio muestra sus últimas señales de vida, responde, luego pasa unos segundos muerta y cuando vuelve a responder es obvio que es porque ya está viva) intenté conectarme a la red wifi, pero no podía!! tras muchos intentos me di cuenta que estaba de nuevo en la misma situación al principio, pero esta vez tenía mi as en la manga, podía flashear muy fácilmente, redboot me espera 10 segundos cada arranqué, así que flasheé.

Tras este nuevo "borrón y cuenta nueva" configure de nuevo la red y trasteando con el wifi, la ip, dhcp... me volvió a pasar lo mismo, me quedé de nuevo sin conexión, así que a flashear de nuevo. Está vez tras la configuración básica del la red no toqué nada más. Me he creado un script que recupera la fonera en caso de que yo vuelva a configurar mal la red. Os explico, la configuración del wifi y de la red está en dos archivos, /etc/config/network y /etc/config/wireless, así yo lo que he hecho a sido guardar una copia de seguridad de cada uno de ellos ahora que estan bien puestos, en /mnt. Y la salvación viene por aquí, he creado un script que se ejecuta al inicio que lo que hace es esperar 3 minutos, y después restaurar el backup de los dos archivos. De esta forma yo cuando quiera probar una nueva configuración de la red edito los archivos, hago un backup de ellos (para que luego cuando mi script funcione si los sobreescribe y han funcionado poder tenerlos guardados) y reinicio. Si la nueva configuración ha funcionado podré conectarme a la fonera, si no lo ha hecho simplemente me espero 3 minutos (porque? no se, me pareció una buena cifra) y reinicio manualmente la fonera (con el cable). Así conseguiré de nuevo acceso a la fonera. El script en cuestión es /etc/init.d/test, y su contenido es este (blogger desconfigura los espacios, grrr!):

#!/bin/sh /etc/rc.common
# Copyright (C) 2006 OpenWrt.org

START=50
start(){
sleep 180
cp /mnt/network /etc/config/
cp /mnt/wireless /etc/config
}

stop(){
killall test
}

Con ese sencillo script (y con los backups) conseguiremos no tener que volver a flashear por culpa de una mala configuración de la red. Por cierto he comprobado que funciona bien, a los backups les añadí un comment (#test) reinicié espere los 3m y efectivamente mis ficheros network y wireless cambiaron, ahora tenían el comment. Por último decir que para que funcione el script hay que darle permisos de ejecución y habilitarlo:

chmod +x /etc/init.d/test
/etc/init.d/test enable

Y ya no me acuerdo de mas cosas que haya hecho, he estado leyendo todo lo que he encontrado acerca de openwrt y de la fonera y espero que esto vaya progresando.