Пошаговая настройка FTP и SFTP серверов: безопасная передача файлов на Windows и Linux | AdminWiki

Пошаговая настройка FTP и SFTP серверов: безопасная передача файлов на Windows и Linux

29 июля 2026 12 мин. чтения
Содержание статьи

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

Это руководство содержит проверенные конфигурации для развертывания FTP, FTPS и SFTP серверов на Windows и Linux. Вы получите готовые инструкции по установке vsftpd, ProFTPD, OpenSSH SFTP и FileZilla Server, настройке изоляции пользователей, шифрованию трафика и устранению типичных проблем с файрволом и правами доступа. Все примеры протестированы в production-окружениях и готовы к применению.

FTP, FTPS или SFTP: какой протокол выбрать для безопасной передачи файлов

Три основных протокола решают одну задачу, но работают принципиально по-разному. FTP передает данные и пароли открытым текстом - в современных сетях это допустимо только внутри изолированных VLAN без доступа извне. FTPS оборачивает FTP в TLS/SSL, добавляя шифрование, но сохраняет сложности с пробросом портов. SFTP работает поверх SSH, использует один порт и не требует настройки диапазонов для пассивного режима.

ХарактеристикаFTPFTPSSFTP
Порт по умолчанию21 (команды) + динамические порты для данных21 (явный TLS) или 990 (неявный TLS)22 (один порт)
ШифрованиеОтсутствуетTLS/SSLSSH
Сложность настройки файрволаВысокая (динамические порты)Высокая (диапазон портов для пассивного режима)Низкая (один порт)
Совместимость с клиентамиМаксимальная (устаревшие системы)Высокая (FileZilla, WinSCP, curl)Высокая (OpenSSH, FileZilla, WinSCP)
АутентификацияЛогин/пароль открытым текстомЛогин/пароль поверх TLS, сертификаты клиентаПароль, SSH-ключи, Kerberos
Изоляция пользователейchroot в vsftpd/ProFTPDchroot в vsftpd/ProFTPDChrootDirectory в 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.

  1. Загрузка и установка: скачайте установщик с официального сайта FileZilla. При установке выберите компоненты «Server» и «Administration interface». Служба запускается автоматически после инсталляции.
  2. Подключение к интерфейсу управления: запустите FileZilla Server Interface, укажите адрес 127.0.0.1 и порт 14148. Пароль администратора задается при первом подключении.
  3. Создание пользователя: перейдите в Edit → Users, нажмите Add. Задайте имя пользователя и пароль. На вкладке Shared folders добавьте каталог и настройте права: чтение, запись, удаление, создание подкаталогов.
  4. Настройка пассивного режима: в Settings → Passive mode задайте диапазон портов, например 50000-50100. Укажите внешний IP-адрес сервера в поле «Use the following IP» - это критично для работы за NAT.
  5. Включение 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 ~ !admin

ProFTPD гибче 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-серверу для локальной сети.

Поделиться:
Сохранить гайд? В закладки браузера