Передача файлов между серверами и клиентами - базовая задача, с которой ежедневно сталкиваются системные администраторы и DevOps-инженеры. Выбор протокола определяет не только скорость и удобство работы, но и безопасность инфраструктуры. Ошибка на этом этапе приводит к утечке данных или компрометации учетных записей.
Это руководство содержит проверенные конфигурации для развертывания FTP, FTPS и SFTP серверов на Windows и Linux. Вы получите готовые инструкции по установке vsftpd, ProFTPD, OpenSSH SFTP и FileZilla Server, настройке изоляции пользователей, шифрованию трафика и устранению типичных проблем с файрволом и правами доступа. Все примеры протестированы в production-окружениях и готовы к применению.
FTP, FTPS или SFTP: какой протокол выбрать для безопасной передачи файлов
Три основных протокола решают одну задачу, но работают принципиально по-разному. FTP передает данные и пароли открытым текстом - в современных сетях это допустимо только внутри изолированных VLAN без доступа извне. FTPS оборачивает FTP в TLS/SSL, добавляя шифрование, но сохраняет сложности с пробросом портов. SFTP работает поверх SSH, использует один порт и не требует настройки диапазонов для пассивного режима.
| Характеристика | FTP | FTPS | SFTP |
|---|---|---|---|
| Порт по умолчанию | 21 (команды) + динамические порты для данных | 21 (явный TLS) или 990 (неявный TLS) | 22 (один порт) |
| Шифрование | Отсутствует | TLS/SSL | SSH |
| Сложность настройки файрвола | Высокая (динамические порты) | Высокая (диапазон портов для пассивного режима) | Низкая (один порт) |
| Совместимость с клиентами | Максимальная (устаревшие системы) | Высокая (FileZilla, WinSCP, curl) | Высокая (OpenSSH, FileZilla, WinSCP) |
| Аутентификация | Логин/пароль открытым текстом | Логин/пароль поверх TLS, сертификаты клиента | Пароль, SSH-ключи, Kerberos |
| Изоляция пользователей | chroot в vsftpd/ProFTPD | chroot в vsftpd/ProFTPD | ChrootDirectory в sshd_config |
Для новых проектов выбирайте SFTP. Один порт, встроенное шифрование, аутентификация по ключам и отсутствие проблем с NAT делают его стандартом де-факто. FTPS оправдан, когда нужно сохранить совместимость с клиентами, которые умеют только FTP, но требуют шифрования - например, legacy-системы на базе Windows Server 2008 или специализированное промышленное ПО. Чистый FTP используйте исключительно в изолированных лабораторных сетях без маршрутизации в интернет.
Быстрый старт: установка и минимальная настройка FTP/SFTP сервера
Три сценария ниже покрывают 90% реальных задач. Каждый блок завершается проверкой работоспособности - вы получите готовый сервер за 10-15 минут.
SFTP сервер за 5 минут: настройка OpenSSH на Ubuntu/Debian
SFTP не требует отдельного демона. OpenSSH, установленный на любом Linux-сервере, уже поддерживает SFTP из коробки. Достаточно создать пользователя и проверить подключение.
# Установка OpenSSH Server (если еще не установлен)
sudo apt update && sudo apt install openssh-server -y
# Создание пользователя для SFTP-доступа
sudo useradd -m -s /usr/sbin/nologin sftpuser
sudo passwd sftpuser
# Проверка работы SFTP
sftp sftpuser@localhostКоманда sftp sftpuser@localhost должна вернуть приглашение sftp>. Пользователь sftpuser создан с оболочкой nologin - он не сможет открыть интерактивную SSH-сессию, но SFTP-доступ работает. Это базовая конфигурация без изоляции; настройку chroot разберем в разделе безопасности.
Если нужна более детальная инструкция с изоляцией пользователей и аутентификацией по ключам, обратитесь к руководству по настройке защищённого SFTP-сервера на Ubuntu.
FTP и FTPS сервер на Windows: пошаговая настройка FileZilla Server
FileZilla Server - бесплатное решение с графическим интерфейсом, поддержкой FTPS и детальным управлением пользователями. Работает на Windows Server 2016/2019/2022 и Windows 10/11.
- Загрузка и установка: скачайте установщик с официального сайта FileZilla. При установке выберите компоненты «Server» и «Administration interface». Служба запускается автоматически после инсталляции.
- Подключение к интерфейсу управления: запустите FileZilla Server Interface, укажите адрес
127.0.0.1и порт14148. Пароль администратора задается при первом подключении. - Создание пользователя: перейдите в Edit → Users, нажмите Add. Задайте имя пользователя и пароль. На вкладке Shared folders добавьте каталог и настройте права: чтение, запись, удаление, создание подкаталогов.
- Настройка пассивного режима: в Settings → Passive mode задайте диапазон портов, например
50000-50100. Укажите внешний IP-адрес сервера в поле «Use the following IP» - это критично для работы за NAT. - Включение FTPS: в Settings → FTP over TLS сгенерируйте новый сертификат или укажите существующий. Активируйте «Enable FTP over TLS support» и «Disallow plain unencrypted FTP» для принудительного шифрования.
Проверьте подключение через FileZilla Client или WinSCP, указав протокол «FTP - File Transfer Protocol» с шифрованием «Require explicit FTP over TLS». Если вы работаете в Windows-среде и планируете использовать OpenSSH вместо FileZilla, изучите руководство по настройке SFTP-сервера на Windows через OpenSSH.
Установка и базовая конфигурация vsftpd на Linux
vsftpd (Very Secure FTP Daemon) - легковесный FTP-сервер, используемый в большинстве Linux-дистрибутивов по умолчанию. Поддерживает виртуальных пользователей, TLS и chroot.
# Установка vsftpd
sudo apt update && sudo apt install vsftpd -y
# Резервное копирование оригинального конфига
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
# Минимальная рабочая конфигурация
sudo tee /etc/vsftpd.conf <<EOF
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
pam_service_name=vsftpd
EOF
# Перезапуск службы
sudo systemctl restart vsftpd
sudo systemctl enable vsftpd
# Проверка
ftp localhostКлючевые директивы: anonymous_enable=NO отключает анонимный доступ, local_enable=YES разрешает вход системным пользователям, write_enable=YES разрешает запись. Эта конфигурация использует активный режим FTP и не включает шифрование - она подходит для локальной сети. Для доступа из интернета потребуется настроить пассивный режим и TLS, что рассмотрено в следующих разделах.
Безопасность FTP и SFTP: изоляция пользователей и права доступа
Базовая установка дает пользователям доступ ко всей файловой системе в пределах их прав. В production-среде каждый пользователь должен видеть только свой домашний каталог. Эта техника называется chroot (change root) и реализуется по-разному для FTP и SFTP.
Изоляция пользователей в vsftpd и ProFTPD
В vsftpd за изоляцию отвечают две директивы. Конфигурация ниже запирает всех локальных пользователей в их домашних каталогах, но позволяет указанным в списке выходить за пределы chroot.
# Изоляция всех локальных пользователей
chroot_local_user=YES
# Разрешить запись в корень chroot (требует chroot_local_user=YES)
allow_writeable_chroot=YES
# Файл со списком пользователей, которым chroot НЕ применяется
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_listДиректива allow_writeable_chroot=YES появилась в vsftpd 3.0.0 и решает проблему «500 OOPS: vsftpd: refusing to run with writable root». Без нее корневой каталог chroot должен принадлежать root и быть недоступным для записи - это требование безопасности, которое часто вызывает ошибки у новичков.
В ProFTPD изоляция настраивается директивой DefaultRoot в /etc/proftpd/proftpd.conf:
# Запереть всех пользователей в домашние каталоги
DefaultRoot ~
# Исключить группу admin из chroot
DefaultRoot ~ !adminProFTPD гибче vsftpd в настройке прав: можно задавать разные корневые каталоги для групп пользователей и управлять доступом через модули (mod_wrap, mod_quotatab).
Настройка изолированного SFTP-доступа через ChrootDirectory
SFTP использует директиву ChrootDirectory в конфигурации SSH-сервера. Ключевой момент: каталог, указанный в ChrootDirectory, должен принадлежать root и иметь права 755. Подкаталог для записи создается внутри и принадлежит пользователю.
# Создание структуры каталогов
sudo mkdir -p /sftp/user1/uploads
sudo chown root:root /sftp /sftp/user1
sudo chmod 755 /sftp /sftp/user1
sudo chown user1:user1 /sftp/user1/uploads
# Добавление в конец /etc/ssh/sshd_config
# Формируем группу sftpusers
sudo groupadd sftpusers
sudo usermod -aG sftpusers user1
# Блок конфигурации
sudo tee -a /etc/ssh/sshd_config <<EOF
Match Group sftpusers
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
PasswordAuthentication yes
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
EOF
sudo systemctl restart sshdДиректива ForceCommand internal-sftp использует встроенный в OpenSSH SFTP-сервер вместо вызова внешнего sftp-server. Это быстрее и безопаснее: не требуется доступ к исполняемому файлу внутри chroot. Пользователи группы sftpusers получают изолированный доступ только к своему каталогу и не могут открыть shell-сессию.
Управление правами доступа: ACL и виртуальные пользователи
Стандартных прав Unix (owner/group/other) часто недостаточно, когда одному каталогу нужен доступ у нескольких пользователей с разными уровнями привилегий. ACL (Access Control Lists) решают эту задачу.
# Установка ACL (если не установлен)
sudo apt install acl -y
# Просмотр текущих ACL
getfacl /data/shared
# Предоставить пользователю alice права на чтение и запись
sudo setfacl -m u:alice:rwx /data/shared
# Предоставить группе auditors права только на чтение
sudo setfacl -m g:auditors:rx /data/shared
# Установить ACL по умолчанию для новых файлов
sudo setfacl -d -m u:alice:rwx /data/sharedВиртуальные пользователи vsftpd позволяют создать учетные записи, не привязанные к системным аккаунтам. Это повышает безопасность: скомпрометированный FTP-пароль не дает доступа к SSH или консоли сервера.
# Установка утилиты для Berkeley DB
sudo apt install db-util -y
# Создание файла с виртуальными пользователями (логин и пароль через перевод строки)
echo -e "vuser1\npass1\nvuser2\npass2" | sudo tee /etc/vsftpd/virtual_users.txt
# Создание базы данных
sudo db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db
sudo chmod 600 /etc/vsftpd/virtual_users.db
# Настройка PAM
sudo tee /etc/pam.d/vsftpd-virtual <<EOF
auth required pam_userdb.so db=/etc/vsftpd/virtual_users
account required pam_userdb.so db=/etc/vsftpd/virtual_users
EOF
# Добавление в vsftpd.conf
guest_enable=YES
guest_username=ftp
virtual_use_local_privs=YES
user_sub_token=\$USER
local_root=/home/vftp/\$USER
pam_service_name=vsftpd-virtualВсе виртуальные пользователи работают под одним системным аккаунтом ftp, но изолируются в отдельных каталогах через local_root. Это удобно для хостинг-провайдеров и компаний с большим количеством внешних клиентов.
Шифрование трафика: настройка FTPS и ключей SSH для SFTP
Без шифрования FTP передает логины, пароли и содержимое файлов открытым текстом. Любой сниффер в сети перехватит эти данные. Включение TLS для FTP и аутентификация по ключам для SFTP - обязательные шаги перед запуском в production.
Включаем TLS в vsftpd: явный и неявный FTPS
Явный TLS (explicit FTPS) использует порт 21: клиент подключается открытым текстом и командой AUTH TLS переводит соединение в защищенный режим. Неявный TLS (implicit FTPS) ожидает TLS-рукопожатие сразу после подключения на порт 990. Явный режим - современный стандарт, неявный считается устаревшим, но все еще требуется некоторыми клиентами.
# Генерация самоподписанного сертификата (валиден 365 дней)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/vsftpd.key \
-out /etc/ssl/certs/vsftpd.crt \
-subj "/C=RU/ST=Moscow/L=Moscow/O=Company/CN=ftp.example.com"
# Добавление в /etc/vsftpd.conf
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
rsa_private_key_file=/etc/ssl/private/vsftpd.key
# Принудительное шифрование для всех соединений
force_local_data_ssl=YES
force_local_logins_ssl=YES
# Явный TLS (порт 21)
require_ssl_reuse=NO
ssl_ciphers=HIGH
# Для неявного TLS (порт 990) добавьте:
# listen_port=990
# implicit_ssl=YESПараметр require_ssl_reuse=NO критичен для совместимости с современными клиентами. Без него FileZilla и WinSCP могут выдавать ошибку «SSL/TLS connection closed» при передаче файлов. После изменения конфигурации перезапустите vsftpd: sudo systemctl restart vsftpd.
Детальную инструкцию с автоматическим обновлением сертификатов через Let's Encrypt вы найдете в статье по настройке FTPS-сервера с шифрованием и Let's Encrypt.
SFTP без паролей: аутентификация по SSH-ключам
Парольная аутентификация уязвима к брутфорсу. SSH-ключи длиной 2048 бит и выше делают подбор нереалистичным при текущих вычислительных мощностях. Настройка занимает три шага.
# Шаг 1: Генерация ключевой пары на клиенте
ssh-keygen -t ed25519 -f ~/.ssh/sftp_key -C "sftp-access"
# ed25519 быстрее и компактнее RSA при сопоставимой криптостойкости
# Шаг 2: Копирование публичного ключа на сервер
ssh-copy-id -i ~/.ssh/sftp_key.pub user1@sftp.example.com
# Или вручную:
cat ~/.ssh/sftp_key.pub | ssh user1@sftp.example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# Шаг 3: Отключение парольной аутентификации для группы sftpusers
# В /etc/ssh/sshd_config:
Match Group sftpusers
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
sudo systemctl restart sshdПосле отключения парольной аутентификации вход возможен только с приватным ключом. Храните приватный ключ в защищенном месте, используйте passphrase для дополнительной защиты. Для CI/CD пайплайнов ключи можно распространять через секреты Jenkins, GitLab CI/CD Variables или HashiCorp Vault.
Типовые проблемы при настройке FTP/SFTP и их решение
Даже точное следование инструкциям иногда приводит к ошибкам. Ниже - семь наиболее частых проблем, с которыми сталкиваются администраторы, и способы их решения.
Ошибка 425 и пассивный режим FTP: настройка файрвола
Ошибка «425 Can't open data connection» возникает, когда клиент не может установить соединение для передачи данных. Причина - неправильная настройка пассивного режима за NAT или файрволом.
FTP использует два соединения: управляющее (порт 21) и данные. В активном режиме сервер сам подключается к клиенту - это не работает за NAT на стороне клиента. В пассивном режиме сервер открывает порт и ждет подключения клиента - это стандарт для современных сетей.
# Настройка пассивного режима в vsftpd
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
# Укажите внешний IP, если сервер за NAT
pasv_address=203.0.113.10
# Проброс портов в iptables
sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 30000:31000 -j ACCEPT
# Для firewalld
sudo firewall-cmd --permanent --add-port=21/tcp
sudo firewall-cmd --permanent --add-port=30000-31000/tcp
sudo firewall-cmd --reloadВ облачных средах не забудьте открыть эти порты в security group. Для Timeweb Cloud и аналогичных провайдеров настройка выполняется в панели управления виртуальным сервером.
SELinux и FTP: быстрое решение проблем с правами
На серверах с SELinux в режиме enforcing FTP часто не может читать или записывать файлы, даже если права Unix настроены верно. SELinux добавляет дополнительный слой контроля.
# Проверка текущего режима SELinux
getenforce
# Просмотр булевых переменных, связанных с FTP
getsebool -a | grep ftp
# Разрешить FTP полный доступ к домашним каталогам пользователей
sudo setsebool -P ftpd_full_access on
# Разрешить FTP доступ к файлам с контекстом public_content
sudo setsebool -P ftpd_anon_write on
sudo setsebool -P ftpd_connect_all_unreserved on
# Изменение контекста каталога для записи
sudo chcon -R -t public_content_rw_t /home/ftpuser/files
# Полное отключение SELinux - только для диагностики, не оставляйте в production!
# sudo setenforce 0Не отключайте SELinux полностью. Булевы переменные ftpd_full_access и правильные контексты каталогов решают проблему без снижения безопасности системы.
Другие распространенные ошибки
- 500 OOPS: vsftpd: refusing to run with writable root - корневой каталог chroot доступен для записи. Решение:
allow_writeable_chroot=YESв vsftpd.conf или изменение прав каталога на 555. - 530 Login incorrect - неверный логин или пароль. Проверьте
/etc/vsftpd.confна наличиеuserlist_enable=YESи содержимое/etc/vsftpd.userlist. В ProFTPD проверьте модульmod_auth_unix. - Connection timed out - порт 22 (SFTP) или 21 (FTP) закрыт файрволом. Проверьте
telnet server_ip 22с клиентской машины. - SFTP: Received message too long - в ответе сервера присутствует текст приглашения оболочки. Убедитесь, что для SFTP-пользователей задан
ForceCommand internal-sftpи оболочка/usr/sbin/nologin. - 530 SSL required - клиент пытается подключиться без TLS к серверу с
force_local_logins_ssl=YES. Включите шифрование в клиенте.
Автоматизация развертывания FTP/SFTP: Docker и Ansible
Ручная настройка серверов не масштабируется. Docker и Ansible позволяют развернуть FTP/SFTP за секунды с гарантией идентичности конфигурации на всех окружениях.
SFTP в Docker-контейнере за минуту
Образ atmoz/sftp - самый популярный на Docker Hub для быстрого развертывания SFTP. Он принимает параметры пользователей через переменные окружения и не требует правки системных конфигов.
# Базовый запуск с одним пользователем
docker run -d \
--name sftp-server \
-p 2222:22 \
-v /data/sftp:/home/user1/upload \
atmoz/sftp user1:password:::upload
# docker-compose.yml для нескольких пользователей
version: '3.8'
services:
sftp:
image: atmoz/sftp
container_name: sftp-server
ports:
- "2222:22"
volumes:
- /data/sftp/user1:/home/user1/upload
- /data/sftp/user2:/home/user2/upload
- ./ssh_host_ed25519_key:/etc/ssh/ssh_host_ed25519_key
- ./ssh_host_rsa_key:/etc/ssh/ssh_host_rsa_key
command:
- user1:pass1:1001:1001:upload
- user2:pass2:1002:1002:upload
restart: unless-stoppedПорт контейнера 22 проброшен на хост-порт 2222, чтобы избежать конфликта с основным SSH-сервером. Пользователи изолированы в подкаталогах upload - это реализация chroot внутри контейнера. Для production используйте примонтированные SSH-ключи хоста вместо автоматически сгенерированных.
Ansible-плейбук для настройки vsftpd с изоляцией и TLS
Плейбук ниже устанавливает vsftpd, применяет конфигурацию из шаблона Jinja2, генерирует SSL-сертификат и настраивает файрвол. Запуск: ansible-playbook -i inventory.ini vsftpd-setup.yml.
---
- name: Deploy secure vsftpd server
hosts: ftp_servers
become: yes
vars:
ftp_users:
- name: alice
password: "{{ vault_ftp_password_alice }}"
- name: bob
password: "{{ vault_ftp_password_bob }}"
pasv_min_port: 30000
pasv_max_port: 31000
tasks:
- name: Install vsftpd
apt:
name: vsftpd
state: present
update_cache: yes
- name: Create virtual users database
shell: |
echo -e "{% for user in ftp_users %}{{ user.name }}\n{{ user.password }}\n{% endfor %}" > /etc/vsftpd/virtual_users.txt
db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db
args:
creates: /etc/vsftpd/virtual_users.db
- name: Generate SSL certificate
openssl_certificate:
path: /etc/ssl/certs/vsftpd.crt
privatekey_path: /etc/ssl/private/vsftpd.key
provider: selfsigned
- name: Deploy vsftpd configuration from template
template:
src: vsftpd.conf.j2
dest: /etc/vsftpd.conf
notify: restart vsftpd
- name: Configure firewall
firewalld:
port: "{{ item }}"
permanent: yes
state: enabled
loop:
- 21/tcp
- "{{ pasv_min_port }}-{{ pasv_max_port }}/tcp"
notify: reload firewalld
handlers:
- name: restart vsftpd
systemd:
name: vsftpd
state: restarted
- name: reload firewalld
systemd:
name: firewalld
state: reloadedШаблон vsftpd.conf.j2 содержит переменные для пассивного режима, TLS и виртуальных пользователей. Пароли хранятся в Ansible Vault - это стандарт безопасности для Infrastructure as Code.
Если вы сравниваете протоколы перед внедрением, статья о выборе протокола передачи файлов для DevOps поможет принять решение с учетом специфики вашей инфраструктуры. Для настройки FTP в локальной сети обратитесь к руководству по FTP-серверу для локальной сети.