Módulo pyftpdlib
Crear un Servidor FTP en Python

python-ftp-logo

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:

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:

En el ejemplo solamente he creado un usuario con las siguientes propiedades:


### PERMISOS

Un usuario puede tener permisos de lectura y/o escritura. Dentro del método add_user:

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:


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:

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!