Networking

FTP / SFTP

FTP — старый протокол передачи файлов без шифрования, SFTP — передача файлов внутри SSH-сессии на порту 22.

Что такое FTP / SFTP

FTP (File Transfer Protocol, «фтп») — протокол передачи файлов между клиентом и сервером, один из старейших в интернете. FTP-сервер — программа, которая раздаёт каталог по этому протоколу и пускает в него по логину и паролю: раньше именно так заливали сайты на хостинг.

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

FTP, FTPS и SFTP — не одно и то же

FTP FTPS SFTP
Что это исходный протокол FTP, обёрнутый в TLSподсистема SSH
Шифрование нет да да
Порты 21 (команды), 20 (данные) 21 explicit, 990 implicit 22
Соединений два: управляющее и данных два одно
Дружит с NAT и файрволом плохо плохо отлично
Отдельная настройка своя служба своя служба, сертификат уже работает вместе с SSH

SFTP — не «FTP поверх SSH», а самостоятельный протокол, живущий внутри SSH-соединения. Практический вывод: если на сервере уже настроен SSH, SFTP работает сразу, ничего ставить и открывать не нужно. Это и делает его выбором по умолчанию.

Почему FTP ломается за NAT

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

Активный режим (PORT):  сервер сам подключается к клиенту на его порт
                        → блокируется файрволом и NAT клиента

Пассивный режим (PASV): клиент открывает оба соединения сам
                        → работает, но сервер должен иметь открытый
                          диапазон портов для данных

Пассивный режим требует пробросить наружу целый диапазон портов (например, 49152–50000) и указать его в конфиге сервера. У SFTP всей этой конструкции нет: одно соединение, один порт 22.

Практика

$ sftp deploy@example.com
sftp> put ./build.tar.gz /var/www/releases/
sftp> get /var/log/app.log
sftp> ls -l
sftp> bye

# копирование одной командой
$ scp -r ./dist deploy@example.com:/var/www/html/

# зеркалирование каталога, только изменённые файлы
$ rsync -avz --delete ./dist/ deploy@example.com:/var/www/html/

rsync поверх SSH передаёт только различия и почти всегда быстрее и FTP, и SFTP на больших деревьях файлов — для деплоя и синхронизации бэкапов берите его.

Ограничить пользователя только файлами, без shell-доступа, можно штатными средствами sshd:

Match Group sftponly
    ChrootDirectory /var/www
    ForceCommand internal-sftp
    PermitTunnel no
    AllowTcpForwarding no

Когда FTP всё ещё встречается

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

Для собственного сервера правило простое: SFTP для ручной работы, rsync для автоматической, FTP — только при внешнем требовании совместимости. А для раздачи файлов пользователям вместо FTP-сервера сегодня берут object storage — он дешевле и не требует администрирования.

Связанные термины

  • SSH — транспорт, внутри которого работает SFTP
  • FTP-клиенты — FileZilla, WinSCP и другие
  • Сетевые порты — 21, 22, 990 и диапазон для пассивного режима
  • TLS — то, чем FTPS отличается от FTP
  • NAT — причина, по которой FTP так капризен
  • object storage — современная замена файловой раздаче

Готовы запустить GPU-задачу?

Запустить GPU-сервер