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

StackOverflow https://stackoverflow.com/questions/2709498

Вопрос

System.net.WebException: сервер вернул адрес в ответ на команду PASV, которая отличается от адреса, к которому было сделано соединение FTP.
в System.net.FTPWebRequest.CheckError ()
в System.net.ftpwebrequest.syncrequestCallback (Объект OBJ)
в system.net.commandstream.abort (исключение E)
в system.net.ftpwebrequest.finishrequeststage (этап запроса)
в system.net.ftpwebrequest.getrequestStream ()
На backupdb.program.ftpuploadfile (String ServerPath, String ServerFile, FileInfo Localfile, NetworkCredential Creds) в D: Projekti backupdb backupdb program.cs: line 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

http://www.proftppd.org/docs/howto/nat.html.

Другие советы

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

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

    request.UsePassive = false;

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

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

Удаленный сервер вернул ошибку: (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.

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

Решение

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

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

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

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

Это именно то, что наше Rebax ftp. делать в такой ситуации. Это хорошо работает (это поведение можно отключить). Его можно даже включить для серверов с несколькими публичными IP-адресами.

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

Ты сможешь скачать пробную версию И проверьте, решает ли это вашу проблему.

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

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

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

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

Как это сделано, это специально для сервера, и вы не говорили нам, какой ваш FTP-сервер.


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

request.UsePassive = false;

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


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top