服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同
-
01-10-2019 - |
题
系统.Net.Web异常:服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同。
在 System.Net.FtpWebRequest.CheckError()
在 System.Net.FtpWebRequest.SyncRequestCallback(对象 obj)
在 System.Net.CommandStream.Abort(异常 e)
在 System.Net.FtpWebRequest.FinishRequestStage(RequestStage 阶段)
在 System.Net.FtpWebRequest.GetRequestStream()
在 D:\PROJEKTI\BackupDB\BackupDB\Program.cs 中的 BackupDB.Program.FTPUploadFile(String serverPath、String serverFile、FileInfo LocalFile、NetworkCredential Cred):第 119 行
代码:
FTPMakeDir(new Uri(serverPath + "/"), Cred);
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath+serverFile);
request.UsePassive = true;
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = Cred;
byte[] buffer = new byte[10240]; // Read/write 10kb
using (FileStream sourceStream = new FileStream(
LocalFile.ToString(), FileMode.Open))
{
using (Stream requestStream = request.GetRequestStream())
{
int bytesRead;
do
{
bytesRead = sourceStream.Read(buffer, 0, buffer.Length);
requestStream.Write(buffer, 0, bytesRead);
} while (bytesRead > 0);
}
response = (FtpWebResponse)request.GetResponse();
response.Close();
}
解决方案 2
如果有人遇到相同的问题,这是proftpd的解决方案
其他提示
我的天啊。这里的所有panding都在购买他们的第三方解决方案,而不是通知您更改一行代码?
尝试切换被动值以查看哪个有效:
request.UsePassive = false;
这可能取决于机器(客户端和服务器)之间的防火墙。
我注意到如果我通过我们的防火墙,我需要将其留在True,否则会返回例外:
远程服务器返回一个错误:(500)语法错误,命令未识别。
但是,如果我在防火墙后面(就像两台在数据中心内直接连接的机器),那么我需要将其设置为false,否则它将返回异常:
该服务器返回了对PASV命令的地址,该地址与建立FTP连接的地址不同。
如果这起作用,并且要使解决方案更加适应性,则可以使用默认的真实值将请求包装在try-catch块中,并且如果收到500错误,请切换使用false,然后重试。
在被动模式下,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地址(例如1.2.3.4)的FTP服务器返回一个专用IP地址作为对PASV命令的响应。
解决方案
切换到活动模式。
在活动模式下,FTP服务器连接到FTP客户端以进行数据传输。它将解决这个问题,但不友好。当传入连接被阻止(非常常见)时,它将无法工作。
忽略IP地址作为对PASV命令的响应
如果公共FTP服务器IP地址是公共地址,并且作为PASV命令的响应返回的IP地址来自私人范围(例如10.,192.168。)。在这种情况下,FTP客户端应使用公共IP地址。
这正是我们的 Rebex FTP 在这种情况下做。它运行良好(可以关闭此行为)。它甚至可以打开具有多个公共IP地址的服务器。
我不知道FTPWebrequest是否可以使用类似的解决方法。
你可以 下载试用版 并检查它是否解决了您的问题。
经过大量研究后,我发现解决此问题的唯一方法是更改服务器上的 PASV 设置。
幸运的是,我控制了客户端和服务器计算机,因此我能够告诉服务器(在我的例子中是 FileZilla)使用公共 IP 而不是私有 IP。
您的FTP服务器被错误配置。
在被动模式下,服务器报告了客户端应连接到数据传输的IP地址和端口。您的FTP服务器在内部网络中报告其IP地址,尽管它是防火墙/NAT的后面。客户由于明显的原因无法连接到该内部地址。您必须配置FTP服务器以报告其外部IP地址。
这是如何完成服务器特定的,您没有告诉我们您的FTP服务器是什么。
- II:IN IIS经理, , 打开 FTP> FTP防火墙支持. 。请参阅部分 外部防火墙/NAT后面的服务器 在我的指南中 安装IIS服务器.
- Filezilla FTP服务器: 转到编辑>设置>被动模式设置> IPv4特定>被动模式传输的外部服务器IP地址. 。看 在端口2000上运行的FTP服务器,NAT无法在被动模式下工作.
- proftpd:使用
MasqueradeAddress
指示. - VSFTPD:
pasv_address
指示.
这里有一些答案建议使用活动模式。
request.UsePassive = false;
但是,只有在客户端和服务器之间没有防火墙/NAT时,才能有所帮助,在这种情况下,您首先不会出现问题(除非服务器真的被打破并报告完全错误的IP地址,而不仅仅是内部)。或者,如果配置了防火墙/NAT以允许入站连接,则不是通常的。
另一种方法是使用不同的FTP库,该库可以通过忽略服务器报告的不正确的IP地址和使用主/控制连接IP地址来解决问题。或使用 EPSV
命令而不是 PASV
隐式使用主/控制连接IP地址的命令。