// Engineering Log

Протоколы передачи файлов: Часть 1 — FTP

Опубликовано 22.09.2026

FTP (File Transfer Protocol) — один из старейших протоколов интернета. Его действующая спецификация, RFC 959, принята в 1985 году, и с тех пор протокол почти не менялся. FTP до сих пор встречается у хостинг-провайдеров, в сетевом оборудовании, на старых складских и бухгалтерских системах. Чтобы грамотно с ним работать — или обоснованно от него отказаться, — полезно понимать, как он устроен.

Два соединения: управление и данные

Главная особенность FTP — он использует два отдельных TCP-соединения.

  • Управляющее соединение. Клиент подключается к серверу на порт 21 и держит это соединение всю сессию. По нему идут текстовые команды (USER, PASS, LIST, RETR, STOR) и ответы сервера с трёхзначными кодами.
  • Соединение данных. Для каждой передачи файла или списка каталога открывается отдельное соединение, которое закрывается после передачи.

Именно второе соединение создаёт большинство проблем с межсетевыми экранами и NAT.

Активный и пассивный режим

Режим определяет, кто открывает соединение данных.

Активный режим (команда PORT). Клиент сообщает серверу свой адрес и порт, а сервер сам подключается к клиенту — по RFC 959 с порта 20. Если клиент находится за NAT или межсетевым экраном, входящее соединение от сервера до него не дойдёт. Поэтому на практике активный режим почти не работает.

Пассивный режим (команда PASV, для IPv6 — EPSV по RFC 2428). Сервер открывает у себя порт и сообщает его клиенту, а клиент подключается сам. Для клиента за NAT это удобно, но теперь входящие соединения на произвольные порты должен принимать сервер. Отсюда две обязательные настройки:

  1. Диапазон пассивных портов. Сервер выбирает порты только из заданного диапазона, и именно его открывают в межсетевом экране.
  2. Внешний адрес. Если сам сервер стоит за NAT, он должен сообщать клиенту публичный адрес, а не внутренний, иначе клиент будет подключаться «в никуда».

Главная проблема: всё передаётся открытым текстом

В классическом FTP нет шифрования. Команды USER и PASS вместе с логином и паролем, список файлов и сами файлы идут по сети как есть. Любой, кто может перехватить трафик — в общей Wi-Fi-сети, у провайдера, на промежуточном узле, — увидит пароль.

Поэтому FTP без шифрования допустим только в изолированной сети, где перехват исключён. Для передачи через интернет используют FTPS или SFTP.

Минимальная безопасная настройка vsftpd

vsftpd — самый распространённый FTP-сервер в дистрибутивах Linux. Если FTP всё же нужен, вот базовый набор параметров из man vsftpd.conf:

ini
# /etc/vsftpd.conf
listen=YES
anonymous_enable=NO          # анонимный вход выключен (по умолчанию YES)
local_enable=YES             # вход под системными пользователями
write_enable=YES             # разрешить загрузку файлов
chroot_local_user=YES        # запереть пользователя в домашнем каталоге

# пассивный режим: узкий диапазон портов для межсетевого экрана
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
# pasv_address=203.0.113.10  # если сервер за NAT — внешний адрес

# шифрование (FTPS)
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/ftp.example.ru.pem
rsa_private_key_file=/etc/ssl/private/ftp.example.ru.key
force_local_logins_ssl=YES   # пароль только по защищённому каналу
force_local_data_ssl=YES     # данные тоже

Что важно:

  • anonymous_enable по умолчанию включён — его нужно выключать явно.
  • pasv_min_port и pasv_max_port по умолчанию равны 0, то есть сервер берёт любой свободный порт. Без диапазона правильно настроить межсетевой экран невозможно.
  • chroot_local_user не даёт пользователю выйти за пределы домашнего каталога. Корень chroot лучше сделать недоступным пользователю на запись, а файлы размещать в подкаталоге.
  • С ssl_enable=YES и параметрами force_*_ssl сервер фактически превращается в FTPS: без TLS войти не получится.

Правила межсетевого экрана для такого сервера — порт 21 и диапазон 40000–40100/TCP. Для UFW:

bash
sudo ufw allow 21/tcp
sudo ufw allow 40000:40100/tcp

Где FTP ещё оправдан

  • Устройства, которые умеют только FTP: старые МФУ со сканированием в папку, IP-камеры, промышленное оборудование.
  • Хостинг-панели, где FTP — единственный способ загрузить файлы сайта. Если провайдер поддерживает SFTP, лучше перейти на него.
  • Обмен с контрагентом, чья система поддерживает только FTP. В этом случае — хотя бы FTPS и отдельная учётная запись с минимальными правами.

Типичные ошибки

  • Открыт порт 21, но не открыт диапазон пассивных портов. Клиент подключается и авторизуется, но зависает на получении списка файлов.
  • Сервер за NAT без pasv_address. Сервер сообщает клиенту внутренний адрес, и соединение данных не устанавливается.
  • Анонимный доступ «на время». Открытый на запись анонимный FTP быстро находят и используют для хранения чужих файлов.
  • FTP без TLS через интернет. Пароль к серверу утекает при первом же перехвате. Если этот же пароль используется для SSH или почты, скомпрометировано всё сразу.

Итог

FTP прост и повсеместно поддерживается, но его архитектура — два соединения и открытый текст — плохо подходит для современного интернета. Использовать его стоит там, где без него не обойтись, и только с шифрованием. Для новых задач лучше сразу выбирать SFTP.

// Contact

Нужна помощь?

Свяжись со мной и я помогу решить проблему

Написать в Telegram

Отвечаю в течение рабочего дня (03:00–13:00 GMT)

Или оставьте заявку здесь:

Подтвердите, что вы не бот.

Написать и получить быстрый ответ