====== 09 - FTP ====== La transferencia de ficheros es un proceso fundamental en las redes informáticas, ya que permite el intercambio de datos entre diferentes dispositivos conectados. En un entorno de red, los usuarios y sistemas necesitan mover archivos de un lugar a otro, ya sea para compartir información, realizar copias de seguridad o mantener sistemas sincronizados. Para facilitar este intercambio, existen varios protocolos de comunicación que permiten transferir archivos de manera eficiente y segura. Uno de los protocolos más utilizados para la transferencia de ficheros en redes TCP/IP es el [[https://es.wikipedia.org/wiki/Protocolo_de_transferencia_de_archivos|File Transfer Protocol (FTP)]]. FTP es un protocolo de red estándar utilizado para la transferencia de archivos entre un cliente y un servidor a través de una red, generalmente Internet. FTP se basa en el modelo cliente-servidor, donde el cliente FTP envía comandos para interactuar con el servidor FTP, permitiendo así la descarga y subida de archivos de forma bidireccional. FTP se diseñó inicialmente en 1971 y ha sido uno de los métodos más confiables para la transferencia de ficheros en Internet, aunque en sus primeras versiones no se implementaba ninguna encriptación de los datos, lo que plantea problemas de seguridad. El funcionamiento de FTP se basa en una conexión de dos canales entre el cliente y el servidor: * Canal de control (**puerto 21**): A través de este puerto, el cliente y el servidor se comunican para gestionar la sesión FTP, como la autenticación del usuario, la solicitud de archivos o directorios y la configuración de la conexión. * Canal de datos (**puerto 20 en modo activo**): Es el canal a través del cual se transfieren los archivos. Dependiendo del modo de operación (activo o pasivo), el cliente o el servidor son responsables de iniciar esta conexión. Además de la transferencia de archivos, FTP permite realizar operaciones sobre el sistema de archivos del servidor, como listar directorios, crear nuevos directorios o borrar archivos. A pesar de ser muy utilizado, FTP transmite los datos, incluidas las credenciales de acceso (usuario y contraseña), en texto plano, lo que representa un riesgo de seguridad. Para contrarrestar esto, existen variantes más seguras como FTPS y SFTP, que utilizan encriptación ===== Tipos de conexión ===== El protocolo FTP utiliza dos tipos de conexiones principales: el modo **activo** y el modo **pasivo**. Ambos se diferencian en cómo se establece la conexión para la transferencia de datos, mientras que la conexión de control (por el puerto 21 del servidor) se mantiene igual. ==== Modo Activo ==== En el modo activo, el cliente inicia la comunicación abriendo una conexión al puerto 21 del servidor. A través de esta conexión, el cliente envía comandos y recibe respuestas del servidor. Cuando el cliente necesita transferir datos, ya sea para descargar un archivo, subirlo o listar un directorio, le indica al servidor que abra una conexión de datos. El cliente informa al servidor qué puerto local tiene abierto para recibir la conexión de datos. El servidor entonces establece una conexión activa desde su puerto 20 hacia el puerto especificado en el cliente. Este modo requiere que el cliente esté disponible para aceptar conexiones entrantes, lo cual puede ser un problema si está detrás de un firewall o un router con NAT, ya que estas configuraciones suelen bloquear conexiones externas. @startuml box "Client" participant "Client Data" participant "Client Control" end box box "Server" participant "Server Control (21)" participant "Server Data (20)" end box "Client Control" ->(40) "Server Control (21)": Conexión al puerto 21 "Server Control (21)" -->(40) "Client Control": Respuesta en el canal de control "Client Control" ->(40) "Server Control (21)": PORT "Server Control (21)" -->(40) "Client Control": 200 Command okay "Client Data" (40)<- "Server Data (20)": Conexión al puerto especificado "Server Data (20)" -->(40) "Client Data": Transferencia del archivo @enduml ==== Modo Pasivo ==== En el modo pasivo, el cliente inicia la comunicación abriendo una conexión al puerto 21 del servidor. Este canal se utiliza para enviar comandos y recibir respuestas. Cuando el cliente necesita transferir datos, solicita al servidor que entre en modo pasivo mediante el comando **PASV**. En respuesta, el servidor abre un puerto aleatorio para la transferencia de datos y le informa al cliente qué puerto está escuchando. El cliente, entonces, inicia una conexión a ese puerto para transferir los datos. Este modo es útil cuando el cliente está detrás de un firewall o un router con NAT, ya que evita la necesidad de aceptar conexiones entrantes. @startuml box "Client" participant "Client Data" participant "Client Control" end box box "Server" participant "Server Control (21)" participant "Server Data (random)" end box "Client Control" ->(40) "Server Control (21)": Conexión al puerto 21 "Server Control (21)" -->(40) "Client Control": Respuesta en el canal de control "Client Control" ->(40) "Server Control (21)": PASV "Server Control (21)" -->(40) "Client Control": 227 Entering Passive Mode "Client Data" ->(40) "Server Data (random)": Conexión al puerto especificado "Server Data (random)" -->(40) "Client Data": Transferencia del archivo @enduml ===== Tipos de FTP ===== FTP cuenta con varias variantes diseñadas para cubrir diferentes necesidades, especialmente en cuanto a seguridad: **FTP estándar** El protocolo original no incluye mecanismos de encriptación. Todas las comunicaciones, incluidas las credenciales, se transmiten en texto plano, lo que lo hace vulnerable a ataques como el sniffing. Aunque su uso ha disminuido por razones de seguridad, sigue siendo útil en redes cerradas o entornos controlados. **FTPS (FTP Secure)** Añade cifrado mediante SSL/TLS para proteger las credenciales y los datos durante la transferencia. Se basa en los mismos comandos que el FTP estándar, pero con encriptación. * Modo explícito: El cliente inicia una conexión no cifrada y solicita el uso de TLS/SSL antes de transmitir datos sensibles. * Modo implícito: Toda la conexión, desde el principio, está cifrada y suele emplear el puerto 990 en lugar del 21. **SFTP (SSH File Transfer Protocol)** Basado en el protocolo SSH, utiliza un único canal cifrado para comandos y datos, proporcionando seguridad y autenticación robusta. Aunque comparte funciones similares con FTP, es un protocolo diferente que no requiere múltiples conexiones y resulta más eficiente y seguro en la mayoría de los casos. ===== Clientes FTP ===== Para interactuar con servidores FTP, se utilizan clientes que permiten realizar conexiones, enviar comandos y transferir archivos. Estos clientes pueden clasificarse en dos tipos principales: **Clientes de terminal** La mayoría de los sistemas operativos incluyen un cliente FTP básico que permite conectarse a servidores y realizar operaciones mediante comandos: * **Linux/Unix**: La herramienta `ftp` suele venir preinstalada y permite realizar operaciones básicas de transferencia de archivos. Alternativamente, `lftp` es una opción más avanzada, con soporte para FTPS/SFTP y funcionalidades como reintentos automáticos. * **macOS**: Incluye un cliente FTP nativo accesible desde la terminal, útil para tareas básicas. * **Windows**: Aunque versiones recientes no habilitan el comando `ftp` por defecto, sigue disponible como característica opcional. Además, se pueden usar herramientas más modernas como PowerShell para realizar operaciones FTP. Si el cliente no está disponible en el sistema, puede instalarse desde los repositorios o configurarse con herramientas adicionales. Estas herramientas resultan especialmente útiles en entornos minimalistas o de administración remota. **Clientes con interfaz gráfica** Para quienes prefieren una experiencia visual, aplicaciones como [[https://filezilla-project.org/|Filezilla]] ofrecen una interfaz intuitiva. Estas aplicaciones simplifican las transferencias de archivos mediante características como: * Arrastrar y soltar archivos. * Gestión de conexiones (credenciales, direcciones, modos de conexión). * Visualización de logs en tiempo real para depurar errores. El uso de clientes gráficos es ideal para usuarios no técnicos o cuando se trabaja con una gran cantidad de archivos y directorios. Ambos tipos de clientes son compatibles con servidores FTP estándar y variantes seguras como FTPS y SFTP, permitiendo elegir la herramienta adecuada según las necesidades. ==== Conexión a un servidor FTP ==== Para probar la conexión a un servidor FTP, utilizaremos el servicio gratuito proporcionado por [[https://dlptest.com/ftp-test/|dlptest.com]], que permite realizar pruebas de transferencia. Las credenciales necesarias para la conexión están disponibles en la propia página web. * **Usuario**: dlpuser * **Contraseña**: rNrKYTX9g7z3RgJRmxWuGHbeu **Terminal** Abre una terminal y escribe el siguiente comando: ftp ftp.dlptest.com Cuando se conecte, deberías ver un mensaje de bienvenida del servidor y la opción de ingresar el usuario y la contraseña: Conectado a ftp.dlptest.com. 220 Welcome to the DLP Test FTP Server 200 Always in UTF8 mode. Usuario (ftp.dlptest.com:(none)): dlpuser 331 Please specify the password. Contraseña: Una vez autenticado, la terminal cambiará a modo interactivo FTP (ftp>). ** FileZilla** Abre Filezilla y configura una nueva conexión: * **Servidor**: ftp.dlptest.com * **Usuario**: dlpuser * **Contraseña**: rNrKYTX9g7z3RgJRmxWuGHbeu * **Protocolo**: FTP (sin cifrado) * **Puerto**: 21 (si lo dejas en blanco, por defecto será ese puerto) {{ :clase:smr:sr:2eval:filezilla1.png?600 |}} Haz clic en //Conexión rápida//. Una vez conectado, podrás explorar los directorios y transferir archivos mediante la interfaz gráfica. Este servidor de prueba no es seguro para datos sensibles. No lo uses para archivos confidenciales. Además, los archivos que subas a los 10 minutos. ===== Comandos FTP ===== Una vez estamos conectados al servidor FTP podemos ejecutar una serie de comandos. Para saber el listado disponible podemos ejecutar el comando **help**: ftp> help Los comandos se pueden abreviar. Comandos: ! delete literal prompt send ? debug ls put status append dir mdelete pwd trace ascii disconnect mdir quit type bell get mget quote user binary glob mkdir recv verbose bye hash mls remotehelp cd help mput rename close lcd open rmdir ftp> Algunos de los más utilizados son: ^ Comando ^ Descripción ^ | open | Conecta al servidor FTP especificado. | | close | Cierra la conexión con el servidor FTP. | | !expresión | Ejecuta un comando del sistema local (en la terminal). | | quit | Cierra la sesión FTP y sale del cliente. | | ls | Lista los archivos y directorios en el directorio actual. | | cd | Cambia al directorio especificado. | | mkdir | Crea un nuevo directorio en el servidor FTP. | | delete | Elimina un archivo del servidor FTP. | | rename | Renombra un archivo en el servidor FTP. | | get | Descarga un archivo del servidor al cliente. | | put | Sube un archivo desde el cliente al servidor FTP. | | pwd | Muestra el directorio actual en el servidor FTP. | Es importante tener en cuenta que en ciertos entornos de red, como en centros educativos, empresas o redes que utilizan un proxy o un firewall, algunos comandos de FTP pueden no funcionar correctamente, especialmente aquellos que dependen de la conexión directa. Esto es debido a que los proxies o firewalls pueden bloquear puertos o impedir las conexiones de entrada, afectando la transferencia de archivos y otros comandos FTP. Los clientes FTP con interfaz gráfica, como FileZilla, ejecutan los comandos de FTP de manera transparente al usuario. Esto significa que, aunque no sea necesario escribir los comandos manualmente, como ls, get o put, estos se ejecutan automáticamente en segundo plano al interactuar con la interfaz. Estos programas simplifican el uso de FTP al ofrecer una experiencia visual más accesible, pero siguen utilizando los mismos comandos que se emplearían en un cliente de terminal. ===== Ejercicios ===== ** Ejercicio 1 ** * Usa un cliente FTP por terminal para conectarte a ftp.dlptest.com * Comprueba que puedes listar los archivos * Crea una carpeta en el servidor y accede a ella * Sube algún archivo al servidor ¿Cuánto tiempo permanece el archivo en el servidor? * Cambia el nombre del archivo * Descarga el archivo anterior a otra carpeta * Elimina el archivo y el directorio * Cierra la sesión ** Ejercicio 2 ** Haz el ejercicio anterior usando FileZilla pero no elimines el archivo ni el directorio ** Ejercicio 3 ** Intenta subir un archivo desde un cliente FTP en terminal (como ftp o lftp) al directorio creado en el ejercicio 2 ¿Por qué no te deja? ** Ejercicio 4 ** * Configura una nueva conexión en FileZilla para conectarte al servidor ftp de test.rebex.net * Descárgate algún archivo a tu máquina * Intenta subir algún archivo al servidor ¿Por qué no te deja subir archivos? * Cierra la sesión ** Ejercicio 5 ** * Conéctate por terminal al servidor FTP de dlptest * Cambia a **modo pasivo**. Investiga el comando necesario para realizar este cambio y escribe el resultado * Busca el comando que permite listar los archivos del directorio actual en tu máquina local (sin cerrar la conexión) * Cambia de carpeta en tu máquina local sin salir de la conexión al servidor. Verifica tu nuevo directorio local * Desde el nuevo directorio local, selecciona un archivo cualquiera y súbelo al servidor FTP * Descarga el archivo subido previamente a otro directorio local diferente y verifica que se ha descargado correctamente * Finaliza la sesión