Сервер вернул адрес в ответ на команду PASV, которая отличается от адреса, к которому было сделано подключение FTP
-
01-10-2019 - |
Вопрос
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
Другие советы
мой Бог. Что случилось со всеми пандерингом здесь для покупки своих трехсторонних решений вместо того, чтобы информировать вас, чтобы изменить одну строку кода?
Попробуйте переключить пассивную ценность, чтобы увидеть, какие работы:
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-сервер.
- IIS: In Менеджер IIS, открытым FTP> Поддержка FTP Firewall. Отказ См. Раздел Серверы за внешним брандмауэром / NAT в моем руководстве к Установка IIS Server..
- Filezilla FTP-сервер: Перейдите в редактирование> Настройки> Пассивные настройки режима> IPv4 Особый> IP-адрес внешнего сервера для передачи пассивного режима. Отказ Видеть FTP-сервер работает на порту 2000 над NAT, не работающим в пассивном режиме.
- Proftpd: используйте
MasqueradeAddress
директива. - vsftpd:
pasv_address
директива.
Некоторый ответ здесь предлагает использовать активный режим.
request.UsePassive = false;
Но это может помочь только в том случае, если между клиентом и сервером нет брандмауэра / NAT, в этом случае у вас не будет проблем в первую очередь (если сервер действительно не поврежден и сообщает совершенно неверный IP-адрес, а не только внутренний). Или если брандмауэр / NAT настроен для разрешения входящих соединений, что не используется.
Другим подходом используют другую библиотеку FTP, которые могут обработать проблему, игнорируя неверный IP-адрес, сообщаемый сервером, и используя IP-адрес первичного / управления. Или используя EPSV
команда вместо PASV
Команда, которая неявно использует IP-адрес первичного / управления соединением.