Назад | Перейти на главную страницу

FTP Активный против пассивного режима

У меня есть FTP-сервер, и во время тестирования я обнаружил странную проблему, которую не понимаю. Я отправляю команду RETR для файла "/Folder1/file.txt", и он работает нормально. Затем я отправляю команду RETR для файла "/Folder1/SubFolder1/file.txt", и время ожидания передачи данных клиенту истекает. Это было в активном режиме. Когда я перехожу в пассивный режим, он работает нормально.

Я понимаю разницу между этими двумя режимами, но не понимаю, почему он работал для одного файла в активном режиме, а для другого - нет. Я пробовал десяток раз и все равно получил те же результаты.

Любые идеи? Спасибо!

Если вы проверите официальная спецификация протокола передачи файлов, вы обнаружите, что:

FTP может работать в активном или пассивном режиме, которые определяют способ открытия второго соединения. В активном режиме клиент отправляет серверу номер порта IP-адреса, который клиент будет использовать для передачи данных, и сервер открывает соединение. Пассивный режим был разработан для использования там, где клиент находится за брандмауэром и не может принимать входящие TCP-соединения. Сервер отправляет клиенту IP-адрес и номер порта, и клиент открывает соединение с сервером. Оба режима были обновлены в сентябре 1998 года, чтобы добавить поддержку IPv6 и внести некоторые другие изменения в пассивный режим, сделав его расширенным пассивным режимом.

Итак, моя первая мысль заключается в том, что что-то не так с разрешениями вашей папки. Дважды проверьте их.

Я предполагаю, что первый файл был достаточно мал, чтобы его можно было передавать по тому же соединению, но второй файл был больше.

Хотя вряд ли в этом случае другое мыслимый Проблема может быть в межсетевом экране вашего клиента. Активный FTP требует, чтобы клиент открыл TCP-порт, к которому сервер подключается для передачи файлов.

Возможно, что брандмауэр клиента имеет один доступный расширенный порт, но не более того, поэтому первый файл разрешен через этот первый порт, а не через какие-либо другие расширенные порты (клиенты склонны выделять порты TCP постепенно).

Теперь с пассивный FTP сервер выделяет TCP-порты для передачи, и клиент подключается к серверу. В этом случае брандмауэр клиента больше не может вызывать особых проблем, потому что клиент подключается к внешний мир (брандмауэры защищают внешний мир от подключения к брандмауэру).

Почти всегда я обнаруживаю, что переключение из неработающего активного режима в рабочий пассивный режим указывает на проблемы с брандмауэром.

А теперь диаграмма:


Active FTP

  client:n ---RETR portnum1---> server:21
  client:portnum1 <---fetches-- server:m1

  client:n ---RETR portnum2---> server:21
  client:portnum2 <---fetches-- server:m2

Passive FTP

  client:n ---PASV request----> server:21
  client:n <--PORT portnum1---- server:21
  client:n2 --fetches---------> server:portnum1

  client:n ---PASV request----> server:21
  client:n <--PORT portnum2---- server:21
  client:n3 --fetches---------> server:portnum2

Обратите внимание, что порт 21 - это команда канал. Именно сюда отправляются инструкции. Остальные порты используются для фактической передачи данных.