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

34

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

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

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

Или это может?

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

Kurt
источник
1
Это может вас заинтересовать: w3.org/Protocols/rfc959
Мэтт Симмонс
1
Спасибо Мэтт. Да, я прочитал большую часть rfc 959, но я чувствую, что на самом деле не смог получить четкий ответ от этого на то, о чем мне было интересно. Ответ от Karol Piczak - это та информация, которую я искал.
Курт

Ответы:

20

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

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

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

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

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

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

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

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

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

Karol J. Piczak
источник
Кстати, не стесняйтесь комментировать пропущенные моменты и несоответствия здесь. Даже я чувствую, что придираюсь к простому ответу - да, вы можете. ;-)
Кароль Дж. Пичак
Большое спасибо, Кароль! Это место на той информации, которую я искал (и больше нигде не нашел). Моя основная причина, по которой я задал этот вопрос, заключается в том, что я хочу знать, безопасно ли настраивать FTP-сервер в Windows Azure и блокировать пассивный режим только на 1 порт (поскольку Azure ограничивает конечные точки). Я попробовал это, это работает, и с твоей информацией я также чувствую себя безопасным, чтобы сделать это. Однако осталась только одна проблема: балансировщик нагрузки Azure сбрасывает управляющее соединение через 1 минуту во время передачи файлов (потому что оно бездействует), поэтому я работаю над TCP-туннелем с поддержкой keep live, чтобы исправить это.
Курт
1
Я считаю, что настоящая причина в том, что протокол канала передачи данных не имеет идентифицирующей информации. Сервер знает только, какой файл передается от какого клиента, на основании номера порта.
Монстер
4

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, которые будет поддерживать ваш сервер. Пожалуйста, проверьте, чтобы быть уверенным.

dmourati
источник
1
Спасибо за ваш ответ. Однако мне интересно знать, почему в пассивном режиме сервер ftp не может сказать всем клиентам использовать один и тот же порт для канала данных (например, порт 1024), а не давать каждому клиенту случайный порт из указанный диапазон портов? Каковы технические причины, если таковые имеются, почему указание только одного единственного порта данных в конфигурации диапазона портов FTP-сервера невозможно или не рекомендуется? Я думаю, что FTP-сервер может обрабатывать много / много одновременных подключений даже на одном канале данных, не так ли?
Курт
1
Потому что FTP это дьявол и должен наконец умереть. : D
1
Спасибо за ваши изменения в отношении блокировки сервера для конкретного отдельного порта. Я на самом деле думал об этом методе (и это то, чего я хочу достичь), но я не совсем понимаю, почему это ограничивает число одновременных сеансов FTP, которые может поддерживать сервер. Что именно может помешать серверу поддерживать несколько одновременных сеансов FTP в этом случае? Поскольку любой FTP-сервер, очевидно, поддерживает несколько одновременных подключений через порт 21, так почему бы и не использовать порт 12345, взятый из вашего примера? Я должен буду проверить это более подробно.
Курт
Это может не ограничивать количество одновременных подключений. Это действительно зависит от того, как сервер отслеживает соединения между несколькими сеансами. Дать ему шанс!
Дмурати
Кстати, мне придется подождать с маркировкой любого ответа как принятого ответа, потому что подробное и техническое объяснение в отношении проблемы с несколькими одновременными сеансами FTP при блокировке порта данных только для одного порта - это то, что мне больше всего интересно знать подробно. Когда он может работать, когда он не работает, почему его нельзя рекомендовать и т. Д.
Курт,
1

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

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

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

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

DerfK
источник
Спасибо. Я думаю, что я не понимаю, почему для этих сокетов каналов данных требуется уникальный порт (на сервере), если два или более клиентов запрашивают пассивный режим одновременно? Поскольку я думаю, два или более клиентов, очевидно, могут быть подключены к порту 21 одновременно, так почему бы не сказать порт 1024 (для канала данных) одновременно? Я чувствую, что это может быть глупым вопросом, но мой отказ от ответственности заключается в том, что я уже слишком долго не сплю :)
Курт,
Само гнездо должно быть уникальным. Вы можете создать один сокет, прослушивающий порт, и принимать столько подключений, сколько вы хотите, от этого одного сокета, или вы можете создать один сокет для пользователя на разных портах и ​​принимать одно соединение от каждого сокета. Если вы спроектировали сервер так, чтобы он работал с одним сокетом для каждого пользователя, вам, по сути, нужно было бы переписать все, чтобы изменить его, и в конце концов пользователи на общих хостах или за одним и тем же IP-адресом не смогут подключайтесь одновременно, потому что не было бы способа отличить их подключения к данным.
DerfK
Спасибо. Я благодарен за все ответы, которые я получил по этому вопросу, и я думаю, что теперь я начинаю довольно хорошо справляться с этим.
Курт
0

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

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

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

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

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

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

Мартин Прикрыл
источник
-1

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

Grantnoturbus
источник
1
У вас есть какие-либо ссылки на это требование?
Мартин Прикрыл
-2

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

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

Эндрю
источник
2
Какая? Это совершенно неверно. Сокет TCP определяется 4-мя кортежами (исходный IP-адрес, исходный порт, порт назначения, IP-адрес назначения). Многие сокеты TCP могут создаваться и обслуживаться одновременно из одного и того же порта назначения: сопоставление IP. Процесс FTP-сервера может одновременно обслуживать данные двух и от любого количества сетевых клиентов.
EEAA