FTP-сервер Python: как поддерживать как безопасный, так и небезопасный

Я могу сделать базовый FTP-сервер, который отвечает на порт 21 (или в этом примере 2121), используя пример из документации:

from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
from pyftpdlib.contrib.authorizers import WindowsAuthorizer

def main():
    authorizer = WindowsAuthorizer()
    # Use Guest user with empty password to handle anonymous sessions.
    # Guest user must be enabled first, empty password set and profile
    # directory specified.
    #authorizer = WindowsAuthorizer(anonymous_user="Guest", anonymous_password="")
    handler = FTPHandler
    handler.authorizer = authorizer
    server = FTPServer(('', 2121), handler)
    server.serve_forever()

if __name__ == "__main__":
    main()

Или я могу сделать тот, который поддерживает TLS (опять же, это пример из документации, за исключением того, что наш защищенный порт FTP - 990, а не 21, как показано в исходном примере кода):

from pyftpdlib.servers import FTPServer
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.contrib.handlers import TLS_FTPHandler


def main():
    authorizer = DummyAuthorizer()
    authorizer.add_user('user', '12345', '.', perm='elradfmw')
    authorizer.add_anonymous('.')
    handler = TLS_FTPHandler
    handler.certfile = 'keycert.pem'
    handler.authorizer = authorizer
    # requires SSL for both control and data channel
    #handler.tls_control_required = True
    #handler.tls_data_required = True
    server = FTPServer(('', 990), handler)
    server.serve_forever()

if __name__ == '__main__':
    main()

Есть ли способ сделать тот, который отвечает на порт 21 (небезопасный) и 990 (защищенный с помощью TLS) в том же сценарии, где они совместно используют диапазон пассивных портов, например:

handler.passive_ports = range(50000, 50051)

Я полагаю, что мог бы написать два сценария, но как это будет работать, если они будут использовать диапазон пассивного порта? Этот диапазон является обязательным, и текущая настройка IIS, которую мы используем, поддерживает как TLS, так и небезопасные соединения. Я хочу использовать pyftpdlib на настроенном сервере, чтобы мы могли выполнять настраиваемую логику для загруженных файлов. Все это прекрасно работает, мне просто нужно понять этот последний момент, и у меня нет опыта в написании FTP-серверов.

1 ответ

Решение

Нет необходимости иметь оба вида серверов внутри одного и того же процесса, но вы можете просто использовать отдельные процессы с одним и тем же passive_ports установка. При создании сокета он просто попытается использовать порт из заданного диапазона, который не используется никаким другим процессом в системе. Таким образом, один серверный процесс будет просто повторять попытку с другим портом, если конкретный сервер уже используется другим серверным процессом.

Другие вопросы по тегам