FTP GCE 上的服务器未连接

FTP server on GCE doesn't connect

我正在尝试 运行 Google Cloud Engine VM 中的 FTP 服务器,但即使在编写了必要的防火墙规则后我也无法连接到它。

我正在 运行通过 python:

连接 FTP 服务器
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
import os
from google.cloud import storage

class MyHandler(FTPHandler):
    def on_file_received(self, file):
        storage_client = storage.Client.from_service_account_json(os.getenv('GCS_WORKER_CREDENTIALS'))
        bucket = storage_client.get_bucket(os.getenv('GCS_BUCKET'))
        blob = bucket.blob(file[5:]) # strip leading /tmp/
        blob.upload_from_filename(file)
        #os.remove(file)

def run_server():
    authorizer = DummyAuthorizer()
    authorizer.add_user(os.getenv('FTP_USER'), os.getenv('FTP_PASSWD'), os.getenv('FTP_PATH'), perm=os.getenv('FTP_PERMISSIONS'))
    handler = MyHandler

    handler.authorizer = authorizer
    handler.masquerade_address = os.getenv('VM_EXTERNAL_IP')
    handler.passive_ports = range(60000, 60999)
    handler.timeout = 300
    handler.banner = 'Welcome to GCP-FTP.'
    handler.max_login_attempts = 3
    handler.use_sendfile = False

    server = FTPServer(("127.0.0.1", os.getenv('FTP_PORT')), handler)
    server.serve_forever()

if __name__=='__main__':
    run_server()

我尝试在端口 21 和 6999 上 运行 FTP,但都给我同样的错误。

当我 运行 服务器一切正常时

root@poc-worker:/home/xxxxxxxxx/etl-cloud# python3 run_ftp_server.py 
[I 2021-06-15 12:55:16] concurrency model: async
[I 2021-06-15 12:55:16] masquerade (NAT) address: 130.211.xxx.xxx
[I 2021-06-15 12:55:16] passive ports: 60000->60998
[I 2021-06-15 12:55:16] >>> starting FTP server on 127.0.0.1:21, pid=1021 <<<

GC 中的网络规则:

Name: ftp-allow
Type: Incoming
Destination: Apply to all
IP: 0.0.0.0/0
tcp: 60000-60999,6999,21
Action: Allow
Priority: 1000
Network: default

当我测试网络规则时,它也向我显示一切都应该没问题,我不确定我在这里做错了什么,任何帮助将不胜感激。

我发现了这里指定的问题:

我将服务器绑定到 127.0.0.1,这只是本地连接,将它绑定到 0.0.0.0 解决了问题

server = FTPServer(("127.0.0.1", os.getenv('FTP_PORT')), handler)

变成

server = FTPServer(("0.0.0.0", os.getenv('FTP_PORT')), handler)