В прошлой статье я показал, как можно буквально в несколько команд настроить собственное облачное хранилище файлов — Nextcloud. Но что делать, если красивые интерфейсы не нужны, а нужен доступ по ftp с любого устройства, из любых ОС и ЯП? Ответ прост: поднять свой ftp-сервер.
В этот раз без консоли не обойтись. Заряжайте биты в байты, делайте sudo apt update и готовьтесь создавать собственное ftp-хранилище с возможностью быстрой миграции данных из swift-хранилища.
Установка и настройка ftp-сервера
Для создания FTP-хранилища будем использовать FTP-сервер vsftpd и VPS на базе Open source под управлением Ubuntu 20. К ресурсам VPS FTP-сервер не требователен, можно использовать минимальную конфигурацию, главное — это объем дискового пространства.
Установка vsftpd
Хорошо, VPS заказали и вошли в него по SSH. Из коробки FTP-сервера в Ubuntu нет. Установим FTP-сервер: sudo apt update && apt install -y vsftpd. Проверим запущен ли демон FTP-сервера: sudo systemctl status vsftpd. Если все установилось и запустилось корректно, вы увидите следующий вывод команды:
Служба установлена и запущена, теперь добавим её в автозагрузку, чтобы она сама стартовала после перезагрузки сервера: sudo systemctl enable vsftpd. Переходим к настройке правил Firewall.
Открытие портов в Firewall
Откроем порты 20, 21 и 990 для подключения пользователей по FTP и 22 порт для подключения по SSH, а также откроем порты с 40000 по 50000 для подключения пользователей к FTP-серверу, когда тот находится в так называемом «пассивном режиме работы»:
sudo ufw allow 20:22,990,40000:50000/tcp
Обратите внимание, что если вы не откроете 22 порт на файерволе — у вас пропадёт возможность подключаться по SSH. Применим новые правила командой sudo ufw enable. Проверить статус новых правил командой sudo ufw status. Команда должна вернуть вывод следующего вида:
Теперь самое интересное — настройка FTP-сервера.
Настройка vsftpd
Конфигурационный файл FTP-сервера расположен по пути: /etc/vsftpd.conf. Сразу переименуем его: mv /etc/vsftpd.conf /etc/vsftpd.conf_original, если что-то сломается в настройках FTP — у нас будет исходник, из которого можно будет все вернуть обратно.
Создайте с помощью любого удобного для вас текстового редактора новый конфигурационный файл и внесите в него следующие данные:
listen=NO
listen_ipv6=YES
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
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
force_dot_files=YES
pasv_min_port=40000
pasv_max_port=50000
user_sub_token=$USER
local_root=/home/$USER/ftp
Сохраните файл и перезапустите службу vsftpd, чтобы применились новые настройки: sudo systemctl restart vsftpd. Убедитесь, что служба работает исправно: sudo systemctl status vsftpd — должен быть статус active.
Теперь можно создавать пользователя, от имени которого будет производиться работа по ftp.
Создание пользователя для работы с FTP
Создадим пользователя, например, ftp_client командой adduser ftp_client. При создании пользователя вам будет предложено придумать обязательный пароль для пользователя и ответить на ряд вопросов, которые можно игнорировать, нажатием на Enter.
После создания пользователя в директории /home появится одноименная директория пользователя, в ней создадим поддиректорию ftp: sudo mkdir /home/ftp_client/ftp. Назначим ей пользователя и группу: sudo chown nobody:nogroup /home/ftp_client/ftp. Зададим права этой директории: sudo chmod a-w /home/ftp_client/ftp.
После этого создадим ещё одну поддиректорию внутри директории ftp: sudo mkdir /home/ftp_client/ftp/files. Укажем владельца этой директории: sudo chown ftp_client: ftp_client /home/ftp_client/ftp/files.
В итоге структура директорий будет выглядеть так:
Отлично, теперь у нас всё готово для подключения по ftp. Убедимся ещё раз в том, что vsfpd работает исправно — systemctl status vsftpd. Статус actived — можно двигаться дальше.
Подключение по FTP
Подключимся 3 разными способами: через Windows CMD, CyberDuck и FileZilla.
Подключение через Windows CMD
Вызовем CMD через меню поиск или пуск, вводим команду ftp. Затем введем команду open [ip-адрес сервера], далее нам нужно ввести имя пользователя, в нашем случае это ftp_client, а затем пароль. Всё мы вошли на сервер:
Сейчас мы находимся в директории ftp нашего пользователя, нам нужно перейти на один уровень ниже — в поддиректорию files. Сделать это можно командой cd files:
Теперь попробуем загрузить что-нибудь по ftp. Я загружу картинку в формате jpg со своей локальной машины: put D:\photo.jpg ph.jpg.
Все отлично работает. Со скачиванием ситуация такая же: используем команду get, с указанием файла, который нужно скачать и пути, куда нужно скачать:
Теперь попробуем всё то же самое в FileZilla.
Подключение через FileZilla
FileZilla — это бесплатное ПО для работы с FTP. Скачать можно отсюда. Запустим FileZilla и укажем следующие параметры для подключения:
- Хост — IP-сервера;
- Имя пользователя — пользователь ftp;
- Пароль — пароль пользователя ftp;
- Порт можно не указывать.
После подключения вы увидите справа проводник FTP-сервера. Копировать файлы и папки можно простым перетаскиванием, удалить кнопкой delete или с помощью выпадающего меню. Например, я скопировал папку с фотографиями со своего локального компьютера на ftp-сервер:
Всё отлично работает. Попробуем теперь другой путь — будем использовать популярный швейцарский нож для подключения — CyberDuck.
Подключения через CyberDuck
CyberDuck в отличие от FileZilla поддерживает множество протоколов подключения. Один из которых — это, конечно же, FTP. CyberDuck — это shareware ПО, с очень ненавязчивыми попытками получения доната — а-ля WinRAR.
Запускаем CyberDuck, в списке протоколов для подключения выбираем FTP и вводим следующие данные:
- Сервер — IP-адрес сервера;
- Пользователь — пользователь ftp;
- Пароль — пароль пользователя ftp.
После подключения CyberDuck выведет список директорий и файлов. В моём случае это выглядит так:
Копирование, перемещение, удаление и прочие операции здесь делаются также, как и в FileZilla — через drag-n-drop и стандартные клавиши Windows.
С подключениями из разных программ по FTP — разобрались. Всё работает. Давайте теперь рассмотрим кейс миграции файлов из уже существующего swift-хранилища в наше новое ftp-хранилище.
Миграция файлов из swift- в ftp-хранилище
Есть два пути миграции: сложный путь, с установкой Python-пакетов, OpenStack-клиента и выкачкой swift-контейнера на сервер; простой путь, без установки дополнительного софта на сервер, но с прокачкой большого количества трафика через вашу локальную машину.
Мы рассмотрим простой путь. Для быстрой миграции файлов и директорий из swift- в ftp-хранилище нам понадобиться рассмотренная выше программа — CyberDuck. Суть в том, чтобы одновременно открыть 2 сетевых соединения и просто перекинуть файлы между двумя открытыми окнами CyberDuck.
Запустим сначала одну копию CyberDuck и подключимся по FTP. Затем откроем вторую копию программы и подключимся к swift-хранилищу. Вот как выглядит подключение CyberDuck к S3-хранилищу 1cloud:
- Протокол подключения — OpenStack Swif (Ketstone 2.0);
- Сервер — Endpoint: https://1cloud.store:443/
- TennantID:Access Key — TenantId: TenantId и AccessKey: C4595_admin
- Secret Key — Password: 0C5UsjTyOop7
Расположим теперь две копии CyberDuck в режиме split-mode экрана и просто перетянем папку с файлами из swift-хранилища в директорию files в FTP-хранилище:
Всё! Копирование пошло. В ряде случаев, может потребоваться несколько раз подтвердить вход на ftp-сервер паролем пользователя ftp. Итак, давайте подведём итог.
Кратко об установке и настройке FTP-хранилища
Вот как максимально кратко может выглядеть инструкция по установке и настройке FTP-сервера:
- Установка vsftpd и настройка FireWall:
- sudo apt update && apt install -y vsftpd;
- sudo systemctl enable vsftpd;
- sudo ufw allow 20:22,990,40000:50000/tcp;
- sudo ufw enable;
- ufw status verbose.
- Создание пользователя ftp:
- sudo adduser ftp_client;
- sudo mkdir /home/ftp_client/ftp;
- sudo chown nobody:nogroup /home/ftp_client/ftp;
- sudo chmod a-w /home/ftp_client/ftp;
- sudo mkdir /home/ftp_client/ftp/files;
- sudo chown ftp_client: ftp_client /home/ftp_client/ftp/files;
- Настройка vsftpd:
- mv /etc/vsftpd.config /etc/vsftpd.config_orig;
- vim /etc/vsftpd.config:
listen=NO
listen_ipv6=YES
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
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
force_dot_files=YES
pasv_min_port=40000
pasv_max_port=50000
user_sub_token=$USER
local_root=/home/$USER/ftp - systemctl restart vsftpd.
Для подключения к FTP-серверу можно использовать Windows CMD, CyberDuck, FileZilla и прочие программы коннекторы. Преимущества собственного FTP-хранилища на базе VPS:
- тонкая настройка политик безопасности и доступов;
- установка любого дополнительного софта на сервер;
- отслеживание действий на сервере по логам;
- быстрая миграция данных с сервера;
- настройка WEB-интерфейса через Nginx;
- масштабируемость хранилища (только Enterprise VPS).
Отдельно подсветим то, что FTP-хранилище абсолютно не требовательно к мощности сервера. Достаточно будет самой простой конфигурации, например, VPS на базе Open Source с 1 CPU, 1 RAM и 100 Gb SSD,если вам хочется масштабировать хранилище в будущем, стоит обратить внимание на Enterprise VPS.