FTP или File Transfer Protocol - это достаточно древний, но в то же время надёжный и проверенный протокол выгрузки файлов на удалённый сервер или их скачивания. Также иногда этот протокол применяется веб-мастерами для управления файлами или организации хранилища данных.
В этой статье мы рассмотрим, как выполняется установка FTP на Ubuntu 20.04, как настроить все необходимые компоненты, в том числе и защищённое соединение. Мы будем использовать FTP-сервер VSFTPD или Very Secure FTP Daemon, который обеспечивает самую надёжную защиту от уязвимостей.
Содержание статьи
- Установка FTP в Ubuntu
- Настройка FTP Ubuntu
- Тестирование vsftpd
- Настройка домашних папок пользователей
- Настройка защищенного соединения
- Выводы
Установка FTP в Ubuntu
Программа доступна из официальных репозиториев, поэтому установка FTP на Ubuntu Server не должна вызвать проблем. Сначала обновите список пакетов в репозиториях, затем установите саму программу:
sudo apt update
sudo apt install vsftpd

Когда установка будет завершена, вам необходимо включить сервис vsftpd, поскольку он не будет запущен по умолчанию, а также добавить службу в автозагрузку:
sudo systemctl start vsftpd
sudo systemctl enable vsftpd
Если у вас установлен фаервол ufw, а такая ситуация возникает, когда вы пытаетесь установить FTP на Ubuntu Server, нужно открыть порты 20 и 21 для нормальной работы. Чтобы это сделать, выполните команды:
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw status
Установка FTP Ubuntu завершена, но теперь вам осталось настроить всё необходимое для обеспечения безопасной работы. Никогда не используйте FTP-сервер с настройками по умолчанию в производственных сетях, это небезопасно.
Настройка FTP Ubuntu
Теперь перейдём к настройке. Нам нужно поменять всего несколько параметров, чтобы полностью защитить ваш FTP-сервер. Сначала мы рассмотрим самые очевидные настройки: отключения анонимного входа и так далее. Сначала необходимо скопировать оригинальный файл настроек, чтобы в случае проблем вернуть всё как было:
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
Затем откройте файл в редакторе:
sudo vi /etc/vsftpd.conf
Затем добавьте такие настройки. Вам нужно будет найти и изменить значения указанных строк, добавлять новые, если они уже есть, не стоит. Сначала отключаем анонимный вход:
Разрешаем использовать имена локальных пользователей для входа:
Для авторизованных пользователей разрешаем команды, позволяющие изменять файловую систему:
Установим значение umask для новых файлов, создаваемых по FTP:
Включаем сообщение о необходимости выбрать каталог после регистрации:
Записывать в лог файл все транзакции по передаче файлов и использовать стандартный формат лога:
Использовать порт 20 для передачи данных вместо случайного, это нужно для нормальной работы фаервола:
Указываем, что нужно ожидать входящих соединений:
Использовать PAM-библиотеки:
На завершение разрешим аутентификацию только пользователей, перечисленных в файле userlist:
Указываем файл с нашими виртуальными пользователями:
По умолчанию таким пользователям запрещён вход в систему, но мы хотим совсем обратное, поэтому добавьте такую строчку:
При входе пользователей на FTP-сервер, они могут работать только в корневом каталоге FTP. Если вы хотите, чтобы пользователи были ограничены только своей домашней папкой, то необходимо раскомментировать эти строчки:
Первая строчка указывает, что нужно разместить пользователя в изолированном домашнем каталоге, а вторая, что ему можно разрешить запись в этот каталог. Настройка FTP Ubuntu почти завершена, сохраните изменения в конфигурационном файле и перезапустите vsftpd:
sudo systemctl restart vsftpd
Тестирование vsftpd
Сервер готов, но система настроена ещё не полностью. Сначала создадим нашего тестового пользователя с помощью useradd:
sudo useradd -m -c "Test User" -s /bin/bash testuser
sudo passwd testuser
Поскольку мы хотим подключаться от его имени к FTP-серверу, то нам нужно добавить его в vsftpd.userlist:
echo "testuser" | sudo tee -a /etc/vsftpd.userlist
cat /etc/vsftpd.userlist
Теперь самое время подключится к нашему FTP-серверу и проверить, как там всё работает. Попробуем войти от имени анонимного пользователя:
У нас ничего не получится. Теперь попробуем войти от имени нашего тестового пользователя, и всё заработает как нужно.
Обратите внимание, что опасно давать пользователям доступ на запись в их домашнюю папку. Делайте это, только если уверены в том, что это необходимо и безопасно.
Настройка домашних папок пользователей
Чтобы хоть как-то обойти проблемы с безопасностью, вы можете использовать другую папку вместо домашней для предоставления её пользователю. Сначала создадим такую папку для нашего пользователя:
sudo mkdir -p /home/testuser/ftp/files
Уберём право на запись для папки ftp:
sudo chown nobody:nogroup /home/testuser/ftp
sudo chmod a-w /home/testuser/ftp
Затем дайте необходимые полномочия пользователю на запись в подпапку.
sudo chown -R testuser:testuser /home/testuser/ftp/files
sudo chmod -R 0770 /home/testuser/ftp/files/
Теперь вернёмся к конфигурационному файлу vsftpd.conf. Сначала закомментируйте строчку:
allow_writeable_chroot = YES
Теперь добавьте такие строчки:
Первая из них добавляет переменную $USER, в которой содержится имя пользователя, а вторая задаёт корневую папку для каждого пользователя. Осталось снова перезапустить FTP-сервер:
sudo systemctl restart vsftpd
Теперь вы можете снова войти от имени этого пользователя и увидите, что сейчас используется указанная нами папка.
Настройка защищенного соединения
Установка FTP на Ubuntu 20.04 завершена, но в наше время небезопасно использовать открытую передачу данных через сеть. Всё, что только возможно, необходимо шифровать. Поэтому мы рассмотрим, как настроить защищённое соединение для vsftpd. Сначала создадим папку и сгенерируем сам сертификат, который будем использовать:
sudo mkdir /etc/ssl/private
sudo openssl req -x509 -nodes -days 720 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/private/vsftpd.pem
Затем нужно разрешить доступ к портам защищённого соединения FTP с фаерволе UFW:
sudo ufw allow 990/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw status
И осталось внести несколько правок в настройку самого FTP-сервера. Нам нужно включить ssl_enable и отключить поддержку шифрования sslv2 и sslv3, оставляем только tlsv1:
Далее раскоментируйте такие строки:
Запретите вход анонимных пользователей по SSL:
Теперь установим самый сложный шифр SSL:
И настроим диапазон портов для передачи данных:
Осталось перезагрузить наш сервис:
sudo systemctl restart vsftpd
Теперь тестируем, что у нас получилось:
Как видите, мы уже не можем авторизоваться с помощью утилиты ftp. FTP-сервер выдаёт, что мы обязаны использовать шифрование. Поэтому для тестирования применим FileZilla:
Теперь все данные будут передаваться по зашифрованному соединению. Установка FTP-сервер Ubuntu завершена.
Выводы
В этой статье мы рассмотрели, как выполняется установка FTP на Ubuntu Server 20.04, также как настроить FTP для максимально безопасной работы, включая настройку работы по SSL. Если у вас остались вопросы, спрашивайте в комментариях!
Proton Drive — это облачное хранилище со сквозным шифрованием от компании, которая создала Proton Mail, которое может стать хорошей заменой Google Диску. Все файлы шифруются на вашем устройстве, поэтому они недоступны даже для самой компании Proton. Вы получаете синхронизацию между устройствами, общий доступ к файлам, автоматическое резервное копирование фото и удобные приложения для всех платформ, но с гарантией, что ваши данные останутся исключительно вашими и никто не будет тренировать на них AI. В бесплатной версии доступно 5 ГБ места на диске. Посмотреть детали












Отличный мануал!
но я все равно останусь использовать sftp максимум... это безопаснее.
Отличная статья! Спасибо за работу.
Делал все по инструкции, все получилось, но:
1) Если создавать каталоги с кириллическими названиями они отображаются кракозябрами, вылечил так (подсмотрел на хабре)
sudo apt-get install console-cyrillic
echo cyr >> ~/.bashrc
2) Создал еще одного пользователя точно так же как описано в разделе "Тестирование vsftpd", но он не может подключится к серверу, Filezilla выдает ошибку
Статус: TLS соединение установлено.
Команда: USER testuser2
Ответ: 331 Please specify the password.
Команда: PASS ***********
Ошибка: Ошибка GnuTLS -15: An unexpected TLS packet was received.
Ошибка: Невозможно подключиться к серверу
В чем может быть проблема?
вот и у меня были подобные проблемы, в итоге плюнул на это!
Проверил логи vsftpd в них есть инфа о действиях пользователя testuser, но ничего о testuser2.
Попробовал сделать так:
$ sudo chown -R testuser2:testuser /home/testuser/ftp/files
$ sudo chmod -R 0770 /home/testuser/ftp/files/
не помогло, помогите пожалуйста, куда копать?
попробовал отключить настройки защищенного соединения и подключится, результат:
Команда: USER testuser2
Ответ: 331 Please specify the password.
Команда: PASS *********
Ответ: 500 OOPS: cannot change directory:/home/testuser2/ftp
Ошибка: Критическая ошибка: Невозможно подключиться к серверу
Проверил права пользователя testuser2 на каталог /home/testuser/ftp/files
все нормально, могу создавать и удалять каталоги например.
На форумах народ пишет что у них та же проблема с настройкой мультидоступа к vsfpd, если пользователь один то все работает нормально, либо пользователей несколько, но каждый сидит в своей домашней папке, рабочего варианта единой папки для нескольких пользователей не нашел =(
Как вариант - домашнюю папку всем юзерам фтп одинаковую сделай. В /etc/passwd можешь изменить.
Снова включил настройки защищенного соединения
вернул на исходную права пользователей, сделал все как в инструкции
и просто закомментил в vsftpd.conf строку
#chroot_local_user = YES
теперь пользователь testuser подключается с шифрованием и попадает в папку /home/testuser/ftp/files
а пользователь testuser2 попадает в свой домашний каталог, при этом видит домашние папки других пользователей, без права на запись, но в папку /home/testuser/ftp/files войти не может.
Как же сделать так чтоб все пользователи пользовались одной папкой?
[code]
$ sudo systemctl start vsftpd
$ sudo systemctl enable vsftpd
[/code]
подскажи, для ubuntu 14 аналоги команд.
p.s. на странице "попросить инструкцию" форма не выводится, только тег
sudo service vsftpd start должно работать.
Команда работает, спасибо.
Но в итоге что-то у меня не получилось что хотелось. Может попробую завтра на свежую голову еще раз.
Сегодня, настраивал vsftpd (3.0.3-3ubuntu2) по Вашей статье, столкнулся с ошибкой соединения "ftp: connect: Connection refused". Искал в чем проблема, нашел : при установке параметра listen=YES , параметр listen_ipv6 обязательно должен быть - NO , и также между параметром и его значением не должно быть пробелов, если копировать из статьи будет ошибка. Спасибо за статью - пригодилась.
А что делать если требуется выставить корневой каталог на NTFS разделе?
На нем не действует chmod та же ((((
Ещё бы про виртуальных пользователей...
чета не понятно а логин пароль то в оконцовке какой лол? или где его ставить
пароль то он берёт что из системы!
Доброго времени суток. Помогите пожалуйста, сделал все по вашей инструкции. До раздела про шифрование. Теперь в чем проблема заходит на FTP из по Windows но не дает добавлять туда файлы Выдает ошибки 200,227,550. Как это можно решить?
Все , понял в чем проблема. Сам олень , сам решил. Спасибо большое за инструкцию.
С момента userlist_file=/etc/vsftpd.userlist
вплоть до добавления пользователя в список пользователей, всё, filezilla получает отказы подключения!
Если пишет что неправильный логин. Нужно сделать домашний каталог пользователя только для чтения.
chmod a-w /home/testuser
и запуск
ftp [ваш ip]
Версия. vsftpd: version 3.0.3. Что-то с вашей инструкцией не так.
listen=YES
Если указывать этот параметр, то при любой попытке соединения к localhost или извне выходит:
ftp: connect: Connection refused
Насколько этот параметр критичен?
"sudo useradd -m -c "Test User" -s /bin/bash testuser"
Как его потом удалить?
Добрый день. У меня не получается настроить чтоб можно было обращаться к серверу не из локальной сети а из интернета . В чем может быть причина? как это исправить ? можете помочь ?
( в локалке все работает: подключаюсь Файлзилой и качаю-записываю. А если от мобильной сети то ж(если не включать пассивный режим , то ошибка что,мол сервер возвращает другой(я так понимаю внутренней сети) адрес...а в пассивном режиме другая ошибка - не дает чтото там перечитать директорию)
На некоторых системах (например в Ubuntu Server 16.04) указание в файле настроек параметров типа "userlist_enable = YES" вызывает ошибку запуска сервера.
Правильный вид параметров "userlist_enable=YES" т.е. БЕЗ пробелов в строке параметра.
Отличный мануал. Но ничего не заработало. Целый день искал причину. Оказалось что в строках с настройками не должно быть пробелов по сторонам от знака =. При копировании строки из мануала и вставке в конфиг не получится подключится. Убираем пробелы и все работает. Может кому-то пригодится
В точку! Сам долго искал, что за фигня при запуске.
Выдаёт:
vsftpd.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
vsftpd.service: Failed with result 'exit-code'.
Ещё полезная команда для диагностики что именно не нравится vsftpd в конфиге:
vsftpd -olisten=NO /etc/vsftpd.conf
создавайте юзеров правильно, тогда и ошибок не будет
sudo useradd -m -c "Test User" -s /bin/bash testuser
Укажем пароль
sudo passwd testuser
Поскольку мы хотим подключаться от его имени к FTP-серверу, то нам нужно добавить его в vsftpd.userlist:
echo "testuser" | sudo tee -a /etc/vsftpd.userlist
В команде создания ключа/сертификата ошибка:
... -keyout /etc/ssl/private/vsftpd.key -out ... должно быть так!
А написано -keyout /etc/ssl/private/vsftpd.pem
Лучше бы мануал FileZilla Server, а не вот это вот консольное безобразие.
Самая лучшая и правильная статья (по настройкам) из всех которые в поиске. Спасибо!
Использовать в гайде текстовый редактор vi, на который нужен отдельный гайд... Месье знает толк в извращениях.