Server TFTP + Actualización IOS
Hoy me tocó realizar un trabajo que deja buena experiencia, cambiar el sistema operativo de algunos switchs Cisco. Para el que no conozca, los switchs Cisco traen un sistema operativo llamado IOS, y cuenta con su propio interprete de comandos, y utiliza comandos bastante distintos al mundo *nix. Además los switchs no tienen puerto USB, ni disketera, ni cd-rom, desde donde copiar información a la memoria =P

Para acceder a la configuración de uno de estos switchs necesitamos una conexión serie a la consola del aparato, o bien, si ya tiene una configuración básica (como una IP y métodos de acceso), podemos accederlo con cable UTP conectado a la máquina.

Ahora bien, el problema sigue siendo, cómo le copiamos una nueva imagen de IOS a la memoria del switch? la conexión por consola (para lo cual podemos usar minicom en Linux, o HyperTerminal en Windows) no nos permite enviar archivos, solo ejecutar comandos. La conexión por UTP sigue siendo lo mismo. Lo que necesitamos es utilizar un protocolo de transferencia de archivos, y por default, en muchos de estos switchs sólo contamos con TFTP. En algunas versiones más modernas de IOS podremos utilizar SCP, pero si andan en el mundo de las redes, probablemente se encuentren con que cuentan sólo con TFTP .


Qué es TFTP?

Eso mismo me pregunté en el momento que lo leí, el nombre nos dice que es FTP, pero de qué juega la T del principio? Aquellos administradores con más años en el rubro seguramente lo han utilizado, pero para los más modernos como yo, encontrar este protocolo en la actualidad es muy raro, salvo que se dediquen al bajo nivel
Una búsqueda rápida en internet nos revela que TFTP es una versión "Trivial" de FTP. Qué quiere decir esto? que no tiene una mierd*, sólo funciones put, get y algunos otros pocos comandos. Es decir, es la implementación mínima de un protocolo de transferencia de archivos.
A diferencia del FTP común, este protocolo funciona sobre UDP, no cuenta con autenticación alguna, es decir, uno se conecta directamente al server sin proveer ninguna credencial de acceso. Además es un protocolo bastante lento para la transferencia de archivos por lo que pude experimentar.
Por todo esto, usen TFTP solamente si no cuentan con otra cosa!


Instalando y usando TFTP

En Linux contamos con server y cliente TFTP y, dependiendo la distribución, es muy fácil de instalar. En debian sólo hace falta ejecutar:
# apt-get install tftpd

Una vez instalado tftp, al menos en debian, ya se comienza a ejecutar. Sino, puede reiniciar el demonio inetd el cual suele ser el encargado de levantar el servicio:
# killall inetd
# inetd

Ahora si, ya teniendo el server tftp funcionando, nos preguntamos cuál es el home donde se guardan los archivos por default! Por si no se dieron cuenta con la explicación en el párrafo anterior, con tftp no tenemos forma de navegar por directorios! solo copiar desde o hacia el server. Es decir, cuando nos conectamos a un servidor tftp sólo podremos copiar archivos en la carpeta default, no podremos navegar por los directorios para elegir otra fuente/destino de los archivos.
Para que la copia de archivos funcione, debemos tener configurado un home y tener permisos de escritura en ese directorio. El directorio default lo pueden ver en la configuración de inetd, la cual se encuentra en /etc/inetd.conf donde tendrán una línea similar a esta:
tftp dgram udp4 wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /var/lib/tftpboot
El último path de la línea es el path que utiliza tftp como home. Supuestamente (no lo comprobé) si no especificamos path, tftp toma el directorio /tftpboot como default. En la mayoría de las explicaciones que encontré recomiendan configurar ese directorio con permisos 777 y cambiarlo en la configuración de inetd.conf. Para esto, primero creamos el directorio y le cambiamos los permisos:
# mkdir /tftpboot
# chmod 777 /tftpboot

después cambiamos la configuración de inetd.conf para que quede el nuevo path:
tftp dgram udp4 wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot
Ahora si, reiniciamos inetd para que el server tome los cambios:
# killall inetd
# inetd

Bien, ya tenemos nuestro server TFPT configurado, ahora estaría bueno probarlo... he aquí donde llega la parte más "bizarra" de todo esto. No solo no podemos movernos por la estructura de directorios, sino que, además, si queremos copiar un archivo al servidor, este archivo debe existir ya en el servidor!!!, bueniiiiiiiisimo, antes de copiar cada archivo que deseen al servidor, primero deberán crear un archivo vacío con el mismo nombre, de otra forma, el servicio no funciona. Esto es, si queremos copiar el archivo prueba.txt de nuestra máquina (o desde el switch como haremos después) al servidor tftp, primero deberemos crear en el servidor en la carpeta /tftpboot un archivo vacío que se llame prueba.txt. Además debemos recordar de darle los permisos correspondientes para que el cliente pueda escribir en el server. Esto lo podemos hacer con:
# touch /tftpboot/prueba.txt
# chmod 777 /tftpboot/prueba.txt

Algunas referencias sobre cómo instalar tftpd en linux que pueden encontrar son estas:
http://onlamp.com/pub/a/bsd/2003/06/05/FreeBSD_Basics.html
http://www.debianhelp.co.uk/tftp.htm


TFTP en Windows?

Si todavía no tienen la suerte de utilizar un *nix, también pueden contar con un servidor TFTP en Windows. Pueden encontrar una versión open source en http://tftpd32.jounin.net/tftpd32_download.html aunque aclaro que no la probé, así que no tengo idea de la configuración necesaria.

UPDATE (20/11/09): Hace un par de días probé el servidor TFTP de Windows y funciona perfecto, tan solo hay que correr el ejecutable. La forma de trabajo es la misma que describí para Linux, hay que crear a mano cada archivo a copiar en el servidor.


Actualizar el IOS del switch

Una vez que tenemos instalado el bastante incompleto TFTP en la máquina desde donde actualizaremos el IOS, podemos empezar el proceso de actualización.
Lo que les voy a contar no es nada nuevo y lo pueden encontrar en la página oficial de Cisco, pero me pareció interesante traducirlo y darle mi toque personal.
Los pasos que describo se basan en la explicación de Upgrading Software Images on Catalyst 2950 and 2955 Series Switches Using the Command Line Interface donde explican el update del IOS para un Cisco Catalyst 2950.

Para la configuración voy a asumir que cuentan con una máquina conectada a la consola del switch y que tienen un servidor TFTP (que puede ser la misma máquina) con IP 192.168.1.1.

Como siempre en este tipo de tareas, lo mejor es arrancar con un buen backup. Para poder usar TFTP, deberemos darle un IP al switch (o a alguna vlan como en el ejemplo), si es que todavía no lo tiene. Esto lo hacemos de la siguiente forma:
switch # configure terminal
switch (config) # interfaces vlan 1
switch (config−if) # ip address 192.168.1.100 255.255.255.0
switch (config−if) # no shutdown
Ahora lo mejor es probar la conectividad a nuestro server y ver que funciona la transmisión de paquetes:
switch # ping 192.168.1.1
si dice "Success rate is 100 percent" estamos bien =)

Llegó la hora del backup. Lo que vamos a resguardar es la imágen IOS actual y la configuración del switch. Para el que no tenga mucho contacto con estos switchs, les comento que la configuración que el switch se encuentra ejecutando se llama runnin-config, la configuración que monta el switch cuando se inicia se llama startup-config. Por su parte, la imagen del IOS se encuentra en la memoria flash, la cual referenciamos con flash:
Recuerden la explicación sobre TFTP, antes de copiar los archivos del switch, deberán crear archivos vacíos con exactamente los mismos nombres en el servidor tftp en la carpeta /tftpboot, de otra forma la transferencia dará error! Además presten mucha atención con qué nombre copia el switch el archivo startup-config, porque le pone otro nombre (perdí un rato con esto ¬ ¬)
switch# copy startup-config tftp://192.168.1.1
switch# copy flash:c2950−i6q4l2−mz.121−11.EA1a.bin tftp://192.168.1.1
Con todo backupeado, podemos proceder a instalar la nueva imágen. Si tenemos espacio en la flash del switch podemos dejar la imagen vieja y copiar la nueva, pero, al menos en los 2950 q me toco testear, no tienen espacio (solamente cuentan con 8MB de flash!), así que primero debemos borrar la imagen vieja...

Aca es donde el lector suspicaz se preguntará "qué pasa si borro la imagen vieja y por alguna razón no puedo copiar la imagen nueva al switch?, el switch se transforma en un lindo ladrillo?"... bueno, al menos es lo que yo me pregunté antes de borrar la imagen. Por suerte la gente de Cisco pensó en esto, y si falla algo en este movimiento, podemos bootear el switch desde una imagen que se encuentre en un servidor TFTP. Es decir, el switch todavía es usable =D
Para borrar la imagen vieja, deberemos ejecutar lo siguiente:
switch # delete flash:c2950−i6q4l2−mz.121−11.EA1a.bin
Una vez que tenemos el espacio suficiente, ya podemos copiar la nueva imagen a la flash del switch, esto lo haremos nuevamente a través de TFTP. Recuerden que la imagen debe encontrarse en el directorio /tftpboot de otra forma, el switch no la va a encontrar:
switch # copy tftp://192.168.1.1/c2950−i6q4l2−mz.121−13.EA1.bin flash:
Por las dudas verificamos que la imagen es correcta:
switch # verify flash:c2950−i6q4l2−mz.121−13.EA1.bin
lo que nos debería dar "Verified flash:c2950−i6q4l2−mz.121−13.EA1.bin"

El próximo paso es configurar el switch para que bootee con la nueva imagen:
switch # configure terminal
switch (config)# boot system flash:c2950−i6q4l2−mz.121−13.EA1.bin
Y por las dudas nos aseguramos que el path de boot quedó bien con:
switch # sh boot

Llegando al final de esta super actualización deberemos salvar los cambios que se encuentran en memoria, y luego recargamos el switch para que inicia desde la nueva imagen:
switch # write memory
switch # reload
Ahora sí, como última prueba de que todo fue bien y que estamos ejecutando la nueva versión de IOS, ejecutamos lo siguiente:
switch # sh version
donde deberíamos ver la versión de nuestro flamante IOS nuevo =)


Sarasa final

Como verán actualizar un IOS no es algo tan complicado, aunque si es un trabajo bastante molesto usar el extremadamente pobre TFTP! A mi me llevó 2hs hacer la actualización y eso que no tenía ni idea de cómo hacerlo antes de empezar y perdí como 1.20hs inalando y probando el TFTP ¬ ¬

4 comentarios:

Anónimo dijo...

Muy buen artículo. Please spell check para el siguiente! jajaja
Saludos! Emi.

V3kt0r dijo...

pero che, me comí un par de letras nomas, el tipear rápido hace que me coma las letras de abajo jejeje

JaviZ dijo...

jejejeje, se lee igual... sin dudas este artículo será de gran utilidad a quienes se inician en esto de laburar en redes.

Salu2,
J (back to work)

Anónimo dijo...

Excelente Artículo, seguis postenado cosas así de útiles.

ok

Publicar un comentario