El servidor devuelve una dirección en respuesta al comando PASV que es diferente a la dirección a la que se realizó la conexión FTP

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

Pregunta

  

System.NET.WebException: El servidor devuelve una dirección en respuesta al comando PASV que es diferente a la dirección a la que se realizó la conexión FTP
.      en System.Net.FtpWebRequest.CheckError ()
     en System.Net.FtpWebRequest.SyncRequestCallback (Object obj)
     en System.Net.CommandStream.Abort (Exception e)
     en System.Net.FtpWebRequest.FinishRequestStage (etapa RequestStage)
     en System.Net.FtpWebRequest.GetRequestStream ()
     en BackupDB.Program.FTPUploadFile (String ServerPath, Cadena serverFile, FileInfo archivoLocal, NetworkCredential CRED) en D: \ PROJEKTI \ BackupDB \ BackupDB \ Program.cs: línea 119

código:

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();
}
¿Fue útil?

Solución 2

si alguien tiene el mismo problema, esta es la solución para proftpd

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

Otros consejos

OMG. ¿Qué pasa con todo el proxenetismo aquí para comprar sus soluciones de 3 ª parte en lugar de que le informa de cambiar una línea de código?

Trate de alternar el valor pasivo para ver cuál funciona:

    request.UsePassive = false;

Esto puede depender del servidor de seguridad entre las máquinas (cliente y servidor).

Me he dado cuenta de si voy a través de nuestro servidor de seguridad, entonces necesito que la izquierda en verdad, de lo contrario, devolverá el Excepción:

  

El servidor remoto devolvió un error: (500) de error de sintaxis, comando   no reconocido.

Sin embargo, si estoy detrás del firewall (como dos equipos que se conectan directamente entre sí dentro de un centro de datos), entonces tengo que ponerlo en falso, de lo contrario, devolverá el Excepción:

  

El servidor devuelve una dirección en respuesta al comando PASV que es diferente a la dirección a la que fue la conexión FTP   hecho.

Si esto funciona y que desea hacer la solución más adaptable, que podrían envolver su petición en un bloque try-catch usando el verdadero valor por defecto, y si se obtiene el error 500, a continuación, cambiar UsePassive en False y vuelva a intentarlo .

En el modo pasivo FTP conversación es la siguiente:

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.

Parece que el servidor FTP con dos direcciones IP pública (por ejemplo, 1.2.3.4) devuelve una dirección IP privada como respuesta a comandos PASV.

Solución

El cambio al modo activo.

Conexiones de servidor FTP en modo activo a cliente FTP para la transferencia de datos. Sería resolver este problema, pero no es amigable cortafuegos. No va a funcionar cuando se bloquean las conexiones entrantes (muy común).

Haciendo caso omiso de enviar dirección IP como respuesta a comandos PASV

Si la dirección IP del servidor FTP público es público, y la dirección IP devuelta como una respuesta para el comando PASV es de rango privado (por ejemplo, 10., 192.168.). En tal caso, el cliente FTP debe usar la dirección IP pública.

Esto es exactamente lo que hace nuestra Rebex FTP hacer en tal situación. Funciona bien (este comportamiento se puede desactivar). Se puede incluso encendido para servidores con múltiples direcciones IP públicas.

No sé si la solución es posible con similares FtpWebRequest.

Puede descarga de prueba y compruebe si resuelve su problema .

Después de una gran cantidad de excavar alrededor me pareció que la única manera de resolver este problema era cambiar la configuración PASV en el servidor.

Afortunadamente controlar tanto el cliente y el servidor, así que era capaz de indicar al servidor (FileZilla en mi caso) para usar la IP pública en lugar de la IP privada.

El servidor FTP está mal configurado.

En el modo pasivo el servidor informa de una dirección IP y el puerto al que el cliente debe conectarse a una transferencia de datos. Su servidor FTP informa de su dirección IP dentro de una red interna, a pesar de que está detrás de un cortafuegos / NAT. El cliente no puede conectarse a la dirección interna por razones obvias. Tiene que configurar el servidor FTP para informar de su dirección IP externa.

¿Cómo se hace eso es el servidor específico y que no nos ha dicho, lo que es su servidor FTP.


Algunas respuesta aquí sugerimos usar el modo activo.

request.UsePassive = false;

Pero eso puede ayudar sólo si no hay cortafuegos / NAT entre el cliente y el servidor, en cuyo caso no tendrá el problema en el primer lugar (a menos que el servidor está muy roto y reporta una dirección IP completamente equivocado, no sólo la interna). O si el cortafuegos / NAT está configurado para permitir las conexiones entrantes, lo que no es habitual.


Otro enfoque utiliza una biblioteca de FTP diferente que puede solucionar el problema haciendo caso omiso de la dirección IP incorrecta reportado por el servidor y utilizando la dirección IP de conexión de control / primaria. O utilizando el comando EPSV en lugar de comando PASV que utiliza implícitamente la dirección de conexión / IP control primario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top