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.
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.
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.
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:
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.
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.
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.
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.
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.
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.
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.