6. FTP (File Transfer Protocol)

El protocolo FTP fue definido en la RFC 959 para intercambiar archivos entre un cliente y un servidor utilizando un modelo sencillo de comandos y respuestas en texto plano.

A pesar de su antigüedad, continúa presente en procesos de integración con sistemas heredados, automatizaciones industriales y despliegues web básicos. Conocer sus modos de operación, comandos y limitaciones facilita la migración hacia alternativas seguras cuando sea necesario.

6.1 Propósito y flujo general

FTP opera sobre dos canales: el de control (puerto 21/TCP) para enviar comandos y recibir respuestas, y el de datos para transferir los archivos. Los clientes inician sesión con un usuario y una contraseña o mediante acceso anónimo, navegan por el sistema de archivos remoto y solicitan subir o descargar contenidos.

La sintaxis es minimalista y comprensible, por lo que se integra con scripts o herramientas interactivas sin demasiado esfuerzo.

6.2 Modos activo y pasivo

El canal de datos puede establecerse de dos formas, lo que influye directamente en la configuración de firewalls:

Modo Inicio de conexión de datos Consideraciones
Activo El servidor se conecta al cliente desde el puerto 20 hacia un puerto alto especificado por el cliente (comando PORT). Puede fallar si el cliente está detrás de NAT o firewalls estrictos.
Pasivo El servidor abre un puerto alto y comunica su dirección; el cliente inicia la conexión (comando PASV). Es el modo preferido en redes modernas porque evita conexiones entrantes hacia el cliente.

Elegir correctamente el modo evita bloqueos intermitentes y tiempos de espera prolongados durante las transferencias.

6.3 Comandos principales

FTP define una lista de comandos estándar, muchos de los cuales coinciden con la forma en la que los usuarios interactúan con los archivos en sistemas locales:

  • USER / PASS: credenciales de acceso.
  • LIST: muestra archivos y directorios.
  • CWD / CDUP: cambia de directorio.
  • RETR: descarga un archivo.
  • STOR: sube un archivo.
  • DELE / RMD / MKD: gestiona objetos en el servidor.
  • TYPE: alterna entre modo ASCII o binario.
  • QUIT: finaliza la sesión.

Cada comando genera una respuesta numérica (códigos 1xx, 2xx, 3xx o 5xx) que indica el estado de la operación, lo cual simplifica la automatización.

6.4 Ventajas y desventajas

FTP sigue siendo atractivo por su simpleza, pero también presenta riesgos:

Aspecto Detalle
Ventajas Amplio soporte en sistemas operativos, clientes gráficos y bibliotecas; protocolo liviano con comandos interpretables por humanos.
Desventajas Transmite credenciales y datos en texto plano; requiere puertos adicionales que complican la seguridad perimetral.

Por estos motivos muchas organizaciones migran a SFTP o FTPS, aunque FTP puro se mantiene en entornos controlados o redes internas.

6.5 Ejemplo de conexión FTP

Un URI básico describe usuario, servidor y carpeta objetivo:

ftp://deploy@intranet.local/public_html

Desde una sesión interactiva, el flujo habitual luce así:

ftp intranet.local
Name (intranet.local:deploy): deploy
Password:
ftp> passive
Passive mode on.
ftp> cd public_html
ftp> put index.html
ftp> bye

Es importante forzar el modo pasivo cuando el cliente se encuentra en una red corporativa restringida para evitar interrupciones.

6.6 Herramientas y clientes habituales

Clientes como FileZilla, WinSCP o Cyberduck ofrecen interfaces gráficas, sincronización de carpetas y colas de transferencia. En servidores Linux o Windows Server suele utilizarse el cliente de línea de comandos incorporado para tareas rápidas y automatizables.

6.7 Automatización con PowerShell

Windows incluye la clase System.Net.FtpWebRequest, que permite enviar archivos sin depender de utilidades externas:

$ftpUri = "ftp://intranet.local/public_html/reportes.zip"
$cred = New-Object System.Net.NetworkCredential("deploy","Secreta123")
$request = [System.Net.FtpWebRequest]::Create($ftpUri)
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$request.Credentials = $cred
$request.UsePassive = $true
$request.EnableSsl = $false
$archivo = [System.IO.File]::ReadAllBytes("C:\\reportes\\reportes.zip")
$request.GetRequestStream().Write($archivo, 0, $archivo.Length)
$request.GetResponse().StatusDescription

El ejemplo envía un archivo comprimido en modo pasivo. Si el servidor soporta FTPS, EnableSsl puede configurarse en $true para agregar cifrado.

6.8 Automatización con Python

La biblioteca estándar ftplib simplifica las subidas y descargas automáticas en scripts de integración:

from ftplib import FTP
from pathlib import Path

archivo = Path("exportaciones/ventas.csv")

with FTP("intranet.local") as ftp:
    ftp.login("deploy", "Secreta123")
    ftp.set_pasv(True)
    with archivo.open("rb") as datos:
        ftp.storbinary(f"STOR {archivo.name}", datos)
    print("Transferencia completa")

Este fragmento habilita el modo pasivo y sube un archivo sin revelar detalles internos de la implementación, lo que favorece la reutilización en entornos de integración continua.

6.9 Recomendaciones finales

Para operar FTP de forma segura conviene restringir usuarios a directorios específicos (chroot), registrar todas las transferencias, habilitar listas de control de IP y desactivar el acceso anónimo. Cuando los requisitos regulatorios exigen cifrado, el paso natural es migrar a SFTP o FTPS, manteniendo la metodología aprendida pero sobre canales protegidos.