В ответ на команду PASV сервер вернул адрес, отличный от адреса, по которому было установлено FTP-соединение. - PullRequest
4 голосов
/ 25 апреля 2010

System.Net.WebException: сервер возвратил адрес в ответ на команду PASV, который отличается от адреса, с которым было установлено FTP-соединение.
в System.Net.FtpWebRequest.CheckError ()
в System.Net.FtpWebRequest.SyncRequestCallback (Object obj)
в System.Net.CommandStream.Abort (исключение e)
на System.Net.FtpWebRequest.FinishRequestStage (этап RequestStage)
в System.Net.FtpWebRequest.GetRequestStream ()
в BackupDB.Program.FTPUploadFile (String serverPath, String serverFile, FileInfo LocalFile, NetworkCredential Cred) в D: \ PROJEKTI \ BackupDB \ BackupDB \ Program.cs: строка 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();
}

Ответы [ 5 ]

8 голосов
/ 12 октября 2012

OMG.Что здесь со всеми потворствами, когда вы покупаете сторонние решения вместо того, чтобы сообщать вам об изменении одной строки кода?

Попробуйте переключить значение Passive, чтобы увидеть, что работает:

    request.UsePassive = false;

Этоможет зависеть от брандмауэра между машинами (клиентом и сервером).

Я заметил, что если я пройду через наш брандмауэр, мне нужно оставить его на True, в противном случае он выдаст исключение:

Удаленный сервер возвратил ошибку: (500) Синтаксическая ошибка, команда не распознана.

Однако, если я нахожусь за брандмауэром (как две машины, соединяющиеся напрямую друг с другом в пределахдата-центр), тогда мне нужно установить его в False, иначе он выдаст исключение:

Сервер возвратил адрес в ответ на команду PASV, который отличается от адреса, по которому FTPсоединение было установлено.

Если это работает и вы хотите сделать свое решение более адаптируемым, вы можете заключить запрос в блок try-catch using Значение по умолчанию True, и если вы получите ошибку 500, переключите UsePassive на False и попробуйте снова.

3 голосов
/ 10 сентября 2010

В пассивном режиме 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.

Похоже, FTP-сервер с двумя общедоступными IP-адресами (например, 1.2.3.4) возвращает частный IP-адрес в ответ на команду PASV.

Решение

Переключение в активный режим.

В активном режиме FTP-сервер подключается к FTP-клиенту для передачи данных. Это решило бы эту проблему, но не дружественно к брандмауэру. Он не будет работать, когда входящие соединения заблокированы (очень часто).

Игнорирование IP-адреса, отправленного в ответ на команду PASV

Если IP-адрес общедоступного ftp-сервера является общедоступным, а IP-адрес, возвращаемый в качестве ответа для команды PASV, относится к частному диапазону (например, 10., 192.168.). В таком случае клиент FTP должен использовать публичный IP-адрес.

Именно это и делает Rebex FTP в такой ситуации. Работает хорошо (такое поведение можно отключить). Его можно даже включить для серверов с несколькими общедоступными IP-адресами.

Я не знаю, возможен ли подобный обходной путь с FtpWebRequest.

Вы можете загрузить пробную версию и проверить, решает ли она вашу проблему.

3 голосов
/ 27 апреля 2010

, если у кого-то есть такая же проблема, это решение для proftpd

http://www.proftpd.org/docs/howto/NAT.html

2 голосов
/ 23 августа 2013

После долгих раскопок я обнаружил, что единственным способом решения этой проблемы было изменение настроек PASV на сервере.

К счастью, я управляю как клиентскими, так и серверными машинами, поэтому я смог сказать серверу (в моем случае FileZilla) использовать общедоступный IP-адрес, а не частный IP-адрес.

1 голос
/ 26 октября 2017

Ваш FTP-сервер неправильно настроен.

В пассивном режиме сервер сообщает IP-адрес и порт, к которым клиент должен подключиться для передачи данных. Ваш FTP-сервер сообщает свой IP-адрес во внутренней сети, хотя он находится за брандмауэром / NAT. Клиент не может подключиться к этому внутреннему адресу по очевидной причине. Вы должны настроить FTP-сервер так, чтобы он сообщал свой внешний IP-адрес.

Как это делается, зависит от сервера, и вы не сказали нам, какой у вас FTP-сервер.


Некоторые ответы здесь предлагают использовать активный режим.

request.UsePassive = false;

Но это может помочь, только если между клиентом и сервером нет брандмауэра / NAT, и в этом случае у вас не возникнет проблема в первую очередь (если сервер действительно не работает и сообщает о совершенно неправильном IP-адресе, не только внутренний). Или, если брандмауэр / NAT настроен для разрешения входящих подключений, что не является обычным.


Другой подход заключается в использовании другой библиотеки FTP, которая может обойти проблему, игнорируя неверный IP-адрес, сообщенный сервером, и используя IP-адрес основного / управляющего соединения. Или с помощью команды EPSV вместо команды PASV, которая неявно использует IP-адрес основного / управляющего соединения.

...