Как получить доступ к FTPS-серверу pyftpdlib в Amazon EC2?

Я пытаюсь создать простой FTPS-сервер на своем экземпляре Ubuntu Amazon EC2, используя библиотеку Python pyftpdlib.

Вот код прямо из документации:

#!/usr/bin/env python

"""
An RFC-4217 asynchronous FTPS server supporting both SSL and TLS.
Requires PyOpenSSL module (http://pypi.python.org/pypi/pyOpenSSL).
"""

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


def main():
    authorizer = DummyAuthorizer()
    authorizer.add_user('ubuntu', '*****', os.getcwd(), perm='elradfmw')
    authorizer.add_anonymous('.')
    handler = TLS_FTPHandler
    handler.certfile = 'keycert.pem'
    handler.authorizer = authorizer
    handler.masquerade_address = '52.23.244.142'
    # requires SSL for both control and data channel
    handler.tls_control_required = True
    handler.tls_data_required = True
    handler.passive_ports = range(60000, 60099)
    server = FTPServer(('', 21), handler)
    server.serve_forever()

if __name__ == '__main__':
    main()

Когда я запускаю скрипт на своем экземпляре Amazon EC2 и пытаюсь подключиться удаленно с помощью FileZilla, я получаю:

Status: Connecting to 52.23.244.142:21...
Status: Connection established, waiting for welcome message...
Response:   220 pyftpdlib 1.4.0 ready.
Command:    AUTH TLS
Response:   234 AUTH TLS successful.
Status: Initializing TLS...
Status: Verifying certificate...
Command:    USER ubuntu
Status: TLS/SSL connection established.
Response:   331 Username ok, send password.
Command:    PASS *****
Response:   230 Login successful.
Command:    OPTS UTF8 ON
Response:   501 Invalid argument.
Command:    PBSZ 0
Response:   200 PBSZ=0 successful.
Command:    PROT P
Response:   200 Protection set to Private
Command:    OPTS MLST type;perm;size;modify;unix.mode;unix.uid;unix.gid;
Response:   200 MLST OPTS type;perm;size;modify;unix.mode;unix.uid;unix.gid;
Status: Connected
Status: Retrieving directory listing...
Command:    PWD
Response:   257 "/" is the current directory.
Command:    TYPE I
Response:   200 Type set to: Binary.
Command:    PASV
Response:   227 Entering passive mode (52,23,244,142,174,172).
Command:    MLSD
Response:   150 File status okay. About to open data connection.
Error:  Connection timed out
Error:  Failed to retrieve directory listing

Я думаю, что что-то упустил. Могу ли я получить помощь?

1 ответ

Решение
  1. Ваш сервер должен представить свой внешний IP-адрес в ответ на PASV команда. Вместо этого вы указываете внутренний IP-адрес в частной сети EC2, к которому FileZilla явно не может подключиться.

    Хотя FileZilla может обойти это:

    Сервер отправил пассивный ответ с неуправляемым адресом. Вместо этого используйте адрес сервера.

    другие клиенты FTP (такие как командная строка Windows ftp.exe) не могу.

    Использовать handler.masquerade_address настроить внешний IP-адрес:

    handler.masquerade_address = '52.23.244.142'
    
  2. FileZilla не может подключиться к порту 50048 (195 << 8 + 128). Возможно, вы не открыли порты в диапазоне портов пассивного режима FTP в брандмауэре EC2.

    См. Настройка FTP на Amazon Cloud Server (в частности, раздел "Шаг № 2: Откройте порты FTP на вашем экземпляре EC2" в лучшем ответе).

    Чтобы не открывать весь непривилегированный диапазон портов, ограничьте FTP-сервер использованием меньшего диапазона портов, используя handler.passive_ports:

    handler.passive_ports = range(60000, 60099)
    

Для получения общей информации см. Мою статью о настройке сети в отношении пассивного (и активного) режима FTP-соединения.

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