FtpWebRequest使用显式TLS / SSL

时间:2010-09-03 00:14:56

标签: c# .net ftp

我正在尝试通过显式TLS / SSL传输文件。

看起来,高达3.5的.NET中的FtpWebRequest不能正常工作我是否启用了UsePassive。如果它被禁用,我认为有防火墙/路由器配置处理(对于活动模式),一旦应用程序部署在客户端的机器上我没有任何控制,很可能不会立即工作。

但是如果我禁用UserPassive,它将抛出“服务器返回的地址以响应PASV命令,该地址与FTP连接的地址不同。”并根据这个帖子:

The server returned an address in response to the PASV command that is different than the address to which the FTP connection was made

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=97409&wa=wsignin1.0仍无效。

顺便说一句,如果我确切地知道公共IP和内部IP,我有没有办法接受新的内部IP地址,那么它至少会起作用吗?第一个链接让它工作,但我不明白为什么以及他如何管理这样做?什么是myProxyServerIP?我必须有代理服务器吗?

奇怪的是即使我的应用程序无法通过ftp下载文件或listdirectory,但它会成功删除服务器中的文件并提供成功代码?我猜它我的应用程序只能传递/发送控制/命令代码到ftp服务器但是 从服务器通过其他端口获取数据有困难吗?

1 个答案:

答案 0 :(得分:3)

有多个问题,让我们尝试逐一解决:

为什么删除有效但上传,下载和列表没有?

FTP协议使用两个单独的连接。第一个(称为控制连接)用于具有简单响应的命令 - 例如登录,删除,生成目录等。通常它在端口21上运行。

当FTP客户端请求数据传输操作时,建立另一个连接(称为数据连接)。在活动模式下,FTP服务器连接到客户端,在被动模式下,客户端连接到服务器。如果此连接被防火墙阻止,则数据传输操作将失败。数据传输操作是上传,下载以及目录列表。这就是为什么删除工作,而列表没有。

服务器返回一个地址以响应PASV命令,该命令与FTP连接的地址不同

在被动模式下,FTP会话如下:

client: PASV
(i would like to transfer files. Tell me which port and ip address should I use)

server: 227 Entering Passive Mode (172,16,3,4,204,173)
(ok, use port 52397 on IP address 172.16.3.4.)

client: connects to this IP address/port and starts data transfer.

在具有多个IP地址的FTP服务器上可能会出现问题。我遇到过一些FTP服务器,它们有公共IP地址(比方说1.2.3.4)和私有IP地址(192.168.2.3)。

当FTP客户端连接到公共IP地址(1.2.3.4)并请求数据传输操作服务器指示他使用私有IP地址(192.168.2.3)时。这是不可能的,因为它是NATed。

<强>解决方案

切换到活动模式。

在活动模式下,FTP服务器连接到FTP客户端以进行数据传输。它可以解决这个问题,但不是防火墙友好的。当阻止纪念活动(非常普遍)时,它将无法工作。

忽略IP地址发送作为对PASV命令的响应

如果公共ftp服务器IP地址是公共IP地址,并且作为PASV命令的响应而返回的IP地址来自私有范围(例如10. ,192.168。)。在这种情况下,FTP客户端应使用公共IP地址。

这正是我们Rebex FTP在这种情况下所做的事情。它运作良好(可以关闭此行为)。我不知道FtpWebRequest是否可以采用类似的解决方法。

您可以download trial并检查它是否能解决您的问题。