Настройка vsftpd на Ubuntu 20.04: FTP с TLS — пошаговое руководство
- Пошаговая инструкция по установке и настройке vsftpd на Ubuntu 20.04 с поддержкой SSL/TLS (FTPS). Подключение через TLS обеспечивает шифрование логина и передачи данных. В статье — настройка брандмауэра, chroot, пассивные порты, создание пользователя, тестирование и рекомендации по безопасности.
Введение

FTP (File Transfer Protocol) — старый и знакомый протокол для передачи файлов между клиентом и сервером. В исходном виде он небезопасен, но при использовании TLS (FTPS) соединение шифруется. В этой инструкции мы устанавливаем и настраиваем vsftpd (Very Secure FTP Daemon) на Ubuntu 20.04 и включаем TLS. Если возможно, предпочтительнее использовать SFTP/SCP, но FTPS остаётся совместимым решением для клиентов, требующих FTP.
Кому полезно это руководство
- Системным администраторам, которым нужно развернуть FTP-сервер с шифрованием.
- Разработчикам и DevOps-инженерам, поддерживающим устаревшие клиенты.
- Тем, кто мигрирует с небезопасного FTP на зашифрованный FTPS.
Ключевые понятия (в одну строчку)
- FTP — протокол передачи файлов (обычно без шифрования).
- FTPS — FTP поверх TLS/SSL (шифрует канал управления и/или данные).
- SFTP — SSH File Transfer Protocol (современная альтернатива, работает поверх SSH).
- chroot — механизм ограничения пользователя в определённой директории.
Содержимое статьи
- Предварительные требования
- Установка vsftpd
- Настройка брандмауэра (UFW)
- Основная конфигурация vsftpd (доступ, загрузки, chroot, пассивный режим, контроль пользователей)
- Создание и настройка пользователей FTP
- Тестирование подключения (командная строка и FileZilla)
- Подключение по TLS: создание сертификата и параметры безопасности
- Отключение shell-доступа (ограничение до FTP)
- Рекомендации по безопасности и проверочные сценарии
- Альтернативы и когда их выбирать
- Чек-листы, тесты приёма и рольовые задачи
- Краткое резюме
Предварительные требования
- Сервер с Ubuntu 20.04.
- Непользователь root с sudo-привилегиями.
- Доступ к командной строке и возможность изменять конфигурацию брандмауэра.
Важно: при работе с публичным сервером рекомендуется иметь домен или поддомен и действующий SSL-сертификат (например, от Let’s Encrypt) для доверенного подключения.
Шаг 1 — Установка vsftpd
Установим пакет vsftpd и создадим резервную копию конфигурации.
$ sudo apt update
$ sudo apt install vsftpdСделаем резервную копию оригинального файла конфигурации, чтобы можно было откатиться.
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.origСовет: храните резервные копии конфигураций вместе с датой и кратким описанием изменений.
Шаг 2 — Настройка брандмауэра (UFW)
Проверим текущий статус UFW и откроем порты, необходимые для FTPS в пассивном режиме.
$ sudo ufw statusОткроем порты 20 (команды), 21 (данные/контрол), 990 (implicit FTPS, если нужен) и диапазон пассивных портов 35000–40000, который в дальнейшем будет указан в конфигурации vsftpd.
$ sudo ufw allow 20:21/tcp
$ sudo ufw allow 990/tcp
$ sudo ufw allow 35000:40000/tcp
$ sudo ufw statusПримечание: если ваш сервер находится за NAT (облачный провайдер), нужно также пробросить эти порты на уровне провайдера и указать внешний IP в конфигурации пассивного режима, либо использовать FTP с явным TLS и активный режим с пробросом портов.
Важное замечание
- Использование широкого диапазона пассивных портов помогает избежать конфликтов, но требует открытия соответствующих портов в брандмауэре и/или облачном сетевом контроле.
Шаг 3 — Конфигурация vsftpd
Откроем файл конфигурации для редактирования.
$ sudo nano /etc/vsftpd.confНиже — ключевые параметры и объяснения.
Доступ FTP
Запретим анонимный доступ и разрешим локальным пользователям входить.
anonymous_enable=NO
local_enable=YESВключение загрузки файлов
Чтобы разрешить загрузку/изменение файлов, включите параметр:
write_enable=YESОграничение пользователей (chroot)
Ограничим локальных пользователей их домашними каталогами.
chroot_local_user=YESЕсли chroot включён, директория назначения не должна быть записываемой для пользователя — это ограничение безопасности. Есть два пути решения:
- Создать внутри домашнего каталога отдельную директорию для выгрузки файлов и сделать корневой каталог (local_root) неизменяемым. Пример:
user_sub_token=$USER
local_root=/home/$USER/ftpДля каждого пользователя создаются каталоги /home/USER/ftp и /home/USER/ftp/upload; корневой каталог владельцем является nobody:nogroup и не записываем.
- Альтернативно, если вы доверяете пользователю и понимаете риски, можно включить:
allow_writeable_chroot=YESЭтот параметр снимает ограничение, но снижает безопасность: используйте его только при необходимости и контроле доступа.
Пассивный FTP
Укажем диапазон портов, который открыт в UFW.
pasv_min_port=35000
pasv_max_port=40000Если сервер находится за NAT, добавьте также параметр pasvaddress=<вашпубличный_ip_or_domain>.
Ограничение списка пользователей
Чтобы разрешить доступ только определённым пользователям — включите:
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NOДобавляйте в /etc/vsftpd.userlist только тех пользователей, которым вы доверяете.
После внесения изменений перезапустите сервис:
$ sudo systemctl restart vsftpdШаг 4 — Настройка директории пользователя FTP
Ниже показано создание отдельного пользователя и конфигурация директории с учётом chroot.
Добавление пользователя
$ sudo adduser testuserУстановите сложный пароль.
Добавление пользователя в список разрешённых
$ echo "testuser" | sudo tee -a /etc/vsftpd.userlistСоздание FTP-деревa и каталогов для загрузки
$ sudo mkdir /home/testuser/ftp
$ sudo chown nobody:nogroup /home/testuser/ftp
$ sudo chmod a-w /home/testuser/ftp
$ sudo mkdir /home/testuser/ftp/upload
$ sudo chown testuser:testuser /home/testuser/ftp/uploadПроверка прав:
$ sudo ls -al /home/testuser/ftpСоздадим тестовый файл:
$ echo "vsftpd test file" | sudo tee /home/testuser/ftp/upload/test.txtШаг 5 — Тестирование FTP-доступа (CLI)
Примеры подключения и результаты проверки:
- Анонимный вход должен быть запрещён — проверка возвращает “Permission denied”.
- Вход под неразрешённым пользователем также отклоняется.
- Вход под testuser должен быть успешным; можно выполнять get/put в каталоге upload.
Пример сессии (успешный вход):
$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): testuser
331 Please specify the password.
Password: your_user's_password
230 Login successful.
ftp> cd upload
250 Directory successfully changed.
ftp> get test.txt
150 Opening BINARY mode data connection for test.txt (17 bytes).
226 Transfer complete.
ftp> put test.txt upload.txt
150 Ok to send data.
226 Transfer complete.
ftp> byeЕсли соединение не устанавливается, проверьте:
- Открыты ли нужные порты в UFW и облачном провайдере.
- Настроен ли pasv_address при наличии NAT.
- Логи vsftpd: /var/log/vsftpd.log или системный journalctl -u vsftpd.
Шаг 6 — Шифрование трафика (SSL/TLS)
Чтобы зашифровать логин и передачу данных, нужен сертификат. Рекомендуется использовать Let’s Encrypt для публичных доменов; в примере ниже — самоподписанный сертификат для тестовой среды.
Создадим PEM-файл, содержащий и ключ, и сертификат (2048 бит, 365 дней):
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pemДалее в /etc/vsftpd.conf закомментируем старые пути и укажем новые:
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YESДобавим усиление настроек TLS:
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGHКомментарии по настройкам:
- forcelocal*_ssl заставляет шифровать логин и данные локальных пользователей.
- ssl_tlsv1=YES включает TLSv1.0; при возможности замените или дополните настройку поддержкой TLSv1.2/1.3 (в более новых версиях OpenSSL/совместимых сборках).
- require_ssl_reuse=NO позволяет некоторым клиентам корректно работать; при наличии современных клиентов можно включать повторное использование сессий для улучшения безопасности.
Перезапустите сервис:
$ sudo systemctl restart vsftpdПосле включения TLS подключаться через обычный ftp-клиент в командной строке уже не получится: нужен клиент с поддержкой explicit FTPS (FTPES) или FileZilla.
Шаг 7 — Тестирование TLS в FileZilla
В FileZilla откройте Диспетчер сайтов (Site Manager).
- Нажмите “New Site” и задайте Host = IP или домен.
- Оставьте Port пустым (по умолчанию 21) или укажите 21.
- В поле Encryption выберите “Require explicit FTP over TLS”.
- Введите Username/Password и Connect.


При подключении клиент покажет сертификат сервера. При самоподписанном сертификате можно отметить “Always trust this certificate” для удобства тестирования.

После подтверждения соединение будет установлено и вы сможете обмениваться файлами.

Совет: при использовании Let’s Encrypt обновляйте сертификаты автоматически (certbot) и следите за правами доступа к /etc/letsencrypt.
Шаг 8 — Отключение shell-доступа для FTP-пользователя
По умолчанию пользователи имеют shell-доступ (ssh). Для ограничения можно создать shell, который выводит сообщение и завершает сессию.
$ echo -e '#!/bin/sh
echo "This account is limited to FTP access only."' | sudo tee -a /bin/ftponly
$ sudo chmod a+x /bin/ftponly
$ echo "/bin/ftponly" | sudo tee -a /etc/shells
$ sudo usermod newftpuser -s /bin/ftponlyИспользуйте эту технику, если хотите лишить пользователя SSH-доступа, но оставить FTP.
Важное: для SFTP этого не достаточно — SFTP работает через SSH и потребует отдельной конфигурации.
Рекомендации по безопасности и hardening
- По возможности используйте SFTP вместо FTPS для упрощения аутентификации и работы через SSH.
- Для публичных серверов применяйте сертификаты от доверенных CA (Let’s Encrypt).
- Ограничивайте список пользователей (userlist_enable) и используйте сильные пароли или ключи (если поддерживается).
- Включите логирование и отслеживайте /var/log/vsftpd.log и systemd journal.
- Минимизируйте доступ в домашние каталоги: chroot_local_user=YES и делайте корневой каталог неизменяемым.
- Следите за версиями OpenSSL и vsftpd и оперативно применяйте обновления.
- Если сервер за NAT, укажите pasv_address и откройте соответствующие порты.
- Рассмотрите двухфакторную аутентификацию на уровне приложения или VPN для управления доступом.
AppArmor/SELinux
Ubuntu использует AppArmor. При проблемах доступа проверьте профиль vsftpd и системные журналы. При необходимости добавьте исключения или отключите профиль после анализа рисков.
Альтернативы и когда их выбирать
- SFTP (через SSH) — предпочтителен для большинства сценариев: проще в настройке, безопаснее и не требует выделенного диапазона пассивных портов.
- SCP — для одноразовых переносов файлов через SSH.
- WebDAV поверх HTTPS — удобен для интеграции с некоторыми клиентами и браузерами.
Выбирайте SFTP если у вас уже есть SSH-доступ и требуется простое решение. FTPS нужен, если клиенты или интеграции ожидают именно FTP-протокол (например, старое ПО или специализированные устройства).
Чек-лист перед вводом в эксплуатацию (роль: системный администратор)
- Установлен vsftpd и проверена работоспособность сервиса.
- Открыты порты 20, 21, 990 (если нужен) и диапазон пассивных портов в UFW и облачном провайдере.
- Настроен chroot_local_user или эквивалент.
- Создан пользователь(и) и добавлены в /etc/vsftpd.userlist.
- Создан сертификат (Let’s Encrypt или самоподписанный) и указаны rsa_cert_file/rsa_private_key_file.
- Приняты параметры SSL (force_local_data_ssl, force_local_logins_ssl и т.д.).
- Проверено подключение через FileZilla и/или другой FTPS-клиент.
- Настроено логирование и мониторинг (журналы, оповещения).
- Проведён тест восстановления/отката конфигурации.
Критерии приёмки
- Анонимный вход запрещён (anonymous_enable=NO).
- Разрешённый пользователь входит и может загрузить/скачать файлы в пределах своих прав.
- Передача данных и логин происходят по TLS (проверено через FileZilla).
- Пассивный диапазон портов открыт и отвечает на соединения.
- Логи фиксируют попытки входа и передачу файлов.
Тестовые сценарии и приёмка
- Попытка анонимного входа — должна быть отклонена.
- Попытка входа пользователем, не внесённым в список, — отклонена.
- Вход testuser, получение test.txt — успешен.
- Загрузка файла в /upload — успешна; права сохраняются и файл принадлежит testuser.
- Подключение через FTPS в FileZilla с проверкой сертификата — успешное.
- Проброс портов и пассивный режим через NAT — проверен с внешнего хоста.
Ментальные модели и эвристики
- «Разделяй и властвуй»: чётко отделяйте корневую (неписываемую) зону FTP от каталога загрузки.
- «Минимальные права»: давайте пользователям минимально необходимые привилегии.
- «Защищённый путь»: предпочитайте TLS для всех данных и логинов; при возможности — доверенные сертификаты.
Миграция и совместимость
- При переходе с FTP на FTPS убедитесь, что клиенты поддерживают explicit FTPS (FTPES). Старые клиенты могут требовать implicit FTPS на порту 990.
- Для перехода на SFTP потребуется настроить SSH и, возможно, изменить рабочие процессы клиентов.
Быстрый план восстановления (rollback)
- Если новая конфигурация привела к недоступности сервиса, восстановите резервную копию конфигурации:
$ sudo cp /etc/vsftpd.conf.orig /etc/vsftpd.conf
$ sudo systemctl restart vsftpd- Проверка UFW: при ошибке доступа временно разрешите 20–21 и диапазон пассивных портов.
- Если сертификат некорректен, верните старый сертификат или используйте временный самоподписанный для восстановления работы.
Краткое резюме
- vsftpd остаётся надёжным FTP-решением; FTPS (FTP по TLS) позволяет сохранить совместимость с FTP-клиентами и при этом обеспечить шифрование.
- Важны: chroot, правильные права на каталоги, открытые пассивные порты и корректная конфигурация сертификатов.
- Рассмотрите SFTP как более современную и простую альтернативу, если это возможно.
Если остались вопросы или нужна помощь с конкретной конфигурацией (например, pasv_address за NAT, автоматическое обновление Let’s Encrypt для FTPS или интеграция с системой управления пользователями), опишите окружение — я помогу с точными командами и примерами.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента