425 建立连接失败

425 Failed to establish connection

我正在尝试使用 Java 应用程序通过 FTP 下载文件。

可从此网页访问 FTP url:http://professionnels.ign.fr/adminexpress。 更具体地说,我正在尝试下载 this file.

注意: 在工作中,浏览器和我的应用程序使用相同的 HTTP 代理访问互联网。

我正在使用 Apache Commons Net 3.6

这是我的应用程序 FTP 交流的示例。我没能嗅到 Chrome 或 Firefox 的那些。

220 Bienvenue sur le site FTP de L INSTITUT NATIONAL DE L INFORMATION GEOGRAPHIQUE ET FORESTIERE
USER *******
331 Please specify the password.
PASS *******
230 Login successful.
TYPE I
200 Switching to Binary mode.
PASV
227 Entering Passive Mode (192,134,132,16,65,180).
RETR /ADMIN-EXPRESS-COG_2-0__SHP_WM__FRA_2019-05-20.7z.001
425 Failed to establish connection.

tl;dr

It turned out that the HTTP proxy at my work already handles all the FTP exchanges. This is why Firefox and Chrome could download the file. When they aren't behind an HTTP proxy, it seems they act as an FTP client by sending FTP commands directly.

A simple HTTP GET request to the HTTP proxy with the ftp url is enough to download the file.

Here is a sum up of solutions I found during my investigations:

  • Use passive mode (PASV command)
  • Check if there's an FTP proxy to use rather than an HTTP Proxy
  • Check the configuration of the FTP server (if you have access to it)
  • Check the configuration of the HTTP proxy (if you have access to it)


准确地说,浏览器执行一个简单的 HTTP 请求,如下所述:

GET ftp://user:passw0rd@example.com/file.ext HTTP/1.1
Host: example.com
User-Agent: WebBrowser-UA/x.y.z
...

然后 HTTP 代理解析 FTP url 并连接到 FTP 服务器。 HTTP 代理 returns 文件内容作为正常的 HTTP 响应。

HTTP/1.1 200 OK
Last-Modified: Tue, 21 May 2019 11:23:00 GMT
Content-Length: 115545060
Content-Type: octet/stream
Connection: Keep-Alive
Age: 22
Date: Thu, 27 Jun 2019 10:27:09 GMT

(file content here...)

然而,就我而言,HTTP 代理允许我连接到 FTP 服务器并仅在 命令 FTP 通道上进行交换。数据通道似乎在 ACTIVE 或 PASSIVE 模式下被阻塞。

在我的调查过程中,我发现很多人遇到了同样的问题。他们找到的解决方案(当他们找到一个......)不适用于我。以下是所有这些问题中表达的解决方案的总结:

  • 使用被动模式(PASV 命令)
  • 检查是否有 FTP 代理而不是 HTTP 代理
  • 检查 HTTP 代理是否直接处理 FTP 交换
  • 检查 FTP 服务器的配置(如果您可以访问它)
  • 检查 HTTP 代理的配置(如果您有权访问它)

参考文献: