Módulo pyftpdlib
Crear un Servidor FTP en Python

Para crear un servidor FTP en Python lo primero que hay que hacer es instalar el módulo pyftpdlib. Puedes hacerlo a través de apt o a través de pip:
- apt -
sudo apt install python3-pyftpdlib
- pip -
pip3 install pyftpdlib
Si por algún motivo no puedes instalarlo mediante apt o pip puedes encontrar ayuda o descargar el proyecto pyftpdlib desde su página de GitHub.
Si has descargado el proyecto en GitHub descomprimero y abre un terminal en el directorio donde lo descomprimiste. Instalalo ejecutando los siguientes comandos:
python3 -m pip install pyopenssl
python3 setup.py install
Una vez instalado, vamos a crear un FTPServer
especificando su dirección (IP y Puerto) y su FTPHandler
(que creamos especificando su DummyAuthorizer
y sus passive_ports
).
Observa el siguiente ejemplo:
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
FTP_PORT = 2121
FTP_USER = 'usuario1'
FTP_PASSWORD = 'contraseña1'
FTP_DIRECTORY = '/home/user1/ftpfiles'
def main():
authorizer = DummyAuthorizer()
authorizer.add_user(FTP_USER, FTP_PASSWORD, FTP_DIRECTORY, perm='elr')
handler = FTPHandler
handler.authorizer = authorizer
handler.banner = 'Servidor FTP Listo'
handler.passive_ports = range(60000, 65535)
address = ('', FTP_PORT)
server = FTPServer(address, handler)
server.max_cons = 256
server.max_cons_per_ip = 5
server.serve_forever()
if __name__ == '__main__':
main()
AUTHORIZER - DummyAuthorizer
Lo mas importante a tener en cuenta para personalizar tu servidor es la clase DummyAuthorizer
. En el ejemplo he instanciado un objeto de la clase pyftpdlib.authorizers.DummyAuthorizer
que he identificado como authorizer
.
authorizer = DummyAuthorizer()
El objeto authorizer
tiene un método add_user
que permite definir usuarios autorizados a conectarse al servidor. Cada usuario está definido por:
- Nombre de usuario: Cada usuario se identifica mediante un nombre de usuario.
- Contraseña: Cada usuario tiene su propia contraseña, que evidentemente solo debe conocer el usuario.
- Directorio: Cada usuario tiene acceso a un directorio concreto dentro del sistema de archivos.
- Permisos: El usuario puede tener permisos de lectura y/o escritura en su directorio.
En el ejemplo solamente he creado un usuario con las siguientes propiedades:
- Nombre de usuario:
'usuario1'
- Contraseña:
'contraseña1'
- Directorio:
'/home/user1/ftpfiles'
- Permisos:
'elr'
### PERMISOS
Un usuario puede tener permisos de lectura y/o escritura. Dentro del método add_user
:
- Para otorgar permisos de sólo lectura:
perm = 'elr'
- Para otorgar permisos de lectura y escritura:
perm = 'elradfmw'
Si quieres obtener información mas detallada de como funcionan los permisos puedes consultar la Documentación Oficial de pyftpdlib.
HANDLER - FTPHandler
En el ejemplo he identificado handler = FTPHandler
(observa que handler no es un objeto de la clase FTPHandler, sino una referencia a la clase).
Hay que definir dos propiedades de nuestro handler
:
handler.authorizer = authorizer
- Debemos hacer referencia a nuestroauthorizer
como propiedad de nuestroFTPHandler
handler.passive_ports = range(60000, 65535)
- Puedes especificar otro rango de puertos si así lo deseas.
SERVIDOR - FTPServer
El servidor se implementa a través de la clase FTPServer
. En el ejemplo he instanciado un servidor de la siguiente forma:
server = FTPServer(address, handler)
Siendo address
una tupla en la que el primer elemento es la dirección ip y el segundo el puerto, a través de los cuales se puede conectar con el servidor:
address = ('', FTP_PORT)
Dejamos la dirección ip como una cadena vacía (''
) para permitir la conexión con el servidor a través de cualquier interfaz de red. Previamente habíamos definido FTP_PORT = 2121
.
Definimos, además, el máximo de conexiones así como el máximo de conexiones por dirección ip que el servidor admite:
server.max_cons = 256
`server.max_cons_per_ip = 5`
Finalmente ponemos en marcha nuestro servidor:
server.serve_forever()
HACER EL SERVIDOR ACCESIBLE DESDE INTERNET
Para exponer nuestro servidor FTP al exterior y así poder conectarnos fuera de la red local (a través de Internet) tenemos que tener en cuenta los siguientes puntos:
- Dirección IP Local - Tenemos que conocer la dirección ip local del ordenador donde estamos ejecutando el servidor, y esta dirección debe ser estática.
- Puerto - En el ejemplo utilizé el puerto 2121, ya que el puerto 21, que es el puerto por defecto para conexiones FTP, me daba error.
- Rango de puertos pasivos -
handler.passive_ports = range(60000, 65535)
Tienes que abrir en tu router el Rango de puertos pasivos, y que estos apunten a la Dirección IP Local del ordenador donde se ejecuta tu servidor FTP.
También hay que abrir, en este caso, el Puerto 2121 y que este apunte a la Dirección IP Local del ordenador donde se ejecuta el servidor, pero si quieres que las conexiones se realicen a través del puerto 21 debes configurar un redireccionamiento entre los puertos WAN (21) y LAN (2121).
No entro en mas detalles porque la configuración de cada router es diferente según el fabricante, pero en cualquier caso esto es lo que deberías hacer.
Si has leido hasta aquí espero que este artículo te haya sigo útil. Un saludo!