我在 Google Cloud Platform (GCP) 上有一个 Windows Server 2022 数据中心计算引擎(即 Windows VM)。我在其上安装了 FileZilla Server 1.2.0。当我尝试通过互联网从另一台计算机连接到 ftp 服务器时,它会导致超时错误并且无法检索目录列表。我在另一个非 Google Cloud VM 中完成了完全相同的设置,并且在那里运行良好。所以我认为我必须在当前问题中考虑 GCP。我们稍后将 GCP 称为环境“A”,将非 Google 称为“B”。
通过互联网连接到 A 后,ftp 服务器生成以下日志:
2022-07-28T06:24:41.712Z >> [FTP Session 1 ooo.ooo.ooo.ooo] USER testuser
2022-07-28T06:24:41.712Z << [FTP Session 1 ooo.ooo.ooo.ooo] 331 Please, specify the password.
2022-07-28T06:24:41.721Z >> [FTP Session 1 ooo.ooo.ooo.ooo] PASS ****
2022-07-28T06:24:41.806Z << [FTP Session 1 ooo.ooo.ooo.ooo testuser] 230 Login successful.
2022-07-28T06:24:41.816Z >> [FTP Session 1 ooo.ooo.ooo.ooo testuser] SYST
2022-07-28T06:24:41.816Z << [FTP Session 1 ooo.ooo.ooo.ooo testuser] 215 UNIX emulated by FileZilla.
2022-07-28T06:24:41.838Z >> [FTP Session 1 ooo.ooo.ooo.ooo testuser] FEAT
2022-07-28T06:24:41.838Z << [FTP Session 1 ooo.ooo.ooo.ooo testuser] 211-Features:
2022-07-28T06:24:41.838Z << [FTP Session 1 ooo.ooo.ooo.ooo testuser] 211 End
2022-07-28T06:24:41.848Z >> [FTP Session 1 ooo.ooo.ooo.ooo testuser] PWD
2022-07-28T06:24:41.848Z << [FTP Session 1 ooo.ooo.ooo.ooo testuser] 257 "/" is current directory.
2022-07-28T06:24:41.869Z >> [FTP Session 1 ooo.ooo.ooo.ooo testuser] TYPE I
2022-07-28T06:24:41.869Z << [FTP Session 1 ooo.ooo.ooo.ooo testuser] 200 Type set to I
2022-07-28T06:24:41.880Z >> [FTP Session 1 ooo.ooo.ooo.ooo testuser] PASV
2022-07-28T06:24:41.880Z << [FTP Session 1 ooo.ooo.ooo.ooo testuser] 227 Entering Passive Mode (10,140,0,4,233,55)
2022-07-28T06:24:41.900Z >> [FTP Session 1 ooo.ooo.ooo.ooo testuser] MLSD
2022-07-28T06:24:41.900Z << [FTP Session 1 ooo.ooo.ooo.ooo testuser] 150 About to start data transfer.
其中 ooo.ooo.ooo.ooo 是客户端的公网 IP。此连接最终失败。同时客户端(使用 FileZilla Client)显示的消息为:
Status: Connecting to xxx.xxx.xxx.xxx:21...
Status: Connection established, waiting for welcome message...
Status: Plain FTP is insecure. Please switch to FTP over TLS.
Status: Logged in
Status: Retrieving directory listing...
Status: Server sent passive reply with unroutable address. Using server address instead.
Command: MLSD
Response: 150 About to start data transfer.
Error: Connection timed out after 20 seconds of inactivity
Error: Failed to retrieve directory listing
Status: Disconnected from server
其中 xxx.xxx.xxx.xxx 是 ftp 服务器的公网 IP。从日志中我们可以看到我已经成功登录,所以我们可以放心这不是防火墙问题。我在网上搜索了一整天,但还没有找到解决办法。我找到的最接近的方法是这个这是从这次讨论,但这两个都比较旧了,现在有些关键链接已经无法访问了。从他们那里我了解到问题可能出在服务器日志的这一行:
2022-07-28T06:24:41.880Z << [FTP Session 1 ooo.ooo.ooo.ooo testuser] 227 Entering Passive Mode (10,140,0,4,233,55)
它进入了“私有 IP”的被动模式,这就解释了为什么在客户端我们看到
Status: Server sent passive reply with unroutable address. Using server address instead.
由于客户端通过互联网连接,因此 IP 地址 10.140.0.4 无法路由。正如我上面提到的,我有一个环境 B,其中一切正常,并且我观察到服务器端日志显示它进入了被动模式 (###,###,###,###,...,...),其中 # 是服务器 B 的“公共 IP 地址”!所以问题是,我不知道在 A 中我应该做什么来解决这个问题。这是 GCP Compute Engine 还是 FileZilla Server 本身的问题?
你能帮我提供一些治疗方法吗?非常感谢!
答案1
我想自己回答我的问题。希望这对那些路过并停下来思考的人来说是一种负责任的行为,也对那些正在/将要遇到同样问题的人有所帮助。关键是,如果你在以被动模式运行 FileZilla Server 的计算机上同时拥有公共和内部 IP 地址,那么为了让客户端通过互联网访问服务,必须告诉 FileZilla Server 公共 IP 地址。我上面提到我有一个工作环境 B,结果发现它没有安装内部 IP 地址,所以没有混淆。在 B 中体验很轻松,所以我现在想到我必须在 A 中做一些额外的设置。这可以在官方文档。具体如下图所示,在输入处要填写公网地址。