可以通过 Filezilla 明确地使用 ftps,但不能通过代码使用

可以通过 Filezilla 明确地使用 ftps,但不能通过代码使用

这最初发布到 StackOverflow,但由于代码有效并且这很可能是网络/防火墙问题,所以我想我会在这里询问。

正如标题所述,我可以通过 FileZilla 客户端从我的服务器连接到另一台机器,但不能通过代码(.Net - FTPWebRequest)连接到另一台机器。

我知道代码很好,因为它可以在另一台机器上运行。我遇到问题的特定机器位于 NAT 后面,但 SA 已打开所有端口以接收来自我们尝试与之通信的主机的流量。

有什么建议吗-我是否遗漏了一些明显的特征?

我从尝试连接中得到的异常是:

"Unable to read data from the transport connection: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond."

并且,我们尝试连接的机器的日志显示:

7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> Connected, sending welcome message...

7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> 220-FileZilla Server version 0.9.32 beta

7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> 220 ftp.xxxxxxxxxx.com

7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> AUTH TLS

7/26/2010 12:40:24 PM - (not logged in) (xx.xx.xxx.xxx)> 234 Using authentication type TLS

7/26/2010 12:41:24 PM - (not logged in) (xx.xx.xxx.xxx)> 421 Login time exceeded. Closing control connection.

7/26/2010 12:41:24 PM - (not logged in) (xx.xx.xxx.xxx)> disconnected.

编辑:我对代码和 filezilla 连接都使用了被动模式。根据要求,以下是代码(在另一台机器上)中成功 ftps 连接的日志(列表):

2010 年 7 月 26 日下午 12:45:03 -(未登录)(xx.xx.xxx.xxx)> 已连接,正在发送欢迎消息...

2010 年 7 月 26 日下午 12:45:03 -(未登录)(xx.xx.xxx.xxx)> 220-FileZilla Server 版本 0.9.32 beta

2010 年 7 月 26 日下午 12:45:03 -(未登录)(xx.xx.xxx.xxx)> 220 ftp.xxxxxxxxxx.com

2010 年 7 月 26 日下午 12:45:03 -(未登录)(xx.xx.xxx.xxx)> AUTH TLS

2010 年 7 月 26 日下午 12:45:04 -(未登录)(xx.xx.xxx.xxx)> 234 使用身份验证类型 TLS

2010 年 7 月 26 日下午 12:45:04 -(未登录)(xx.xx.xxx.xxx)> SSL 连接已建立

2010 年 7 月 26 日下午 12:45:04 -(未登录)(xx.xx.xxx.xxx)> PBSZ 0

2010 年 7 月 26 日下午 12:45:04 -(未登录)(xx.xx.xxx.xxx)> 200 PBSZ=0

2010 年 7 月 26 日下午 12:45:05 -(未登录)(xx.xx.xxx.xxx)> PROT P

2010 年 7 月 26 日下午 12:45:05 -(未登录)(xx.xx.xxx.xxx)> 200 保护级别设置为 P

2010 年 7 月 26 日下午 12:45:05 -(未登录)(xx.xx.xxx.xxx)> USER 用户名

2010 年 7 月 26 日下午 12:45:05 -(未登录)(xx.xx.xxx.xxx)> 331 用户名需要密码

2010 年 7 月 26 日下午 12:45:05 -(未登录)(xx.xx.xxx.xxx)> 通过 xxxxxxxxxx

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> 230 已登录

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> OPTS utf8 on

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> 200 UTF8 模式已启用

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> PWD

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> 257“/”是当前目录。

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> CWD /

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)>250 CWD 成功。“/”是当前目录。

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> 类型 I

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> 200 类型设置为 I

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> PASV

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)>227 进入被动模式 (xx,xx,xxx,xxx,xxx,xxx)

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> 列表

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)>150 连接已接受

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> 已建立数据连接的 SSL 连接

2010 年 7 月 26 日下午 12:45:05 - 用户名 (xx.xx.xxx.xxx)> 226 转移成功

2010 年 7 月 26 日下午 12:46:43 - 用户名 (xx.xx.xxx.xxx) > 已断开连接。

编辑 - 这是使用 FileZilla 客户端从同一台机器成功尝试的日志

2010 年 7 月 28 日上午 10:01:53 -(未登录)(xx.xx.xxx.xxx)> 已连接,发送欢迎消息...

2010 年 7 月 28 日上午 10:01:53 -(未登录)(xx.xx.xxx.xxx)> 220-FileZilla Server 版本 0.9.32 beta

2010 年 7 月 28 日上午 10:01:53 - (未登录) (xx.xx.xxx.xxx)> 220 ftp.xxxxxxxx.com

2010 年 7 月 28 日上午 10:01:53 -(未登录)(xx.xx.xxx.xxx)> SSL 连接已建立

2010 年 7 月 28 日上午 10:01:53 -(未登录)(xx.xx.xxx.xxx)> USER 用户名

2010 年 7 月 28 日上午 10:01:53 -(未登录)(xx.xx.xxx.xxx)> 331 用户名需要密码

2010 年 7 月 28 日上午 10:01:53 -(未登录)(xx.xx.xxx.xxx)> 通过 ********

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> 230 已登录

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> SYST

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> 215 由 FileZilla 模拟的 UNIX

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> FEAT

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> 211-功能:

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> MDTM

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> REST STREAM

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> SIZE

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx) > MLST 类型*;大小*;修改*;

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> MLSD

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> AUTH SSL

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> AUTH TLS

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> UTF8

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> CLNT

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> MFMT

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> 211 结束

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> PBSZ 0

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> 200 PBSZ=0

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> PROT P

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)>200 保护级别设置为 P

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> PWD

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> 257“/”是当前目录。

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> 类型 I

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> 200 类型设置为 I

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> PASV

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)>227 进入被动模式 (xx,xx,xxx,xxx,xxx,xxx)

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> MLSD

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)>150 连接已接受

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> 已建立数据连接的 SSL 连接

2010 年 7 月 28 日上午 10:01:53 - 用户名 (xx.xx.xxx.xxx)> 226 转移成功

2010 年 7 月 28 日上午 10:02:18 - 用户名 (xx.xx.xxx.xxx) > 已断开连接。

答案1

处理这些类型的问题可能很困难,因为日志通常只能告诉您正在发生的事情的一部分。

此时最好的办法是使用数据包捕获和分析软件(比如最优秀且免费的wireshark) 来查看线路上到底发生了什么。

确保捕获您的计算机与远程系统之间的所有流量,并尝试查看工作连接和代码之间的差异。这可能会提示问题所在。

请特别注意 TLS 连接的协商方式,因为它可能会指出实际问题(有一篇非常好且简单易懂的文档,可在以下位置找到IBM 的)。 例如:

  • 如果交换证书后连接中断,则表明其中一方无法验证另一方的证书。这是 TLS 软件的一个相当常见的问题来源,尤其是在使用自签名证书或私有根证书时。
  • 如果在握手的第一阶段就断开连接,则可能是因为客户端和服务器无法就使用哪种协议达成一致(通常是因为其中一方将自己限制为使用另一方不支持的“安全”协议)。
  • 如果服务器设置了“需要客户端证书”标志,那么可能是您尚未设置用于身份验证的客户端证书。
  • (ETC)

如果您看到 TLS 通道已成功协商,那么您将不得不拿出大招:获取服务器的私钥并解码 TLS 流量。但是,这只有在 TLS 连接不使用DH 密钥交换因此首先,在您的服务器或客户端上禁用该功能。

一旦 DH 被停用并且您拥有私钥,您就可以按照 Wireshark 上的说明进行操作有关 SSL/TLS 的维基页面详细解释了这个过程,或者这个博客文章这也许更容易理解一些。

答案2

我是否错过了一些显而易见的事情

您可能会错误地认为只有一种方式可以连接到 ftp 服务器,并因此假设您的代码正在执行与 FileZilla 客户端相同的操作。

当未连接时,显示日志。您需要将其与成功连接的日志进行比较,以查看客户端如何连接。(它可能未使用 AUTH TLS,或者可能使用被动模式等)

另外,我对 FileZilla 一无所知,但该配置(即 FTP、TLS 和 NAT)可能会导致问题,以至于一些 FTP 服务器将自己描述为 NAT 友好型。

相关内容