أعاد الخادم عنوانًا استجابةً لأمر PASV الذي يختلف عن العنوان الذي تم إجراء اتصال FTP

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

سؤال

System.net.webexception: أعاد الخادم عنوانًا استجابةً لأمر PASV الذي يختلف عن العنوان الذي تم الاتصال به.
at System.net.ftpwebrequest.checkerror ()
at System.net.ftpwebrequest.syncrequestcallback (Object OBJ)
في system.net.commandstream.abort (استثناء ه)
في system.net.ftpwebrequest.finishRequestStage (مرحلة requestStage)
at 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();
}
هل كانت مفيدة؟

المحلول 2

إذا كان لدى أي شخص نفس المشكلة ، فهذا حل لـ proftpd

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

نصائح أخرى

يا إلهي. ما الأمر مع كل ما يدور هنا لشراء حلول الطرف الثالث بدلاً من إبلاغك بتغيير سطر واحد من التعليمات البرمجية؟

حاول تبديل القيمة السلبية لمعرفة ما الذي يعمل:

    request.UsePassive = false;

قد يعتمد هذا على جدار الحماية بين الآلات (العميل والخادم).

لقد لاحظت إذا ذهبت عبر جدار الحماية الخاص بنا ، ثم أحتاج إلى تركه صحيحًا ، وإلا فإنه سيعيد الاستثناء:

أعاد الخادم البعيد خطأ: (500) خطأ في بناء الجملة ، الأمر غير المعترف به.

ومع ذلك ، إذا كنت وراء جدار الحماية (مثل جهازين متصلان مباشرة ببعضهما البعض داخل مركز البيانات) ، فأنا بحاجة إلى ضبطه على خطأ ، وإلا فإنه سيعيد الاستثناء:

أعاد الخادم عنوانًا استجابةً لأمر PASV الذي يختلف عن العنوان الذي تم إجراء اتصال FTP.

إذا كان هذا يعمل وترغب في جعل الحل الخاص بك أكثر قابلية للتكيف ، فيمكنك لف طلبك في كتلة التجربة باستخدام القيمة الحقيقية الافتراضية ، وإذا حصلت على خطأ 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.

المحلول

التبديل إلى الوضع النشط.

في الوضع النشط ، يتصل خادم FTP بعميل FTP لنقل البيانات. سوف يحل هذه المشكلة ، لكنه ليس ودية جدار الحماية. لن يعمل عندما يتم حظر الاتصالات الواردة (شائعة جدًا).

تجاهل عنوان IP إرسال استجابة لأمر PASV

إذا كان عنوان IP لخادم FTP العام هو عنوان عام ، وعنوان IP الذي يتم إرجاعه كاستجابة لأمر PASV هو من النطاق الخاص (مثل 10. ، 192.168.). في مثل هذه الحالة ، يجب على عميل FTP استخدام عنوان IP العام.

هذا بالضبط ما يفعله Rebex 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