خطای Failed to retrieve directory listing در فایل زیلا
خطای Failed to retrieve directory listing در فایلزیلا تقریباً همیشه یک مشکل حالت انتقال داده (Active در برابر Passive) است، نه اشتباه بودن نام کاربری و رمز عبور؛ ورود انجام شده اما کانال داده بسته است. راهحل درست این است که حالت انتقال را روی Passive بگذارید، رمزگذاری را روی TLS نگه دارید و در سمت سرور بازه پورت پسیو را در فایروال باز کنید.
Error: Connection timed out after 20 seconds of inactivity Error: Failed to retrieve directory listing
این خطا دقیقاً یعنی چه
پروتکل FTP بر خلاف اغلب پروتکلهای امروزی از دو اتصال جداگانه استفاده میکند: یک کانال فرمان روی پورت 21 که نام کاربری، رمز و دستوراتی مثل LIST از آن عبور میکند، و یک کانال داده که محتوای فهرست پوشهها و خود فایلها را جابهجا میکند. وقتی در لاگ فایلزیلا میبینید ورود موفق بوده (230 Login successful) ولی بلافاصله بعد از LIST کار متوقف میشود، یعنی کانال فرمان سالم است و فقط کانال داده برقرار نشده است. به همین دلیل تغییر دادن رمز عبور یا ساختن کاربر FTP جدید معمولاً هیچ تأثیری ندارد.
در سرویسهایی مانند هاست لینوکس ایران که کنترلپنل و سرویس FTP از پیش پیکربندی شدهاند، سهم بزرگی از این خطاها از سمت شبکه کاربر یا تنظیمات خود نرمافزار میآید، نه از سرور.
تفاوت Active و Passive و اینکه چرا Passive درست است
در حالت Active کلاینت یک پورت باز میکند و به سرور میگوید «به این پورت من وصل شو». یعنی سرور باید یک اتصال ورودی به سمت کامپیوتر شما بزند. اگر پشت مودم، روتر، NAT، فایروال ویندوز یا شبکه سازمانی باشید — که تقریباً همهی کاربران خانگی و اداری هستند — این اتصال ورودی مسدود میشود و نتیجهاش دقیقاً همین خطاست.
در حالت Passive برعکس عمل میشود: سرور یک پورت تصادفی از بازهی مشخص خود را اعلام میکند و کلاینت به آن وصل میشود. چون هر دو اتصال از سمت شما به بیرون برقرار میشود، NAT مشکلی ایجاد نمیکند. به همین دلیل Passive حالت پیشفرض و توصیهشده است و نسخههای امروزی فایلزیلا هم بهصورت پیشفرض روی Passive تنظیم شدهاند.
توجه داشته باشید که راهنماهای قدیمی (از جمله نسخهی پیشین همین مطلب) پیشنهاد میکردند حالت را روی Active بگذارید؛ این توصیه امروز نادرست است و فقط در شبکههای خاصی که خروجی به پورتهای بالای سرور بسته است بهعنوان آخرین چاره امتحان میشود.
تنظیم درست اتصال در فایلزیلا
نرمافزار فایلزیلا را اجرا کنید و از منوی File وارد Site Manager شوید.
روی New Site کلیک کنید تا یک اتصال تازه ساخته شود.
- Host: آدرس IP سرور یا نام دامنهی هاست.
- Port: برای FTP خالی بگذارید تا پورت
21استفاده شود؛ برای SFTP عدد22را وارد کنید. - Encryption: گزینهی Require explicit FTP over TLS را انتخاب کنید. گزینهی Only use plain FTP نام کاربری و رمز شما را بدون رمزگذاری روی شبکه میفرستد و نباید انتخاب شود.
- Logon Type: روی Normal.
- User و Password: نام کاربری کنترلپنل یا همان کاربری که در بخش FTP Accounts ساختهاید.
سپس به تب Transfer Settings بروید و Transfer Mode را روی Passive بگذارید و Connect را بزنید. اگر حجم انتقال بالاست و سرویس شما مثل هاست دانلود برای فایلهای سنگین استفاده میشود، تعداد اتصالهای همزمان را با تیک Limit number of simultaneous connections محدود کنید تا سرور اتصالهای اضافی را رد نکند.
اگر Passive هم جواب نداد: بازه پورت پسیو و فایروال
حالت Passive فقط وقتی کار میکند که سرور یک بازهی مشخص پورت داشته باشد و آن بازه در فایروال باز باشد. اگر مدیر سرور خودتان هستید، این موارد را بررسی کنید (در سرور مجازی مدیریتشده ایران نصب و پیکربندی کنترلپنل و عیبیابی نرمافزارهای نصبشده بر عهدهی تیم فنی آنلاین سرور است و این کارها را خودتان انجام نمیدهید):
- در Pure-FTPd دستورالعمل
PassivePortRange، در ProFTPDPassivePortsو در vsftpd زوجpasv_min_portوpasv_max_portباید تعریف شده باشند. - همان بازه بهعلاوهی پورت
21باید در فایروال (مثلاً CSF یاfirewalld) در ورودی باز باشد. - اگر سرور پشت NAT است، IP عمومی باید با
MasqueradeAddressدر ProFTPD یاpasv_addressدر vsftpd اعلام شود؛ وگرنه سرور یک IP داخلی به کلاینت میدهد و اتصال داده شکست میخورد. - ماژولهای بازرسی FTP در آنتیویروس و فایروال ویندوز را موقتاً غیرفعال کنید؛ این ماژولها با FTP رمزگذاریشده سازگار نیستند.
- در فایلزیلا از مسیر Edit ← Settings ← Connection مقدار Timeout را از
20به60ثانیه افزایش دهید تا روی خطوط کند خطا زودتر از موعد ثبت نشود.
پیام گواهی TLS را رد نکنید
بعد از فعال کردن رمزگذاری، فایلزیلا یک پنجرهی Unknown certificate نشان میدهد. این طبیعی است، چون بسیاری از سرورها برای سرویس FTP از گواهی خودامضا استفاده میکنند. نام میزبان و اثر انگشت (fingerprint) را با آنچه هاست به شما داده مقایسه کنید و اگر درست بود گزینهی Always trust certificate in future sessions را تیک بزنید. بستن این پنجره بدون تأیید، خودش باعث قطع شدن نشست و همان خطای عدم دریافت فهرست میشود.
راهحل ریشهای: به جای FTP از SFTP استفاده کنید
FTP یک پروتکل دههی هفتاد میلادی است و مشکل Active/Passive ذاتی طراحی آن است. SFTP که روی SSH کار میکند همهچیز را از یک اتصال روی پورت 22 عبور میدهد؛ نه کانال دادهی جداگانهای دارد، نه بازه پورت پسیو میخواهد و نه با NAT درگیر میشود. در فایلزیلا کافی است در Site Manager گزینهی Protocol را روی SFTP - SSH File Transfer Protocol بگذارید.
دقت کنید SFTP با FTPS یکی نیست؛ FTPS همان FTP قدیمی با یک لایه TLS است و همچنان همان دردسر پورت داده را دارد. دسترسی SSH روی همهی سرویسهای اشتراکی فعال نیست و بسته به نوع سرویس فرق میکند، پس اگر مطمئن نیستید سرویس شما SSH دارد یا برای باز کردن بازه پورت پسیو به کمک نیاز دارید، با کارشناسان پشتیبانی تماس بگیرید تا تنظیمات سمت سرور را بررسی کنند.
چکلیست سریع
- Transfer Mode روی Passive باشد.
- Encryption روی Require explicit FTP over TLS باشد، نه plain FTP.
- گواهی نمایشدادهشده را تأیید کنید.
- آنتیویروس و فایروال محلی را یک بار موقتاً کنار بگذارید.
- در سمت سرور بازه پورت پسیو تعریف و در فایروال باز شده باشد.
- در صورت امکان کلاً به SFTP روی پورت
22مهاجرت کنید.
