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

Почему для пассивного режима FTP требуется диапазон портов, а не только один порт?

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

FTP-серверы обрабатывают множество одновременно подключенных клиентов через порт 21. Веб-серверы обрабатывают множество одновременно подключенных клиентов через порт 80. И т. Д.

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

Или может?

Мне интересно узнать технические подробности, почему это невозможно или не рекомендуется.

четкое и техническое объяснение проблемы нескольких одновременных FTP-сессий при блокировке порта данных только одним портом - вот то, что мне больше всего интересно знать. Когда это может сработать, когда не сработает, почему не рекомендуется и т. Д.

Это будет дикое предположение, так как я не тестировал его, вы должны попробовать его сами и посмотреть, есть ли другие проблемы, которые я мог пропустить.

я полагаю вы можете ограничить диапазон пассивных портов одним единственным портом. На самом деле вы можете видеть в этот вопрос который на практике используются небольшие диапазоны портов. Теоретически для поддержки нескольких одновременных подключений вам понадобятся всего 4 значения: локальный IP, локальный порт, удаленный IP, удаленный порт быть уникальным. Так вы различаете разные связи.

Если вы заблокируете порт на своем сервере до одного единственного значения, тогда единственной переменной останется порт, используемый клиентом. Это не проблема, если у клиента достаточно большой пул бесплатных эфемерный порты на выбор. Если это не тяжелый NAT, вам не о чем беспокоиться. Имейте в виду, что это будет чисто теоретический материал.: если вы использовали несколько портов на своем сервере, вы можете умножить количество гипотетических одновременных подключений, включив number of ports in range подключений на один порт на стороне клиента. Но на практике этого не произойдет, поскольку я сомневаюсь, что существует какая-либо реализация FTP-клиента, которая поддерживала бы это (потому что это не имеет большого смысла). Кроме того, если клиент должен таким образом использовать свои временные порты и не может просто открыть новый, то у него возникают гораздо более серьезные проблемы. Таким образом, с этой точки зрения вы должны быть в полной безопасности, используя один порт.

Давай подумаем почему одного порта может быть недостаточно.

Прежде всего, я мог бы столкнуться с ситуацией, когда действительно ошибочная реализация FTP-сервера использует только номер локального порта как способ идентификации передачи данных клиента. Еще раз, я не думаю, что какой-нибудь достойный FTPd мог бы это сделать.

Настоящая проблема (да, все вышесказанное можно не рассматривать как серьезное отступление ;-)) в том, что диапазон пассивных портов находится в непривилегированном диапазоне.

Это означает, что ваш выбранный номер порта не зарезервирован как таковой, и вообще любой пользовательский процесс (не требует корень привилегии) ​​может получить его раньше, чем это сделает ваш FTP-сервер. Если у вас есть большой пул портов на выбор, вы просто берете случайный бесплатный. Если вы обязаны использовать только один, и он уже используется, вы не сможете правильно обрабатывать переводы.

Извините, если ответ кажется слишком умозрительным. Если честно, я очень старался найти причину почему вы не должны использовать один порт и, кроме последнего, я не мог придумать никаких веских доказательств против этого. Тем не менее, вы задаете интересный и сложный вопрос.

FTP полагается на два отдельных соединения: одно для потока управления или команд, а второе для передачи файлов данных и другой информации, например списков каталогов. Поток управления передается по традиционному TCP-соединению. Клиент связывается с непривилегированным портом с высоким уровнем доступа и отправляет запрос на соединение на FTP-сервер, который привязан к порту 21. Это соединение используется для передачи команд.

В режиме порта или активном режиме клиент сообщает серверу, какой вторичный непривилегированный порт он будет прослушивать. Затем сервер инициирует соединение для передачи данных с порта 20 на непривилегированный порт, указанный клиентом.

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

Для получения дополнительной информации см .:

http://tools.ietf.org/html/rfc959

РЕДАКТИРОВАТЬ

Что касается привязки сервера к определенному единственному порту, это может быть возможно на некоторых серверах. Например, в vsftpd у вас есть следующие параметры конфигурации.

   pasv_max_port
          The maximum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

   pasv_min_port
          The minimum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

Если вы установите для обоих портов одинаковые значения, например pasv_max_port = 12345, pasv_min_port = 12345, возможно, вы сможете получить то, что вам нужно. Я подозреваю, что это ограничит количество одновременных FTP-сессий, которые сервер будет поддерживать. Пожалуйста, проверьте, чтобы быть уверенным.

FTP-сервер мощь иметь возможность сопоставить подключение порта данных клиента к его подключению к порту управления на основе только исходного IP-адреса, а не на основе используемого номера порта.

Это сломало бы FXP (что может быть неплохо), когда клиент подключается к двум серверам (один в пассивном режиме), а затем после получения информации PORT пассивного сервера передает ее на сервер активного режима в качестве команды PORT, чтобы сервер активного режима подключался к сервер пассивного режима.

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

РЕДАКТИРОВАТЬ: подумал о другой причине, почему FTP-серверы этого не делают: сервер не может различать нескольких пользователей с одним и тем же IP-адресом.

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

Если бы вы каждый раз подключались к одному и тому же порту, сервер не мог бы определить, для какого файла вы подключаетесь. Номер порта служит связующим звеном между запросом передачи в управляющем соединении и соединением для передачи данных.

Если два клиента запросят передачу одновременно, когда сервер принимает соединение на одном порту, сервер не сможет определить, какой файл передать. Конечно, сервер может использовать IP-адрес клиента для принятия решения (на самом деле многие FTP-серверы действительно подтверждают, что IP-адрес клиента соответствует IP-адресу, используемому в управляющем соединении, для безопасности).

Но это не сработает для:

  • Несколько подключений с одного компьютера (большинство FTP-клиентов поддерживают параллельные передачи / очереди).
  • Подключение с разных машин в одной (корпоративной) сети, так как они имеют одинаковый внешний IP.

Смотрите также Повторное использование подключений к данным FTP.

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

Похоже, вы уже знаете об управляющих портах и ​​портах данных, поэтому я сразу перейду к делу. Порты управления по своей природе являются импульсными коммуникациями, как и порт 80 для веб-сайтов. они могут обрабатывать множество разных запросов (не одновременно, но чертовски близко, так как они выполняются очень быстро). с другой стороны, в портах данных происходит волшебство FTP. Если вы ограничиваете себя одним портом данных, за раз происходит только одна передача данных. рассмотрите передачу больших файлов. Когда открыт единственный порт данных, никакие другие данные не могут перемещаться до завершения передачи. Это означает, что во время передачи второй пользователь даже не сможет перечислить содержимое каталога ftp-папки. Конечно, они смогут успешно войти в систему, но их поведение будет таким же, как если бы порты данных были вообще не открыты. Если вас это устраивает, вам отлично подойдет один порт. Имейте в виду, что некоторые ftp-клиенты (я могу сразу придумать 1) по умолчанию устанавливают несколько подключений в рамках одного сеанса для загрузки. Итак, для этого клиента в сценарии с одним портом рассмотрите пакетную передачу 1 большого файла и 4 маленьких файлов.

Клиент инициирует передачу первого большого файла, причем все в порядке. Затем, пока идет передача, запускается второй файл. Никаких кубиков. Потом третий, тоже пшик (технический термин). В итоге журнал должен показать 1 успешную и 4 неудачных передачи. Обходной путь будет заключаться в том, чтобы ограничить клиента одним подключением за сеанс, и вам будет хорошо (при условии, что кто-то еще не встал в дверь в ту самую микросекунду, когда завершится одна передача, а другая еще не началась. )