FTP

FTP (File Transfer Protocol — протокол передачи файлов) - протокол, с помощью которого осуществляется передача файлов по TCP-сети. FTP-протокол зачастую применяется для загрузки сетевых страниц и прочих документов с какого-либо устройства. Протокол имеет архитектуру «клиент-сервер», в нем применяются различные сетевые соединения для передачи данных между, соответственно, клиентом и сервером. Для захода на сервер пользователю необходимо пройти аутентификацию, посредством ввода логина и пароля. Однако, бывают также FTP-сервера и с анонимным доступом. 

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

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

Хронология развития FTP

В 1971 году произошла первая реализация протокола FTP. Она предусматривала обмен между клиентом и сервером сообщениями, состоящими из заголовка длиной в 72 бита, и данных переменной длины. Заголовок включал в себя запрос к FTP-серверу или ответ от него, тип и длину передаваемых данных. В качестве данных передавались параметры запроса, информация от сервера и сами файлы. Так, команды и данные передавались по одному и тому же каналу.

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

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

В 1980 году FTP-протокол стал применять TCP. Последняя редакция протокола была выпущена в 1985 году. В 1997 году появилось дополнение к протоколу, позволяющее шифровать и подписывать информацию в канале управления и канале данных. В 1999 году было выпущено дополнение, посвященное интернационализации протокола, которое рекомендует использовать кодировку UTF-8 для команд и ответов сервера и определяет новую команду LANG, устанавливающую язык ответов.

В чем отличие FTP от HTTP?

Работа FTP осуществляется на прикладном уровне модели OSI. FTP используется зачастую для передачи файлов при помощи TCP/IP. Для этого необходимо запустить FTP-сервер, с ожиданием входящих запросов. Связь компьютера клиента с сервером осуществляется по порту 21. Данное соединение остается открытым на время сессии. Можно открыть и второе соединение - причем, как сервером из порта 20 к порту клиента, так и клиентом из любого порта к порту сервера. Благодаря такой двупортовой структуре, FTP считается внешнеполосным протоколом, а HTTP - внутриполосным.

Передача данных и соединение

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

При передачи данных по сети может быть использовано 4 режима представления данных:

  • ASCII - применяется для текста. Если есть такая необходимость, данные до передачи конвертируются из символьного представления на хосте-отправителе в "восьмибитный ASCII", и в символьное представление принимающего хоста. Данный режим не подходит для файлов, содержащих что-то кроме обычного текста.
  • Режим изображения (бинарным режим) - устройство-отправитель посылает каждый файл байт за байтом, а получатель сохраняет поток байтов при получении. Поддержка этого режима рекомендована для всех реализаций FTP
  • EBCDIC - режим, который используется для передачи обычного текста между хостами в кодировке EBCDIC. Данный режим аналогичен ASCII.
  • Локальный режим - режим, позволяющий двум компьютерам с идентичными установками посылать данные в собственном формате, минуя конвертацию в ASCII.

Текстовые файлы имеют различные форматы управления и настройки структуры записи. Это было разработано для работы с файлами, содержащими Telnet или ASA-форматирование.

Передача данных может осуществляться в любом из трех режимов:

  • Поточный режим. В нем данные посылаются в виде непрерывного потока, освобождая FTP от выполнения какой-либо обработки. Вместо этого, вся обработка выполняется TCP. Индикатор конца файла не нужен, за исключением разделения данных на записи.
  • Блочный режим. В нем данные разбиваются на несколько блоков (блок заголовка, количество байт, поле данных) и затем передаются TCP.
  • Режим сжатия. В данном режиме данные сжимаются единым алгоритмом.

Аутентификация

FTP-аутентификация, как правило, применяет обычную схему имя пользователя/пароль для предоставления доступа. Имя пользователя посылается серверу в виде команды USER, а пароль - в виде команды PASS. Если предоставленная клиентом информация принята сервером, то сервер отправит клиенту приглашение и начнется сессия. Также, пользователи могут, если сервер позволяет, войти в систему без предоставления учетных данных, но сервером предоставляется лишь ограниченный доступ для таких сессий.

Анонимный FTP

Хост FTP-сервиса может предоставить анонимный доступ к FTP. Пользователи обычно входят в систему анонимно, в качестве имени пользователя используется «anonymous». Как правило, пользователей просят прислать адрес электронной почты вместо пароля, никакой тщательной проверки не производится. Многие FTP-хосты, предоставляющие обновления программного обеспечения, поддерживают анонимный доступ.

NAT-PT

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

Веб-браузеры и FTP

Большинство интернет-браузеров способно извлекать файлы, расположенные на FTP-серверах. Однако браузеры могут и не поддерживать расширения протоколов вроде FTPS. При указании FTP-адреса, а не HTTP-адреса, контент на удаленном сервере представляется аналогично прочему веб-контенту. 

Синтаксис

Синтаксис FTP URL описан в RFC1738, в форме: ftp://[[:]@][:]/(параметры в квадратных скобках необязательны).

Более детальная информация об указании имени пользователя и пароля отражена в документации браузеров. По умолчанию, большинство веб-браузеров используют пассивный (PASV) режим.

Безопасность

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

В мае 1999 был составлен так называемый список проблем:

  • Скрытые атаки;
  • Спуф-атаки;
  • Атаки методом грубой силы;
  • Перехват пакетов, сниффинг;
  • Защита имени пользователя;
  • Захват портов.

FTP не имеет возможности шифровать свой трафик, все передачи - это открытый текст: имена пользователей, пароли, команды и данные могут быть прочитаны кем угодно, способным перехватить пакет по сети. Эта проблема характерна для многих спецификаций интернет-протокола (в их числе SMTP, Telnet, POP, IMAP), разработанных до создания таких механизмов шифрования, как TLS и SSL. Классическое решение такой проблемы - использование "безопасных", TLS-защищенных версий уязвимых протоколов (FTPS для FTP, TelnetS для Telnet и т.д.) или же другой, более защищенный протокол, вроде SFTP/SCP.

FTPS

FTPS - это расширение стандарта FTP, позволяющее клиентам требовать, чтобы FTP-сессия была зашифрована. Реализация производится посредством отправки команды "AUTH TLS". Сервер может позволить или отклонить соединения, которые не запрашивают TLS. Это расширение протокола определено в спецификации RFC 4217.

Основные команды

  • ABOR — Прервать передачу файла
  • CDUP — Сменить директорию на вышестоящую.
  • CWD — Сменить директорию.
  • DELE — Удалить файл (DELE filename).
  • EPSV — Войти в расширенный пассивный режим. Применяется вместо PASV.
  • HELP — Выводит список команд принимаемых сервером.
  • LIST — Возвращает список файлов директории. Список передается через соединение данных.
  • MDTM — Возвращает время модификации файла.
  • MKD — Создать директорию.
  • NLST — Возвращает список файлов директории в более кратком формате, чем LIST. Список передается через соединение данных.
  • NOOP — Пустая операция
  • PASV — Войти в пассивный режим. Сервер вернет адрес и порт, к которому нужно подключиться, чтобы забрать данные. Передача начнется при введении следующих команд: RETR, LIST и т.д.
  • PORT — Войти в активный режим. Например PORT 12,34,45,56,78,89. В отличие от пассивного режима для передачи данных сервер сам подключается к клиенту.
  • PWD — Возвращает текущую директорию.
  • QUIT — Отключиться
  • REIN — Реинициализировать подключение
  • RETR — Скачать файл. Перед RETR должна быть команда PASV или PORT.
  • RMD — Удалить директорию
  • RNFR и RNTO — Переименовать файл. RNFR — что переименовывать, RNTO — во что.
  • SIZE — Возвращает размер файла
  • STOR — Закачать файл. Перед STOR должна быть команда PASV или PORT.
  • SYST — Возвращает тип системы (UNIX, WIN, …)
  • TYPE — Установить тип передачи файла (бинарный, текстовый)
  • USER — Имя пользователя для входа на сервер
#