В данной статье пойдет речь об установке и базовой настройке FTP под операционной системой Ubuntu 16.04. В роли FTP сервера будем использовать proftpd, для заливки файлов будем использовать FileZilla клиент.
Установка proftpd сервера
На данный момент Google дает 300$ на триальное использование GCP (Google Cloud Platform), чем мы и воспользуемся для поднятия виртуальной машины Ubuntu 16.04. Сначала находим наиболее близкий к нам регион используя сайт — gcping.com. Как только вы перейдете по данной ссылке, браузер “начнет пинговать” gcp регионы и создаст ваш собственный ТОП по задержке. Выбираете самую низкую.
Далее идем в console.cloud.google.com и создаем виртуальную машину в выбранном регионе. Самый мелкий инстанс (g1-small) мне обошелся 13$ в месяц.
rgb000@deep-bivouac-184505:~$ gcloud compute instances list NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS u16 europe-west3-a g1-small 10.138.0.2 35.185.210.109 RUNNING
ОС у нас есть, теперь можно установить нужные пакеты.
root@u16:~# apt update -y && apt upgrade -y && apt install proftpd-basic
При установке выбираем standalone режим работы. На этом этапе установка завершена.
Настройка proftpd сервера
FTP сервер нужно настраивать исходя из нужд и специфики вашей системы. Мой подход – это создание и хранение пользователей и групп в отдельных файлах, нежели добавление их в систему через /etc/passwd, /etc/group. Также, все залитые файлы будут иметь один и тот же UID и GID, но каждый пользователь будет привязан только ко своей домашней папке.
Для начала добавляем новую системную группу для FTP и привязываем к proftpd пользователю:
root@u16:~# groupadd -g 3000 proftpd root@u16:~# usermod -g proftpd proftpd root@u16:~# id proftpd uid=113(proftpd) gid=3000(proftpd) groups=3000(proftpd)
Как видим, созданный при установке, proftpd пользователь теперь имеет UID=113 и GID=3000.
Теперь можно создать первого FTP пользователя в альтернативном файле ftp.passwd используя утилиту ftpasswd. Можно использовать маленький скрипт.
root@u16:~# cat ftp_add_user.sh #!/bin/bash FTP_USER="frodo" FTP_HOME_DIR="/var/www/frodo" FTP_PASSWORD="TpOeBFPDzCQYK5nRd" FTP_USER_ID="113" FTP_GROUP_ID="3000" mkdir -pv "$FTP_HOME_DIR" chown -v proftpd:proftpd "$FTP_HOME_DIR" echo "$FTP_PASSWORD" | ftpasswd --passwd --file /etc/proftpd/ftpd.passwd --name "$FTP_USER" --home "$FTP_HOME_DIR" --shell /bin/false --uid "$FTP_USER_ID" --gid "$FTP_GROUP_ID" --stdin
Запускаем скрип.
root@u16:~# bash ftp_add_user.sh mkdir: created directory '/var/www/frodo' changed ownership of '/var/www/frodo' from root:root to proftpd:proftpd ftpasswd: using alternate file: /etc/proftpd/ftpd.passwd ftpasswd: creating passwd entry for user frodo ftpasswd: entry created
Теперь добавляем конфигурацию для proftpd сервера.
root@u16:~# cat /etc/proftpd/conf.d/security.conf # Привязать пользователя к домашней папке DefaultRoot ~ # Выключаем вывод информации о сервере при логине ServerIdent off # Альтернативный файл с пользователями AuthUserFile /etc/proftpd/ftpd.passwd # Если сервер за NAT: маскарадинг внешнего ІР или домена (можно и без него) MasqueradeAddress 35.185.210.109 # Если сервер за NAT: для добавления в Firewall при пассивном режиме передачи. PassivePorts 60000 65535
Делаем рестарт и заканчиваем с базовой настройкой.
root@u16:~# service proftpd restart
Так как я использую google cloud, нужно разрешить весь исходящий трафик и входящий для указанного диапазона портов и самого proftpd сервера, а именно:
- TCP 20, 60000:65535 – для передачи данных
- TCP 21 – для передачи команд
Теперь можно заливать файлы.
Настройка FTP клиента
Долго не думаю устанавливаем FileZilla клиент под Windows, запускаем и добавляем наш FTP сервер.
Далее жмем Соединиться и заливаем тестовый файлик.
Как видим, тестовый файлик успешно залился.
Переходим на сервер и проверяем права на файлик.
root@u16:~# ls -l /var/www/frodo/ total 3784 -rw-r--r-- 1 proftpd proftpd 3873197 Nov 4 06:40 P61223-222401.jpg
Как раз то, чего мы добивались.
В итоге мы подняли рабочий FTP сервер за 15 мин с минимальной конфигурацией.
Здесь я не описывал детали и нюансы, связанные с Активной и Пассивной передачей данных, об этом можете почитать в статье из дополнительной литературы, приведенной ниже. Вкратце, при Активной передаче клиентская машина открывает локальный порт для передачи команд (> 1023) и порт для передачи данных (> 1023), подключается к 21 порту FTP сервера и отправляет ему номер порта данных. Далее, сервер говорит ОК и инициирует подключение к этому клиентскому порту. Если на обоих сторонах нет NAT/Firewall (или нормально настроено под FTP передачу), то все будет ок. Во всех остальных случаях, попытка сервера подключиться на прямую к порту данных клиента будет заблокирована (firewall, antivirus, etc).
В связи с этим придумали Пассивную передачу данных. В этом случаи клиент открывает локальный порт для передачи команд (> 1023), порт для передачи данных (> 1023), но передает только сигнал PASV, что говорит серверу, чтобы тот сам открыл у себя порт для передачи данных и сообщил о нем клиенту. Сервер, получив сигнал, открывает у себя порт для передачи данных (из заданного нами диапазона) и отправляет его клиенту. Ну и клиент, соответственно, уже сам подключается к северу к нужному порту данных.
В следующей статье пойдет речь о модуле mod_ctrls, который позволяет управлять поведением proftpd в реальном времени.
Материалы
Proftpd: Использование AuthUserFiles
Proftpd: Список всех директив
Proftpd: За NAT-ом
FTP: Активная vs Пассивная передача
Добрый день. поднял у себя proftpd, при залитии на сервер или удалении файла возникает ошибка как листинге. После удаления не обновляется список файлов и удаленный файл продолжает присутствовать в списке. Надо переконекчиваться к серверу. Может подскажете в какую сторону копать.
Статус: Соединяюсь с xx.xx.xx.xx…
Статус: Соединение установлено, ожидание приглашения…
Статус: Небезопасный сервер, не поддерживает FTP через TLS.
Статус: Авторизовались
Статус: Начинаю закачивать E:\Media\1234.mp3
Команда: CWD /
Ответ: 250 CWD command successful
Команда: TYPE I
Ответ: 200 Type set to I
Команда: PASV
Ответ: 227 Entering Passive Mode (xx,xx,xx,xx,241,169).
Команда: STOR 1234.mp3
Ответ: 150 Opening BINARY mode data connection for 1234.mp3
Ошибка: Соединение закрыто сервером
Ошибка: Передача файла потерпела неудачу после передачи 3 414 771 байт в 1 секунда
Статус: Отключен от сервера
Статус: Соединяюсь с xx.xx.xx.xx…
Статус: Соединение установлено, ожидание приглашения…
Статус: Небезопасный сервер, не поддерживает FTP через TLS.
Статус: Авторизовались
Статус: Начинаю закачивать E:\Media\1234.mp3
Статус: Получение списка каталогов «/»…
Статус: Файл передан успешно, передан 928 байт в 1 секунда
Здравствуйте. Здесь может быть проблема с вашим локальным фаерволом (хост, с которого заливаете файл). В настройках клиента поставте Passive mode, выключите фаервол и попробуйте залить снова