Sep 05

Cookbook: set-up a TFTP server on Ubuntu

Reading time: 1 – 2 minutes

Sometimes TFTP is the only protocol available to exchange files with an embedded system. So, it’s very easy to have that supported in our workstation or any other place to exchange files with those systems.

Set up steps:

apt-get install tftpd-hpa

modify file “/etc/default/tftpd-hpa”:

TFTP_OPTIONS="--secure --create"

–secure: Change root directory on startup. This means the remote host does not need to pass along the directory as part of the transfer, and may add security. When –secure is specified, exactly one directory should be specified on the command line. The use of this option is recommended for security as well as compatibility with some boot ROMs which cannot be easily made to include a directory name in its request.

–create Allow new files to be created. By default, tftpd will only allow upload of files that already exist. Files are created with default permissions allowing anyone to read or write them, unless the –permissive or –umask options are specified.

Needed to allow uploads in that directory:

chown -R tftp /var/lib/tftpboot

Restart and check if the service is running:

service tftpd-hpa restart
service tftpd-hpa status
netstat -a | grep tftp
Sep 18

Passant nou firmware a un Cisco via tftp

Reading time: 2 – 4 minutes

cisco.gif

Seguint amb la línia d’explicar tonteries sobre els Cisco, coses molt simples que passen poc sovint i que quan passen mai recordem com es feien. Avui vull fer-me un petit apunt a com carregar un nou IOS a un router de Cisco.

Primer cal que tinguem al nostre PC instal·lat un servidor de TFTP amb el nou IOS apunt per descarrega. Un bon manual per configurar el atftp en gentoo: Gentoo Linux based Netboot HOWTO (cache)mireu-vos només la secció: The tftpd Daemon. Després cal connectar-se al router amb el cable de consola de Cisco (DB9-RJ45) com sempre amb el minicom (programa terminal que uso des de linux per configurar els routers, equivalent a l’hyperterminal del win). Recordeu que la configuració serie és 9600bps, 8 bits dades, sense control de fluxe i 1 bit stop (9600 8N1).

Posem al portatil, per exemple, la següent configuració: 10.0.0.2/255.255.255.0 i a la fastethernet interface del cisco: 10.0.0.1/255.255.255.0.

Router>enable
Router#
Router# config t
Router(config)# interface fastethernet 0/0
Router(config-if)# ip address 10.0.0.1 255.255.255.0
Router(config-if)# no shutdown
Router(config-if)#exit
Router(config)#exit
Router# wr mem
Destination filename [startup-config]?  enter

Comproveu que podeu ‘pinguejar al router’. Després de confirmar que tenim enllaç només cal assegurar-nos de que el servidor TFTP i el IOS estan apunt per ser descarregats pel router.

Comença el procés interessant, el canvi de IOS:

Router#copy tftp flash
Address or name of remote host []? 10.0.0.2   /* ip portatil */
Source filename []? c1700-y7-mz.122-15.T7.bin /* nom del IOS */
Destination filename [c1700-y7-mz.122-15.T7.bin]? enter /* nom IOS al router */
Accessing tftp://10.0.0.2/c1700-y7-mz.122-15.T7.bin...
Erase flash: before copying? [confirm] ? enter
Erasing the flash filesystem will remove all files! Continue? [confirm] enter
Erasing device... eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee ...erasedee
Erase of flash: complete
Loading c1700-y7-mz.122-15.T7.bin from 10.0.0.2 (via FastEthernet0): !!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[OK - 6393852 bytes]
	Verifying checksum...  OK (0x5D11)
6393852 bytes copied in 78.804 secs (81136 bytes/sec)
Router#
Router#reload
Proceed with reload? [confirm] enter

Ja tenim el nou IOS al router ara quan acabi de rebotar podem comprovar que així és:

Router>en
Router#sh version
Cisco Internetwork Operating System Software
IOS (tm) C1700 Software (C1700-Y7-M), Version 12.2(15)T7,  RELEASE SOFTWARE (fc2)
TAC Support: http://www.cisco.com/tac
Copyright (c) 1986-2003 by cisco Systems, Inc.
Compiled Sat 09-Aug-03 06:42 by ccai
Image text-base: 0x80008120, data-base: 0x80AB2194
	ROM: System Bootstrap, Version 12.2(7r)XM2, RELEASE SOFTWARE (fc1)
	Router uptime is 23 minutes
System returned to ROM by reload
System image file is "flash:c1700-y7-mz.122-15.T7.bin"
Sep 08

Truquillo: Linksys WRT54G configuració via tftp

Reading time: 6 – 9 minutes

linksys.gif

Aquest agost vaig ‘postejar’ el nou mapa de la xarxa de Torrelavit. Doncs bé com haureu vist en el gràfic els APs tenen en molts casos múltiples interficies virtuals i rutes estàtiques. Ja que degut a la naturalesa de la nostre petita i modesta xarxa ciutadana no ens encaixa gaire el tema de l’enrutament dinàmic per OSPF i coses d’aquestes tan xules. Així doncs, vam trobar-nos en el dilema de com posar més d’una IP per cada interficie, cosa que la interficie web del router no permet. A més per afegir rutes estàtiques sense usar un adreçament dinàmic com RIP2 o OSPF la interficie gràfica tampoc ens ho permet.

Per tal de solucionar aquests problemes i de centralitzar el sistema de configuració dels APs en un punt. El que hem fet és montar un servidor TFTP al firewall. Amb accés només de les IPs dels APs. Un bon manual per configurar el atftp en gentoo: Gentoo Linux based Netboot HOWTO (cache)mireu-vos només la secció: The tftpd Daemon.

Una de les coses interessants que hem fet és usar només un fitxer de configuració per tots els APs de forma que aquest script sigui prou espavilat per poder configurar les particularitats diferents de cada AP. Després us explico com ho hem fet. Abans d’entrar en materia també us comento que tot el que explico només ho hem provat amb Alchemy. Imagino que amb altres firmwares també es deu poder fer però no ho hem provat.

La primera dificultat és com dir-li al Linksys que després d’arrencar s’ha de connectar al servidor TFTP s’ha de baixar el fitxer de configuració i l’ha d’executar després de baixar-lo. A més el que no voliem és que pas del TFTP pogués fallar i l’AP quedes desconfigurat a l’espera de que el tornessim a resetejar. O sigui, que el TFT s’ha de repetir fins que aconsegueixi connectar-se i agafar el fitxer. Tampoc cal una solució perfecte però si amb un mínim de control d’errors.

Com sabreu, si accedim per telnet al Linksys podem fer un nvram show per veure les variables que es guarden a la NVRAM (non-volatile RAM) on realment es guarda la configuració de l’AP. Doncs bé la variable que concretament ens interessa és la rc_startup podem consultar el seu valor: nvram get rc_startup. Doncs bé el que nosaltres volem és col·locar el següent codi dins la variable:

while sleep 30s;
do
 if ping -c 1 172.25.0.2>/dev/null;
 then
  tftp -g -l /tmp/s.sh -r s.sh 172.25.0.2;
  sh /tmp/s.sh;
  break;
 fi;
done

Com podeu veure el codi el que fa és que cada 30s intenta descarregar per TFTP el fitxer s.sh i el guarda a /tmp després l’executa. Això es repeteix fins que es pugui completar el cicle amb èxit. Ara només queda fixar aquest codi dins de la variable rc_startup i després guardar el codi a la NVRAM.

Ho podem fer així:

nvram set rc_startup="while sleep 30s;do if ping -c 1 172.25.0.2>/dev/null;then tftp -g -l /tmp/s.sh -r s.sh 172.25.0.2;sh /tmp/s.sh;break;fi;done"
nvram commit

Ara ja ens podem centrar en l’script en qüestió. Per complicar la cosa, aquí només explicaré com creem els alias de les interficies i les rutes estàtiques no posaré cap opció de firewalling ni de filtratge de MACs. Com he comentat la gràcia de l’script és que és el mateix per tots els APs de la xarxa, així que en algún lloc s’han de guardar els paràmetres pròpis de cada AP. Doncs bé per fer això hem fet un petit ‘trick’. Es tracta d’usar la interficie de definició de rutes estàtiques que té la interficie web per entrar totes les direccions que ens interessen.

Aquesta interficie gràfica l’usen els protocols dinàmics RIP2 i OSPF per definir rutes estàtiques. Si marquem la opció d’enrutament dinàmic com a ‘disable’ llavors podem afegir rutes a la configuració del sistema qu no s’executaràn degut al que acabo de dir, però si que estan guardades en la configuració. Això és el que aprofiarem per després recollir la informació i segons la lògica següent les usarem en el nostre script:

La lògica és molt senzilla, penseu que quan volem definir l’alias d’una interficie de xarxa ecencialment només ens cal la IP de la mateixa i la màscara. Així doncs en la interficie de de rutes estàtiques només haurem de definir aquestes dues dades si volem que la informació serveixi per declarar l’alias.

alias.png

Si pel contrari el que volem afegir a la interficie és una ruta estàtica aquesta haurà d’usar un gateway. O sigui, una direcció de xarxa, una màscara i un gateway això ho interpretarà l’script per definir una ruta estàtica.

route.png

Amb aquest petit ‘trick’ ja tenim una interficie que ens permet de forma molt senzilla en cada AP per guardar-hi la informació que el diferenciarà dels seus veins. Després el que fa el nostre script s.sh és mirar les variables d’NVRAM on es guarden i tractar aquesta informació segons la lògica que he comentat anteriorment. A continuació us enganxo un tros del contingut del s.sh on podeu veure com es fa això.

# Rutes i interficies virtuals
COMPTADOR=0
for AD in `nvram get static_route`;
do
        IP=`echo $AD | cut -f 1 -d ":"`
        MASK=`echo $AD | cut -f 2 -d ":"`
        GW=`echo $AD | cut -f 3 -d ":"`
        IF=`echo $AD | cut -f 4 -d ":"`
        echo $IP $MASK $GW $IF
        # es un enllas punt a punt
        if [ $GW = "0.0.0.0" ];
        then
                # creem les ips virutals de la interficie lan/wlan
                # trafic backbone
                COMPTADOR=`dc $COMPTADOR 1 + p`
                ifconfig br0:$COMPTADOR $IP netmask $MASK
        else
                # afegim rutes cap a trafic d'usuaris
                route add -net $IP netmask $MASK gw $GW
        fi
done

Encara que sembli mentida el que més va costar en aquest script és implementar el comptador, ja que la shell del Alchemy és molt reduida i no ens permet implementar comptadors de forma directa. Per fer això varem trobar un petit paquet que va instal·lat al sistema que es diu dc, és semblant al bc la famosa calculadora en format CLI que porten els linux, però la sintaxi és una mica diferent. Així que el tema ens va fer suar una bon estona.

La resta de l’script no té cap misteri com podeu comprovar. Obviament és molt millorable i es poden integrar moltes més funcions, però com a introducció a la idea crec que ja he donat prou dades sinó trobo que ho complicaria massa. Així que espero que us sigui útil i si en voleu més o teniu algún dubte ja sabeu on sóc.