这最初发布到 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 友好型。