Соединение осуществляется по двум каналам, передача команд и передача данных, данные могут передаваться в двух режимах:
Активный режим - клиент начинает слушать у себя определенный порт и просит сервер подключится по нему
Пассивный режим - клиент сам подключается к серверу по порту из его диапазона
В обоих случаях нужно настраивать файер на входящие соединения, в первом на клиенте, во втором на сервере
# apt install proftpd
# systemctl enable proftpd
Основной конфигурационный файл /etc/proftpd/proftpd.conf
UseIPv6 off PassivePorts 3000 3020 DefaultRoot ~ # Ограничить пользователей только домашней папкой # Ограничение входа <Limit LOGIN> AllowUser user1,user2 DenyAll </Limit> # Определение клиента, для корректности работы через NAT <IfModule mod_ifsession.c> <class internal> From 192.168.0.0/21[24] </class> <IfClass !internal> MasqueradeAddress public-ip </IfClass> </IfModule>
Изначально работает в UTF8, русские символы в ней поддерживаются, если создать их в другой кодировке то с utf естественно правильно не отобразятся, сменить у сервера кодировку:
#LangDefault ru_RU.UTF8 #LangPath /usr/share/locale #LangEngine on #UseEncoding UTF-8 WINDOWS-1251
Создаем виртуального пользователя:
# ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=username --uid=33 --gid=33 --home=/../folder-ftp --shell=/usr/sbin/nologin
Uid и Gid можно указывать любые, существующие или нет, в примере указан как у системного пользователя www-data. Так же, можно нескольким пользователям задавать одинаковые id.
Создаем дополнительный конфиг /etc/proftpd/conf.d/virtual_file.conf:
RequireValidShell off AuthUserFile /etc/proftpd/ftpd.passwd AuthPAM off LoadModule mod_auth_file.c AuthOrder mod_auth_file.c
Возможно имеет смысл создать отдельного пользователя, с минимальными правами, что бы использовать его ID-шники, а не www-data.
После создания виртуальных пользователей, выбранную папку можно задать им домашней, и включить директиву DefaultRoot, что бы ограничить их только этой папкой, так же, доступ должен соответствовать на уровне ФС.
Далее, создаем отдельный конфиг для директорий /etc/proftpd/conf.d/example.conf
<Directory /../folder-ftp> <Limit WRITE> Order deny,allow AllowUser username </Limit> </Directory>
Список активных модулей, находится в файле: /etc/proftpd/modules.conf
В основном файле конфигурации раскомментируем строку Include /etc/proftpd/tls.conf.
Идем в этот файл и убираем комментарий со следующих строк:
TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol SSLv23 ... TLSRSACertificateFile /etc/ssl/certs/proftpd.crt TLSRSACertificateKeyFile /etc/ssl/private/proftpd.key ... TLSOptions NoCertRequest EnableDiags NoSessionReuseRequired ... TLSVerifyClient off ... TLSRequired on
Затем, генерируем сертификат:
# openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/ssl/private/proftpd.key -out /etc/ssl/certs/proftpd.crt -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=ftp.hostname.local/CN=ftp"