FTP NLST 仅在某些客户端计算机上导致“425:无法打开数据连接进行传输”

Posted

技术标签:

【中文标题】FTP NLST 仅在某些客户端计算机上导致“425:无法打开数据连接进行传输”【英文标题】:FTP NLST results in '425: Can't open data connection for transfer' only on some client machines 【发布时间】:2020-03-26 12:53:47 【问题描述】:

我目前正在网络上运行 FileZilla FTP 服务器。我的问题是,在看似随机的机器上,当用户导航到一个目录(他们能够做到)并尝试 ls (即数据传输)时,他们的终端挂起等待响应,而服务器报告这个425: Can't open data connection for transfer 提到多于。此结果因所使用的客户端机器而异,其中一些(本地或远程)能够继续,而另一些则卡在此处。我知道这是因为像CWDing 这样的简单 FTP 命令在 20/21 端口上运行,而 FTP 数据传输在其他一些端口号上运行,而这又可能被链上某处的防火墙阻止。我的问题是,我如何解释这些不同的端口(如果这确实是问题所在),据我所知,它们可能高于 1024?

我对这个项目的最终目标是实现一个非常简单的 FTP 解决方案,最好使用 WinINet,但是,到目前为止,我遇到了同样的问题:

BOOL CWebFileFinder::FindFile(const CString& URL)

    CString ServerName;
    CString strObject;
    INTERNET_PORT nPort;
    DWORD dwServiceType = AFX_INET_SERVICE_FTP;
    if (AfxParseURL(URL, dwServiceType, ServerName, strObject, nPort))
    
        m_Connection = m_Session.GetFtpConnection(ServerName, m_Username, m_Password, nPort/*, true*/);  // results in findfile still failing
        if (m_Connection)
        
            m_Connection->SetCurrentDirectory("sms");  // CDs into this dir
            m_Finder = new CFtpFileFind(m_Connection);
            if (m_Finder)
            
                More = m_Finder->FindFile(_T("*.*"));  // hangs here
            
        
    
    catch (CException* pEx)
    
        CString str;
        LPTSTR error = str.GetBuffer(255);
        pEx->GetErrorMessage(error, 255);
        pEx->Delete();
        str.ReleaseBuffer();
    
    return More;

据我所知,要么我需要在LIST 之前调用以打开此数据端口,要么找到阻止这些端口的防火墙并创建一个规则来防止这种情况(What ports does Wininet listen on for Active FTP data connection?)。当然,我也可以完全脱离基地 - 任何见解都会非常感激!

【问题讨论】:

恰恰相反,使用被动模式(PASV,而不是PORT)。主动模式几乎不起作用。请参阅我的article on FTP modes 了解原因。 – 通常,这不是编程问题。如果要使用 FTP,机器设置必须允许 FTP 网络连接。没有代码可以解决这个问题。 @MartinPrikryl 感谢您的链接,我会看看。当我将 ftp 连接设置为被动(取消注释最后一个 arg)时,用户立即断开连接:> 257 "/" is current directory. > CWD sms > 250 CWD successful. "/sms" is current directory. > TYPE A > 200 Type set to A > PASV > 227 Entering Passive Mode(<server ip address>, 198, 9) > disconnected. 我知道 Windows 命令行使用不支持被动的 ftp 实现,假设 WinINet 使用相同的实现?还是您有其他建议? 没有 WinINet 支持被动模式。 + 您可以使用在同一台机器上运行的任何(GUI)FTP 客户端检索目录列表吗? 是的,FileZilla 客户端列出目录的内容没有问题。我认为这意味着我的代码有问题? 请发布 FileZilla 的详细日志文件。 【参考方案1】:

您的 FTP 服务器似乎需要加密连接 (TLS/SSL)。

WinInet 不支持加密的 FTP。 见C++/Win32 The basics of FTP security and using SSL。

【讨论】:

以上是关于FTP NLST 仅在某些客户端计算机上导致“425:无法打开数据连接进行传输”的主要内容,如果未能解决你的问题,请参考以下文章

MFC 程序仅在某些 Windows 7 32 位计算机上存在运行时错误 R6025,并在其上安装 Visual Studio 后修复

Windows无法使用HTTP,HTTPS或FTP连接到Internet,这可能由于此计算机上的防火墙设置而导致的。

python ftplib.FTP 获取当前路径下所有目录

华为交换机ftp连接拒绝

GetResponse() 仅在我的计算机上慢

尝试保存时 VBA 宏抛出错误(但仅在一台计算机上)