Revista Informática

Cómo crear un servidor TFTP en Linux

Publicado el 02 enero 2017 por Drassill
Hoy quiero traeros un servicio muy usando en la actualidad; especialmente cuando se trabaja con equipos que se descargan la configuración vía red, dispositivos tales como Netgear o Grandstream. Se trata de una variante del servicio FTP, una variante preparada para que los equipos puedan descargarse pequeños archivos (generalmente de configuración) por red, evitando tener que realizar varias tediosas configuraciones y evitando problemas en caso de que alguien optase por restaurar la configuración de fábrica del equipo, pues la configuración siempre estará accesible vía red. Dicho servicio se llama TFTP (Trivial File Transfer Protocol), y una de sus principales ventajas es la facilidad de su configuración.
Cómo crear un servidor TFTP en Linux
Lo primero e indispensable para poder preparar nuestro servidor TFTP sería instalar los paquetes necesarios para que éste funcione, para lo cual ejecutaríamos el comando:
apt-get install xinetd tftpd tftp
Más de uno puede sorprenderse al ver que, además de los dos paquetes más obvios, también se está instalando el paquete xinetd. Para aquellos que no conozcan dicho paquete, han de saber que xinetd (eXtended InterNET Daemon) es un servicio que se dedica a controlar algunos procesos que requieren conectividad con Internet, tales como telnet, FTP o TFTP, y que proporciona una serie de configuraciones para mejorar tanto la seguridad del servicio como el consumo de recursos de éste. Es por ello que es altamente recomendable instalarlo junto con los otros dos paquetes con el fin tener un servidor TFTP óptimo.
Tras finalizar la instalación tendremos que desplazarnos al directorio de xinetd que almacena los ficheros de configuración de los servicios que controla; directorio llamado /etc/xined.d; allí dentro no veremos referencia alguna al servicio tftp, con lo que deberemos crear uno dicho nombre (importante que el nombre se encuentre todo en minúsculas); es decir que lo primero de todo que haremos será crear dicho fichero vacío para evitar problemas:
touch/etc/xinetd.d/tftp
Para después modificar dicho fichero para que tenga la siguiente estructura:
  1. service tftp
  2. {
  3. protocol        = udp
  4. port            = 69
  5. socket_type     = dgram
  6. wait            = yes
  7. user            = root
  8. server          = /usr/sbin/in.tftpd
  9. server_args     = /tftpboot
  10. disable         = no
  11. }

Antes de continuar, creo que es importante entender el significado de los parámetros de este fichero de configuración, pues en mi opinión la filosofía del simple copia-pega, sin entender el significado de lo copiado, es poco práctico e incluso peligroso dependiendo del caso.
  • Protocol: Se especifica el protocolo usado para este servicio, lo cual se divide básicamente en dos protocolos: TCP o UDP.
  • Port: Puerto en el que estará en "escucha" el servicio; El puerto por defecto de TFTP es el 69, pero se puede modificar si se desea, ya sea por motivos de seguridad o por cualquier otro motivo.
  • Socket_type: El tipo de socket de este servicio; En este caso se ha puesto dgram, es decir Datagram Socket. 
  • Wait: A diferencia de lo que uno puede pensar; esto no significa que el servicio TFTP tenga que esperar o no, sino que se dice si el servicio mono-proceso (no) o multi-proceso (yes). Con las CPU de hoy en día, que tienen múltiples núcleos, lo normal sería que todos los servicios sean multi-proceso; es decir que el valor wait sea puesto a yes. Si queréis saber un poco más acerca de los procesadores y los núcleos os recomiendo leer es post que hice en su día sobre el control de la salud del equipo en bash, que incluye algunas referencias a estos puntos.
  • User: El usuario que ejecutará en servicio; lo normal sería que lo ejecute root, pues nos aseguraríamos que el servicio se ejecutaría, si bien esto queda al gusto de cada uno.
  • Server: Aquí se define el binario que va a ejecutar el servicio. Habría que especificar la ruta completa, pues en caso contrario el fichero no lo encontraría.
  • Server_args: Los argumentos extra que añadiríamos a la ejecución del binario; este argumento no siempre es necesario, pero en este caso en concreto sí que lo sería, pues con estos argumentos extra estaríamos diciendo el directorio al que se accedería vía TFTP; directorio aislado que se parecería bastante a los directorios enjaulados de chroot, con la diferencia de que aquí únicamente se podrían realizar transferencias de datos desde otros equipos.
  • Disable: Este parámetro especifica si queremos que este servicio se arranque cuando se inicia xinetd o no. Lo normal es que el servicio se arranque con lo que pondríamos éste parámetro a "no"; en caso de no querer que se inicie, habría que poner dicho valor a "yes".

Con esto entendido y con el fichero de configuración creado, tendríamos que reiniciar el servicio xined para que arranque nuestro servidor tftp:
/etc/init.d/xinetd restart
Con esto ya tednríamos el servicio en marcha; la mejor forma de comprobarlo sería revisando que el puerto 69 está en escucha, con lo que ejecutaríamos el comando:
netstat-putan|grep":69 "
Tendría que aparecernos una línea parecida a la siguiente:
Cómo crear un servidor TFTP en Linux
Obviamente esta comprobación no bastaría; para empezar el directorio /tftpboot no existe por defecto, y habría que crearlo; además para cerciorarnos de que se hacen las transferencias correctamente, lo ideal sería crear un fichero dentro de dicho directorio para luego descargarnoslo vía tftp. Por ejemplo podríamos crear un fichero llamado fichero.txt.
  1. mdkir /tftpboot
  2. touch /tftpboot/fichero.txt
  3. echo > "1723457" > /tftpboot/fichero.txt
  4. chmod -R 755 /tftpboot

Con todos los preparativos realizados, lo que haríamos sería realizar el test en cuestión, que se podría realizar en el propio equipo o en otra máquina que tenga instalado el paquete tftp. Sería tan sencillo como escribir:
  1. tftp 192.168.1.4
  2. tftp> get fichero.txt
  3. Received 10 bytes in 0.0 seconds
  4. tftp> quit

Las líneas que comienza por tftp> se tratarían  líneas que aparecen en la consola automáticamente haciendo referencia a que nos encontramos dentro de una sesión tftp; sesión de la que se saldría mediante el comando quit.
Con esta prueba, en caso de habernos descargado exitosamente el fichero, verificaríamos que nuestro servidor TFTP se encuentra completamente operativo. Ahora bien... Si os fijáis bien, hasta ahora no hemos realizado algo que se aleje demasiado del funcionamiento de un servidor FTP normal... La mejor forma de sacarle el máximo partido al servidor TFTP es combinarlo con un servidor DHCP que incorpore funciones de TFTP, con el fin de que cuando un equipo coge IP, se descargue su fichero de configuración. Para ello, debemos tener un servidor DHCP instalado; en caso de no tenerlo instalado haríamos:
apt-get install isc-dhcp-server
Ahora pasaríamos a configurar el servidor DHCP para que pase la dirección del servidor tftp (además de la IP) a los equipos para que estos se descarguen la configuración. El fichero de configuración sería /etc/dhcp/dhcpd.conf, y una configuración básica sería:
  1. default-lease-time 600;
  2. max-lease-time 7200;
  3. shared-network "RED"{
  4.     subnet 192.168.1.0 netmask 255.255.255.0 {
  5.         range 192.168.1.5 192.168.1.254;
  6.         option tftp-server-name "192.168.1.4";
  7.     }
  8. }

Con esto estaríamos dándoles IP a los equipos y diciéndoles la IP del servidor TFTP desde el cual tendrían que bajarse el fichero de configuración (si lo hubiera); la cuestión está en que ésto no es del todo realista, sino que lo normal es hacer que ciertos equipos cojan la configuración de un directorio, otros de otro, etc... Es decir que se ponga cierto orden y se apliquen una serie de reglas para evitar que todo quede echo un desastre... Para ello estableceremos una serie de rangos de IP dependiendo del fabricante del equipo que esté pidiendo IP. Imaginemos que tenemos una red con Netgear, Grandstream y PCs de sobremesa. Queremos que los PCs simplemente reciban IP, pero queremos que las dos marcas reciban unas IPs en concreto y que apunten a un directorio en concreto del que descargar la configuración...
Podemos determinar la marca del fabricante gracias los 3 primeros bloques hexadecimales. Por ejemplo sabemos que las MAC que comiencen por "00:0b:82" son de grandstream y que comienzan por "20:4f:7f" son de Netgear; si bien este último fabricante tiene varias MACs. Para conocer con detalle las MACs y sus fabricantes, podéis entrar en esta web: http://www.miniwebtool.com/mac-address-lookup/. Gracias a estas MACs, podemos hilar mas fino, y no solo eso, sino que podemos crear subdirectorios específicos dentro de /tftpboot para estas marcas para que así cada una tenga sus ficheros por separado. Es decir que podemos hacer lo siguiente:
  1. mkdir /tftpboot/grandstream
  2. mkdir /tftpboot/netgear
  3. chmod -R 755 /tftpboot/

Ahora prepararíamos nuestro servidor DHCP para adaptarse a nuestras necesidades; haciendo que el fichero /etc/dhcp/dhcpd.conf quede de forma parecida a la de a continuación:


  1. class "grandstream" {
  2.         match if (
  3.                 (substring(hardware, 1, 3) = 00:0b:82)
  4.         );
  5. }
  6. class "netgear" {
  7.         match if (
  8.                 (substring(hardware, 1, 3) = 20:4f:7f)
  9.         );
  10. }
  11. default-lease-time 600;
  12. max-lease-time 7200;
  13. shared-network "RED"{
  14.         subnet 192.168.1.0 netmask 255.255.255.0 {
  15.                 pool {
  16.                         range 192.168.1.5 192.168.1.50;
  17.                         allow members of "grandstream";
  18.                         option tftp-server-name "192.168.1.4/grandstream";
  19.                 }
  20.                 pool {
  21.                         range 192.168.1.51 192.168.1.100;
  22.                         allow members of "netgear";
  23.                         option tftp-server-name "192.168.1.4/netgear";
  24.                 }
  25.                 pool {
  26.                         range 192.168.1.101 192.168.1.254;
  27.                         allow unknown-clients;;
  28.                 }
  29.         }
  30. }

Gracias a ésto, no solo tendríamos un servidor TFTP funcional, sino que también tendríamos un servidor DHCP completamente configurado que ayudaría a que éste sea útil y efectivo.
Espero que os haya resultado útil.
Saludos.

Volver a la Portada de Logo Paperblog