Я изо всех сил пытаюсь понять, почему все FTP-серверы требуют использования диапазона портов для каналов данных пассивного режима, а не только использования одного порта данных для всех входящих соединений канала данных.
FTP-серверы обрабатывают много одновременно подключенных клиентов через порт 21. Веб-серверы обрабатывают много одновременно подключенных клиентов через порт 80. И т. Д.
Тогда почему FTP-сервер не может использовать только один порт канала данных для всех входящих пассивных подключений к данным (и при этом может обрабатывать множество одновременно подключенных клиентов на этом порту, скажем, порт 1024)?
Или это может?
Мне интересно знать технические детали, почему это невозможно или не рекомендуется.
Ответы:
Это будет дикое предположение, так как я не проверял это, вы должны попробовать это сами и посмотреть, есть ли другие проблемы, которые я мог пропустить.
Я полагаю, вы можете ограничить диапазон пассивных портов одним портом . На самом деле вы можете видеть в этом вопросе, что небольшие диапазоны портов используются на практике . Теоретически, для поддержки нескольких одновременных подключений вам нужно только 4 значения: локальный IP, локальный порт, удаленный IP, удаленный порт, чтобы быть уникальным. Вот как вы различаете разные связи.
Если вы заблокируете порт на вашем сервере на одно единственное значение, то единственной переменной останется порт, используемый клиентом. Это не проблема, если у клиента достаточно большой пул свободных временных портов для выбора. Если он не делает какой-то тяжелый NAT, вам не нужно беспокоиться об этом. Имейте в виду , что это будет чисто теоретический материал : если вы используете несколько портов на своем сервере, вы можете умножить число гипотетических одновременных подключений, включив
number of ports in range
соединения на один порт на стороне клиента. Но на практике этого не произойдет, так как я сомневаюсь, что есть какая-либо реализация FTP-клиента, которая бы поддерживала это (потому что это не имеет особого смысла). Кроме того, если клиенту приходится делиться своими эфемерными портами таким образом и он не может просто открыть новый, у него возникают гораздо более серьезные проблемы. Таким образом, с этой точки зрения вы должны быть полностью в безопасности, используя один порт.Давайте подумаем, почему одного порта может быть недостаточно .
Прежде всего, я мог бы столкнуться с ситуацией, когда действительно некорректная реализация FTP-сервера использует только номер локального порта для идентификации передачи данных клиента. Еще раз, я не думаю, что какой-либо приличный FTPd сделал бы это.
Настоящая проблема ( да, вы можете игнорировать все вышеперечисленное как серьезное отступление ;-)) в том, что диапазон пассивных портов находится в непривилегированном диапазоне .
Это означает, что выбранный вами номер порта не зарезервирован сам по себе , и фактически любой пользовательский процесс (не требующий прав root ) может получить его до того, как это сделает ваш FTP-сервер. Если у вас есть обширный пул портов на выбор, вы просто получаете случайный свободный. Если вы обязаны использовать только один, и он уже используется, вы не сможете обрабатывать переводы должным образом.
Извините, если ответ кажется слишком спекулятивным. Честно говоря, я очень старался найти причину, по которой вы не должны использовать один порт, и, кроме последнего, я не мог придумать никаких веских доказательств против этого. Тем не менее, интересный и сложный вопрос вы задаете.
источник
FTP использует два отдельных соединения, одно для управляющего или командного потока, а другое для передачи файлов данных и другой информации, такой как списки каталогов. Поток управления передается по традиционному TCP-соединению. Клиент привязывается к высокопривилегированному порту и отправляет запрос на подключение к FTP-серверу, который привязан к порту 21. Это соединение используется для передачи команд.
В режиме «Порт» или в активном режиме клиент сообщает серверу, какой дополнительный непривилегированный порт он будет прослушивать. Затем сервер инициирует соединение для передачи данных с порта 20 на непривилегированный порт, указанный клиентом.
Пассивный режим, более новый механизм, используется по умолчанию, когда клиент является веб-браузером. Вместо привязки к порту 20 сервер сообщает клиенту, какой порт следует использовать для передачи данных. Затем данные передаются через непривилегированные порты между клиентом и сервером.
Для более подробной информации, пожалуйста, смотрите:
http://tools.ietf.org/html/rfc959
РЕДАКТИРОВАТЬ
Что касается блокировки сервера на конкретный один порт, это может быть возможно на некоторых серверах. Например, в vsftpd у вас есть следующие параметры конфигурации.
Если вы установите оба порта одинаково, например, pasv_max_port = 12345, pasv_min_port = 12345, вы сможете получить то, что вам нужно. Я подозреваю, что это ограничит количество одновременных сеансов FTP, которые будет поддерживать ваш сервер. Пожалуйста, проверьте, чтобы быть уверенным.
источник
FTP-сервер может сопоставить соединение клиентского порта данных с его соединением порта управления на основе только исходного IP-адреса, а не на основе используемого номера порта.
Это нарушит FXP (что может быть неплохо), когда клиент подключается к двум серверам (один в пассивном режиме), а затем, после получения информации PORT пассивного сервера, передает ее серверу активного режима в виде команды PORT, так что активный Сервер режима подключается к серверу пассивного режима.
Я подозреваю, что многие серверы не создают сокет данных, пока клиент не запросит пассивный режим. В этом случае, если два клиента запрашивают пассивный режим одновременно, созданные сокеты будут нуждаться в уникальных номерах портов.
РЕДАКТИРОВАТЬ : подумал о другой причине, по которой FTP-серверы этого не делают: сервер не может различить несколько пользователей с одинаковым IP-адресом.
источник
На портах 21 или 80 (как и на всех известных портах) есть установленный протокол, который клиент использует, чтобы сказать, чего он хочет. Таким образом, сервер знает, к чему вы подключаетесь. На порту подключения к данным нет протокола. Все, что знает сервер - единственное, что уникально в этом соединении - это номер порта, к которому вы подключаетесь.
Если бы вы каждый раз подключались к одному и тому же порту, сервер не смог бы определить, к какому файлу вы подключаетесь. Номер порта служит связующим звеном между запросом на передачу по управляющему соединению и соединением для передачи данных.
Если два клиента запросят передачу одновременно, когда сервер примет соединение с одним портом, сервер не сможет определить, какой файл передать. Конечно, сервер может использовать IP-адрес клиента для принятия решения (на самом деле многие FTP-серверы проверяют, что IP-адрес клиента совпадает с IP-адресом, используемым в контрольном соединении, для безопасности).
Но это не будет работать для:
Смотрите также Повторное использование подключений к данным FTP .
источник
Я не видел здесь упомянутого, поэтому я добавлю его. Назначение диапазона портов должно было быть своего рода функцией безопасности, когда вы не могли отслеживать один порт для трафика данных, данные были отправлены на случайный порт в диапазон, который не может быть легко определен. Безопасность через неизвестность.
источник
Похоже, вы уже знаете о портах управления и портах данных, поэтому я перейду прямо к погоне. Порты управления по своей природе являются пакетными, как порт 80 для веб-сайтов. они могут обрабатывать много разных запросов (не одновременно, но чертовски близко, потому что их так быстро выполнить). Порты данных, с другой стороны, - вот где магия случается с FTP. Если вы ограничиваете себя одним портом данных, за один раз происходит только одна передача данных. рассмотрим передачу большого файла. Если открыт один порт данных, никакие другие данные не могут перемещаться до завершения передачи. Это означает, что во время передачи второй пользователь даже не сможет отобразить содержимое каталога папки ftp. Конечно, они смогут успешно войти в систему, но их поведение будет таким же, как если бы порты данных вообще не были открыты. Если ты в порядке с этим, один порт будет отлично работать для вас. Имейте в виду, что некоторые FTP-клиенты (я могу думать о 1 сразу) по умолчанию устанавливают несколько подключений в одном сеансе для загрузки. Поэтому для этого клиента в сценарии с одним портом рассмотрим пакетную передачу 1 большого файла и 4 небольших файлов.
Клиент инициирует передачу для первого большого файла, все в порядке. Затем, пока идет передача, запускается второй файл. Нет кости. Тогда третий, также zilch (технический термин). В конце журнал должен показать 1 успешных и 4 неудачных передачи. Обходным путем было бы ограничить клиент одним соединением на сеанс, и вам было бы хорошо (если кто-то еще не вошел в дверь, микросекунда одна передача завершена, а другая еще не началась). )
источник