Le serveur a renvoyé une adresse en réponse à la commande PASV qui est différente de l'adresse à laquelle la connexion a été faite FTP
-
01-10-2019 - |
Question
System.Net.WebException: Le serveur a renvoyé une adresse en réponse à la commande PASV qui est différente de l'adresse à laquelle la connexion FTP a été faite
. à System.Net.FtpWebRequest.CheckError ()
à System.Net.FtpWebRequest.SyncRequestCallback (Object obj)
à System.Net.CommandStream.Abort (Exception e)
à System.Net.FtpWebRequest.FinishRequestStage (stade de RequestStage)
à System.Net.FtpWebRequest.GetRequestStream ()
à BackupDB.Program.FTPUploadFile (String ServerPath, String serverFile, FileInfo FichierLocal, NetworkCredential CRED) en D: \ PROJEKTI \ BackupDB \ BackupDB \ Program.cs: ligne 119
code:
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();
}
La solution 2
si quelqu'un a le même problème, c'est la solution pour proftpd
Autres conseils
omg. Quoi de neuf avec tout le proxénétisme ici pour acheter leurs solutions 3ème partie au lieu de vous informer pour changer une ligne de code?
Essayez la valeur passif basculer pour voir ce qui fonctionne:
request.UsePassive = false;
Cela peut dépendre du pare-feu entre les machines (client et serveur).
Je l'ai remarqué si je passe par notre pare-feu, puis je en ai besoin laissé à vrai, sinon elle retournera l'exception:
Le serveur distant a renvoyé une erreur: (500) Erreur de syntaxe, commande non reconnu.
Cependant, si je suis derrière le pare-feu (comme deux machines se connectant directement à l'autre dans un centre de données), alors je dois le mettre sur False, sinon elle retournera l'exception:
Le serveur a renvoyé une adresse en réponse à la commande PASV qui est différente de l'adresse à laquelle la connexion FTP était fait.
Si cela fonctionne et que vous voulez rendre votre solution plus adaptable, vous pouvez envelopper votre demande dans un bloc try-catch en utilisant la valeur par défaut est vrai, et si vous obtenez l'erreur 500, puis passer UsePassive False et essayer à nouveau .
Dans la conversation FTP en mode passif se présente comme suit:
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.
Il semble que le serveur FTP avec deux adresses IP publique (par exemple 1.2.3.4) renvoie une adresse IP privée en réponse à la commande PASV.
Solution
Passage en mode actif.
Dans Connects serveur FTP en mode actif à client FTP pour les transferts de données. Cela réglerait cette question, mais pas les pare-feux. Il ne fonctionnera pas si les connexions entrantes sont bloquées (très fréquent).
Ignorer envoyer l'adresse IP comme réponse à la commande PASV
Si l'adresse IP du serveur FTP public est public, et l'adresse IP renvoyée en réponse pour la commande PASV est de la gamme privée (par exemple 10., 192,168.). Dans ce cas, le client FTP doit utiliser l'adresse IP publique.
Ceci est exactement ce que notre Rebex FTP faire dans une telle situation. Il fonctionne bien (ce comportement peut être désactivé). Il peut même être activé pour les serveurs avec plusieurs adresses IP publiques.
Je ne sais pas si solution similaire est possible avec FtpWebRequest.
Vous pouvez essai de téléchargement et vérifier si cela résout votre problème .
Après beaucoup de creuser autour, j'ai trouvé la seule façon de résoudre ce problème est de changer les paramètres de PASV sur le serveur.
Heureusement, je contrôle les deux machines client et serveur donc j'ai pu dire au serveur (FileZilla dans mon cas) d'utiliser l'adresse IP publique plutôt que l'adresse IP privée.
Votre serveur FTP est mal configuré.
Dans le mode passif du serveur signale une adresse IP et le port auquel le client doit se connecter à un transfert de données. Votre serveur FTP signale son adresse IP dans un réseau interne, bien qu'il se cache derrière un pare-feu / NAT. Le client ne peut pas se connecter à cette adresse interne pour des raisons évidentes. Vous devez configurer le serveur FTP pour signaler son adresse IP externe.
Comment cela se fait est spécifique au serveur et vous ne nous dit pas, ce que votre serveur FTP est.
- IIS: Gestionnaire des services Internet , ouvrez FTP> FTP support du pare-feu . Voir la section serveurs derrière Pare-feu / NAT externe dans mon guide l'installation d'IIS serveur
- FileZilla Serveur FTP: Allez dans Edition> Paramètres> Paramètres de mode passif> spécifique IPv4> externe Adresse IP du serveur pour les transferts en mode passif . Voir serveur FTP sur Port 2000 sur NAT ne fonctionne pas sur le mode passif .
- ProFTPD. Utilisez
MasqueradeAddress
directive - vsftpd:.
pasv_address
directive
Certaines réponses ici suggèrent d'utiliser le mode actif.
request.UsePassive = false;
Mais cette aide peut que s'il n'y a pas de pare-feu / NAT entre le client et le serveur, auquel cas vous n'aurez pas le problème en premier lieu (à moins que le serveur est vraiment cassé et fait état d'une adresse IP complètement faux, non seulement l'interne). Ou si le pare-feu / NAT est configuré pour autoriser les connexions entrantes, ce qui est pas habituel.
Une autre approche utilise une bibliothèque FTP différent qui peut contourner le problème en ignorant l'adresse IP incorrecte signalée par le serveur et en utilisant l'adresse IP de connexion de contrôle primaire /. Ou en utilisant la commande EPSV
au lieu de commande PASV
qui utilise implicitement l'adresse IP de connexion primaire / contrôle.