如何使用 Camel FTP 处理“主机尝试数据连接 xxxx 与服务器 yyyy 不同”错误?

Scr*_*ape 2 java ftp apache-camel apache-commons-net

我正在尝试使用 Camel FTP Producer 将文件发送到第三方 ftp 服务器(由亚马逊托管,它会出现),并且遇到了Writing File failed with: File operation failed... Host attempting data connection x.x.x.x is not the same as server y.y.y.y我以前从未见过的问题。

生产者被配置为被动模式,根据TRACE级别的日志,这是启用的。(虽然错误消息听起来更像是与活动模式问题有关)

y.y.y.yIP地址是那些NSLOOKUP目标域上市之一,所以该位才有意义。但是,该x.x.x.xIP 与不同的 Amazon 托管服务器有关,因此我认为已经执行了某种切换或负载平衡,而 FTP 客户端不喜欢那样。

是否有某种方法可以配置 Camel FTP 以允许这样做(我假设这是一个安全功能),还是被动模式应该允许这样做?

我对 ftp 服务器提供商没有影响,所以很遗憾,除了我的客户端选项之外,我无法更改任何内容。

感谢您的关注!

Scr*_*ape 6

在对 Apache Commons FTP 的源代码进行一些挖掘和 grep 之后,有问题的消息是由客户端中的验证引起的,该验证检查被动模式连接是否与初始服务器连接相同。

鉴于这似乎是一个负载平衡系统,被动模式数据连接是与目标 IP 不同的 IP,因此验证失败。

可以使用 Camel FTP 通过创建 FTPClient 的特定实例并将删除验证设置为关闭来修复它。

FTPClient ftp = new FTPClient();
ftp.setRemoteVerificationEnabled(false);
registry.put("FTPClient", ftp);
Run Code Online (Sandbox Code Playgroud)

然后在 FTP 的 URI 中引用此对象

FTPClient ftp = new FTPClient();
ftp.setRemoteVerificationEnabled(false);
registry.put("FTPClient", ftp);
Run Code Online (Sandbox Code Playgroud)

显然,通过禁用此远程验证测试,您会使自己更容易受到被重定向或拦截的 FTP 数据以及您的数据被发送到您不想要的地方的影响,但我想如果您担心自己不会使用首先仍然使用未加密的FTP。