Установка и настройка FTPS сервера — vsftpd

В этой статье я покажу как создать FTPS сервер на Linux (Debian 13) с отдельными каталогами для разных пользователей.

🕒 5 мин.

Реализуемая схема

В этой статье я покажу процесс подготовки FTPS сервера на Linux, при этом каждый пользователь будет видеть только свой каталог.

SFTP сервер на Linux с отдельными каталогами для разных пользователей

Установка и настройка FTP сервера

Я буду использовать Very Secure FTP Daemon (vsftpd), устанавливаем пакет:

sudo apt update && \
  sudo apt install vsftpd

Перед настройками сервера, сделаем резервную копию конфига:

sudo mv /etc/vsftpd.conf \
  /etc/vsftpd.conf.orig

Отредактируем конфиг:

sudo nano /etc/vsftpd.conf

# connection
listen=YES
listen_ipv6=NO
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
idle_session_timeout=600
data_connection_timeout=120

# authorization
anonymous_enable=NO
local_enable=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

# chroot
write_enable=YES
local_umask=077
chroot_local_user=YES
user_sub_token=$USER
local_root=/home/$USER/files
allow_writeable_chroot=YES

# logging
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log

После настройки перезапустим службу:

sudo systemctl restart vsftpd

Проверим слушает ли наш ftp сервер входящие соединения:

sudo ss -ltupn | grep vsftpd
  • Должны получить примерно такой вывод:
tcp   LISTEN 0      32               0.0.0.0:21         0.0.0.0:*    users:(("vsftpd",pid=25215,fd=3))

Разбираем конфиг

Различные опции хорошо описаны здесь, на русском языке. В своём конфиге я использовал следующие опции:

  • connection
    • listen=YES — ожидать входящие соединения;
    • listen_ipv6=NO — для ipv6 не ожидать входящие соединения;
    • pasv_enable=YES — у нас будет пассивный FTP сервер;
    • pasv_min_port=40000 и pasv_max_port=50000 — порты для передачи данных;
    • idle_session_timeout=600 — таймаут управляющего соединения (порт 21);
    • data_connection_timeout=120 — таймаут соединения передачи данных (PASV порт);
  • authorization
    • anonymous_enable=NO — запрещаем вход анонимных пользователей;
    • local_enable=YES — разрешаем вход по ftp для локальных пользователей;
    • pam_service_name=vsftpd — использовать PAM библиотеки;
    • userlist_enable=YES — разрешим вход только для перечисленных пользователей;
    • userlist_file=/etc/vsftpd.userlist — перечислим пользователей в этом файле;
    • userlist_deny=NO — пользователи, которые есть в списке не будут отбрасываться;
  • chroot
    • write_enable=YES — разрешаем писать на ftp (загружать или удалять файлы);
    • local_umask=077 — маска для вновь создаваемых файлов;
    • chroot_local_user=YES — пользователи ограничены только своей домашней папкой;
    • user_sub_token=$USER — для правильной подстановки имени пользователя;
    • local_root=/home/$USER/files — при входе пользователь попадает в каталог files в домашнем каталоге;
    • allow_writeable_chroot=YES — разрешаем писать в chroot каталоге;
  • logging
    • xferlog_enable=YES — записывать в лог файл все транзакции по передаче файлов;
    • xferlog_std_format=YES — использовать стандартный формат лога;
    • xferlog_file=/var/log/vsftpd.log — файл лога.

Создание FTP-пользователей

Создадим пользователей:

sudo useradd -m ftp_user1; sudo passwd ftp_user1
sudo useradd -m ftp_user2; sudo passwd ftp_user2

Создадим для них ftp каталоги:

sudo mkdir -p /home/ftp_user{1,2}/files && \
  sudo chown ftp_user1:ftp_user1 /home/ftp_user1/files && \
  sudo chown ftp_user2:ftp_user2 /home/ftp_user2/files

И запишем их в vsftpd.userlist, все остальные пользователи, не смогут подключаться по FTP:

sudo nano /etc/vsftpd.userlist

ftp_user1
ftp_user2

Включение TLS

Сейчас уже можно подключиться к нашему FTP-серверу, но логины и пароли, при этом, будут передаваться открытым текстом. Чтобы этого избежать включим поддержку TLS, превратив FTP-сервер в FTPS-сервер.

Создадим самоподписанный ssl сертификат на 10 лет:

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  -keyout /etc/ssl/private/vsftpd.pem \
  -out /etc/ssl/private/vsftpd.pem

И добавим в конфиг опции связанные с SSL:

sudo nano /etc/vsftpd.conf

# SSL
ssl_enable=YES
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

Использованные опции:

  • ssl_enable=YES — включим ssl;
  • rsa_cert_file=/etc/ssl/private/vsftpd.pem — путь к файлу ключа;
  • rsa_private_key_file=/etc/ssl/private/vsftpd.pem — путь к файлу сертификата;
  • allow_anon_ssl=NO — запретим анонимные подключения по ssl;
  • force_local_data_ssl=YES — разрешим передачу данных только по ssl;
  • force_local_logins_ssl=YES — разрешим подключаться только по ssl;
  • ssl_tlsv1=YES — разрешим алгоритм tlsv1;
  • ssl_sslv2=NO — запретим устаревший sslv2;
  • ssl_sslv3=NO — запретим устаревший sslv3.

Затем перезапустим службу:

sudo systemctl restart vsftpd

Подключение к серверу (FTP-клиенты)

Для подключения можно использовать:

  • FileZilla,
  • WinSCP.

Обычный Windows Проводник не получится использовать с нашим сервером, так как он не умеет подключаться по FTPS, только по FTP без SSL.

Я покажу как подключиться к FTP серверу с помощью приложения FileZilla. После запуска приложения вы увидите такое окно:

Внешний вид приложения FileZilla

Слева будет локальная файловая система, а справа удалённая. Вы можете совершить быстрое подключение, указав: хост, имя пользователя, пароль и порт. Или можете сохранить подключение, чтобы использовать его в последующем несколько раз. Для того, чтобы сохранить подключение, откройте менеджер сайтов, выбрав в меню «Файл / Менеджер сайтов«. Каждый сайт — это сохранённое подключение. Создавая новый сайт вы можете указать ip-адрес, порт, логин и пароль и другое:

FileZilla - создание сайта

Дальше, используя созданные сайты, вы сможете подключаться к различным FTP серверам.

Формат логов

Далее я подключился с помощью FileZilla к своему FTP серверу. И выполнил некоторые действия:

  • Скачал текстовый файл.
  • Загрузил бинарный файл.
  • Загрузил текстовый файл.

В журнале (/var/log/vsftpd.log) появились следующие записи:

Fri Mar 20 11:11:15 2026 1 172.28.81.9 0 /test.txt a _ o r ftp_user1 ftp 0 * c
Fri Mar 20 11:11:35 2026 1 172.28.81.9 719200 /licenceaddin-3.0.31-11018.amd64.deb b _ i r ftp_user1 ftp 0 * c
Fri Mar 20 11:12:04 2026 1 172.28.81.9 1448 /licenceserver.conf a _ i r ftp_user1 ftp 0 * c

Здесь видна следующая информация:

  • дата и время транзакции, а также ip-адрес клиента;
  • размер файла в байтах и сам файл;
  • режим передачи:
    • a — ASCII (текстовый),
    • b — двоичный,
  • символ (_) — означает, что не было произведено никаких специальных операций,
  • направление передачи
    • o — файл скачали,
    • i — файл загрузили;
  • символ (r) — означает что пользователь был зарегистрирован в системе,
  • дальше идёт имя пользователя.

Логирование желательно включать, чтобы в случае чего знать, кто и что делал с файлами по FTP.

Итог

Из статьи вы узнали как подготовить FTPS сервер на Linux. Я все действия выполнял на системе Debian 13, возможно на других дистрибутивах что-то будет отличаться. Показал как защитить сервер с помощью TLS протокола, и как использовать userlist, для создания списка разрешённых пользователей.

Если понравилась статья, подпишись на мой канал в VK или Telegram.

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Отказаться
Политика конфиденциальности