Pure-FTPd+MySQL+Web

Аватар пользователя Raven2000

Мне было необходимо установить FTP сервер с поддержкой учетных записей в MySQL гибким управлением скорости загрузки\закачки для авторизованных и анонимных пользователей, виртуальными хостами, веб-интерфейсом для клиентов и грамотным логированием для статистики (AwStats) с возможностью просмотра через веб интерфейс, и тп. Система OpenBSD и поэтому большинство FTP серверов идет фтопку (как к примеру используемый мною ProFTPD). Ну что же новое это как минимум интересно и полезно ладна хватит лирику и так поехали.

Содержание:

Порты

Из всех выбранных портов мне показался интересным Pure-ftp, он отвечал моим самым изысканным запросам. Да и выбор был невелик.

$ cd /usr/ports/
$ make search name=pure-ftp
Port:   pure-ftpd-1.0.22
Path:   net/pure-ftpd
Info:   small, easy to set up, fast and very secure FTP server
Maint:  Brad Smith <brad@comstyle.com>
Index:  net
L-deps: iconv.>=2::converters/libiconv
B-deps:
R-deps: libiconv-*:converters/libiconv
Archs:  any
 
Port:   pure-ftpd-1.0.22-ldap
Path:   net/pure-ftpd,ldap
Info:   small, easy to set up, fast and very secure FTP server
Maint:  Brad Smith <brad@comstyle.com>
Index:  net
L-deps: iconv.>=2::converters/libiconv ldap.>=2,lber:openldap-client->=2,<3:databases/openldap
B-deps:
R-deps: libiconv-*:converters/libiconv
Archs:  any
 
Port:   pure-ftpd-1.0.22-mysql
Path:   net/pure-ftpd,mysql
Info:   small, easy to set up, fast and very secure FTP server
Maint:  Brad Smith <brad@comstyle.com>
Index:  net
L-deps: iconv.>=2::converters/libiconv lib/mysql/mysqlclient.>=10::databases/mysql
B-deps:
R-deps: libiconv-*:converters/libiconv
Archs:  any
 
Port:   pure-ftpd-1.0.22-postgresql
Path:   net/pure-ftpd,postgresql
Info:   small, easy to set up, fast and very secure FTP server
Maint:  Brad Smith <brad@comstyle.com>
Index:  net
L-deps: iconv.>=2::converters/libiconv pq.>=2::databases/postgresql
B-deps:
R-deps: libiconv-*:converters/libiconv
Archs:  any

Теперь нам ясно, где находится нужный нам порт и что мы сможем с ним сделать. Нам необходим пакет с MySQL и песочницей и virtual_chroot:

$ cd net/pure-ftpd

Посмотрим, какие есть варианты сборок:

$ make show=FLAVORS
ldap mysql postgresql no_banner virtual_chroot

Описание:
Flavors:
ldap - установите поддержку LDAP как источник аутентификации
mysql - установите поддержку MySQL как источник аутентификации
postgresql - установите поддержку PostgreSQL как источник аутентификации
no_banner - установите Pure-FTPd чтобы не отображался баннер при соединении
virtual_chroot - установите Pure-FTPd с возможность следить за симлинками выходящии из песочницы

Соберем данный порт:

$ sudo env FLAVOR="mysql virtual_chroot" make install clean
~~~
--- pure-ftpd-1.0.22-mysql-virtual_chroot -------------------
In order to start Pure-FTPd at boot-time, add something like this to
/etc/rc.local:
 
if [ -x /usr/local/sbin/pure-ftpd ]; then
  echo Starting Pure-FTPd
  /usr/local/sbin/pure-ftpd -A -B -H -u1000
fi
 
===>  Cleaning for pure-ftpd-1.0.22-mysql-virtual_chroot

Конфигурация pure-ftpd.conf

Установили порт и теперь нам необходимо настроить pure-ftpd.

$ cd /usr/local/share/examples/pure-ftpd/
$ ls
pure-ftpd.conf.sample      pureftpd-mysql.conf
pure-vpopauth.pl           xml_python_processors.txt

Нас интересует два конфигурационных файла pure-ftpd.conf.sample и pureftpd-mysql.conf которые скопируем в директорию /usr/local/etc/.

$ sudo mkdir /usr/local/etc/
$ sudo cp pure-ftpd.conf.sample /usr/local/etc/pure-ftpd.conf
$ sudo cp pureftpd-mysql.conf /usr/local/etc/

Приступим к конфигурации.

$ sudo chown u+w  pure-ftpd.conf pureftpd-mysql.conf
$ vi /usr/local/pure-ftpd.conf
 
############################################################
# 28.08.09 - Raven2000
#         Конфигурационный файл для pure-ftpd
#
############################################################
 
# Для запуска Pure-FTPd с этой конфигурацией
# вместо параметров командной строки, запустите
# следующую команду:
#
# /usr/local/sbin/pure-config.pl /usr/local/etc/pure-ftpd.conf
#
# Пожалуйста, не забудьте заглянуть в документацию на сайте
# _http://www.pureftpd.org/documentation.shtml для получения полного списка
# параметров.
 
# Клетка каждого пользователя в его домашней директории
 
ChrootEveryone              yes
 
 
# Если в предыдущей опции было установлено положение "no", то члены следующей
# группы не будет в клетке (chroot). Все остальные будут. Если вы не хотите всех
# сажать в клетку, просто закомментируйте ChrootEveryone и TrustedGID.
 
# TrustedGID                    100
 
 
# Включить хак совместимости, для кривых клиентов
 
BrokenClientsCompatibility  no
 
 
# Максимальное число одновременных пользователей 
 
MaxClientsNumber            50
 
 
# Работать в фоновом режиме
 
Daemonize                   yes
 
 
# Максимальное количество одновременных соединений SIM-клиентов с одного
#  IP адреса
 
MaxClientsPerIP             8
 
 
# Если вы хотите логировать все команды клиента, то установите "yes". 
# Эта директива может дублировать также на лог сервер. 
 
VerboseLog                  no
 
 
# Отображение dot-файлов (показывать или нет файлы начинающиеся с точки), даже 
# если клиент не отправляет команду "-а". Рекомендую скрыть "no"
 
DisplayDotFiles             yes
 
 
# Не разрешать авторизованных пользователей - этот FTP
# предназначен только для анонимных клиентов.
 
AnonymousOnly               no
 
 
# Запретить анонимные соединения. Разрешить только для авторизованных
#  пользователей. 
 
NoAnonymous                 no
 
 
# Средства syslog (auth, authpriv, daemon, ftp, security, user, local*)
# По умолчанию "ftp". "none" - отключает логирование.
 
SyslogFacility              ftp
 
 
# Показывать сообщения (необходимо создать файл и прочитать man). Например
# приветствие сервера, правила работы или шутки.
 
# FortunesFile              /usr/share/fortune/zippy
 
 
# Не резольвить имена хостов в логах. Логи становятся менее информативными, 
# но и ресурсов требуется меньше. Установка "yes" - имеет смысл ставить на очень
# загруженных серверах, или при неработающем DNS.
 
DontResolve                 yes
 
 
# Максимальное время простоя в минутах (по окончании соединение закрывается)
# (по умолчанию = 15 минут)
 
MaxIdleTime                 15
 
 
# Файл конфигурации LDAP (смотрите README.LDAP)
 
# LDAPConfigFile                /etc/pureftpd-ldap.conf
 
 
# Файл конфигурации MySQL (смотрите README.MySQL)
 
MySQLConfigFile               /usr/local/etc/pureftpd-mysql.conf
 
 
# Файл конфигурации Postgres (смотрите README.PGSQL)
 
# PGSQLConfigFile               /etc/pureftpd-pgsql.conf
 
 
# База данных пользователей PureDB (смотрите README.Virtual-Users)
 
# PureDB                        /etc/pureftpd.pdb
 
 
# Путь к сокету pure-authd (смотрите README.Authentication-Modules)
 
# ExtAuth                       /var/run/ftpd.sock
 
 
# Если вы хотите использовать PAM аутентификацию то
# раскомментируйте следующую строку
 
# PAMAuthentication             yes
 
 
# Если нужна простая системная, Unix аутентификация (/etc/passwd), то
# раскомментируйте следующую строку
 
# UnixAuthentication            yes
 
 
# Обратите внимание, что LDAPConfigFile, MySQLConfigFile, 
# PAMAuthentication и UnixAuthentication могут использоваться только
# один раз, но они могут работать вместе. Например, если вы
# используете MySQLConfigFile, затем UnixAuthentication, то идёт запрос
# к Server SQL. Если в БД такой пользователь не найден, то пробуется 
# системный пользователь в /etc/passwd и /etc/shadow. Если проверка подлинности
# в SQL неудачна по причине неправильного пароля, то происходит
# остановка дальнейшего поиска пользователя. Методы аутентификации
# будут пользоваться в порядке в котором они были заданы
 
 
# Ограничения рекурсии команды 'ls'. Первй аргумент - максимально число файлов,
# которые будет показаны. Второе - максимальное число подкаталогов
 
LimitRecursion              2000 8
 
 
# Позволить ли анонимным пользователям создавать новые директории?
 
AnonymousCanCreateDirs      no
 
 
# Если система загружена более, чем указанное тут значение, то
# анонимным пользователям не разрешается скачивать.
 
MaxLoad                     4
 
 
# Диапазон портов для пассивного ответа соединения. Для файрвола.
 
# PassivePortRange          30000 50000
 
 
# Принудительный IP адрес в PASV/EPSV/SPSV ответах. Для NAT.
# Символические имена хостов такде приняты для шлюзов с динамическим IP адресом.
 
# ForcePassiveIP                192.168.0.1
 
 
# Соотношение upload/download для анонимных пользователей.
 
# AnonymousRatio                1 10
 
 
# Соотношение upload/download для всех пользователей.
# Эта директива не перекрывает предыдущую.
 
# UserRatio                 1 10
 
 
# "WaReZ защита". Не разрешает анонимным пользователям загружать (download)
# файлы, владельцем которых является "ftp" (как правило, файлы, загруженные
# с другими анонимными пользователями). Закачка должны быть подтверждены
# системным администратором (chown другому пользователю), прежде чем этот
# файл будет доступен для скачивания.
 
AntiWarez                   yes
 
 
# IP адрес/порт для прослушивания (по умолчанию = all IP и порт 21).
 
# Bind                      127.0.0.1,21
 
 
# Максимальная пропускная способность для анонимных пользователей в KB/s
 
# AnonymousBandwidth            8
 
 
# Максимальная пропускная способность для всех пользователей (в том числе
# анонимные) в KB/s. Используйте AnonymousBandwidth или UserBandwidth,
# использовать оба, не имеет смысла.
 
# UserBandwidth             8
 
 
# Маска для создаваемых файлов. <umask for files>:<umask for dirs>.
# 177:077 - если вы чувствуете себя параноиком.
 
Umask                       133:022
 
 
# Минимальный UID с которым пользователь будет авторизован. 
# (рекомендую указать от 1000)
 
MinUID                      100
 
 
# Разрешить передачу FXP для авторизованных пользователей.
 
AllowUserFXP                no
 
 
# Разрешить передачу FXP для анонимных и не анонимных пользователей. 
 
AllowAnonymousFXP           no
 
 
# Пользователи не могут удалять и\или изменять файлы начинающиеся с точки '.'
# даже если они их владельцы. Если TrustedGID включена, эта группа будет иметь
# доступ дот-файлам.
 
ProhibitDotFilesWrite       no
 
 
# Запретить чтение файлов начинающихся с точки '.' (.history, .ssh...)
 
ProhibitDotFilesRead        no
 
 
# Никогда не перезаписывать файлы. Когда имя, для закачиваемго файла уже
# существует, он будет автоматически переименован в file.1, file.2, file.3, ...
 
AutoRename                  no
 
 
# Запретить анонимным пользователям загружать новые файлы (no = upload разрешён)
 
AnonymousCantUpload         no
 
 
# Только подключения к этому конкретному IP адресу могут быть не анонимными. Вы
# можете использовать эту директиву чтобы открыть несколько публичных IP
# адреса для анонимного FTP, и оставить приватный, защищенный файрволом IP для
# удалённого администрирования. Вы также можете разрешить не маршрутизируемые
# локальные IP (например, 10.x.x.x) для аутентификации и оставить публичный
# для анонимных пользователей FTP-сервер на другом IP.
 
#TrustedIP                  10.1.1.1
 
 
# Если вы хотите чтобы PID добавлялся в каждую строку лога,
# то раскомемнтируйте следующую строку.
 
#LogPID                     yes
 
 
# Создать дополнительный файл журнала с  переданными файлами в Apache-подобном
# формате:
# fw.c9x.org - jedi [13/Dec/1975:19:36:39] "GET /ftp/linux.tar.bz2" 200 21809338
# Этот лог-файл может быть обработан программами для анализа логов апача AwStats
 
# AltLog                     clf:/var/log/pureftpd.log
 
 
# Создать дополнительный файл журнала в формате с  переданными файлами
# оптимизированном для статистических отчётов.
 
# AltLog                     stats:/var/log/pureftpd.log
 
 
#Создать дополнительный файл журнала в формате с переданными файлами в стандарте
# W3C. Этот формат совместим с большинством коммерческих анализаторов лог-файлов
 
# AltLog                     w3c:/var/log/pureftpd.log
 
 
# Запрет CHMOD команд. Пользователи не смогут менять разрешения
# на своих файлах.
 
#NoChmod                     yes
 
 
# Разрешить пользователям закачивать, но не удалять файлы.
 
#KeepAllFiles                yes
 
 
# Автоматически создавать домашние директории пользователям, если они отсутствует
 
#CreateHomeDir               yes
 
 
# Включить виртуальную квоту. Первое число - максимальное число файлов.
# Второе число - максимальный размер, в мегабайтах.
# Итак 1000:10 ограничивает каждого пользователя 1000 файлов и 10 Мб.
 
#Quota                       1000:10
 
 
# Если ваш pure-ftpd скомпилен с поддержкой standalone режима, вы можете изменить
# местоположение pid-файла. По умолчанию используется /var/run/pure-ftpd.pid
 
#PIDFile                     /var/run/pure-ftpd.pid
 
 
# Если pure-ftpd скомпилен с поддержкой pure-uploadscript,
# то этот пункт позволяет писать информацию о новых загруженных
# файлах в /var/run/pure-ftpd.upload.pipe так, что pure-uploadscript может
# прочесть их и обработать загруженный файл.
 
#CallUploadScript yes
 
 
# Эта опция полезна на серверах, где позволен upload анонимным пользователям. 
# Разрешается. Если /var/ftp находится в отдельном разделе /var, это позволяет
# сохранить свободное место и защитить файлы логов. Когда процент
# заполнения больше чем указанный тут, аплоад автоматом запрещается.
 
MaxDiskUsage               99
 
 
# Установите 'yes' в этой опции если не хотите разрешить пользователям
# переименовывать файлы.
 
#NoRename                  yes
 
 
# Включить 'customer proof'. Как обход против распространенных ошибок клиентов
# к примеру 'chmod 0 public_html'. Чтобы исключить некоторые проблемы.
 
CustomerProof              yes
 
 
# Число параллельных процессов. Он будет работать только если ftp сервер
# был собран с опцией '--with-peruserlimits'
# Формат:
# <максимум сессий на пользователей>:<максимум сеансов анонимных пользователей>
# Например, 3:20 означает, что авторизованный пользователь может иметь 3 активных
# активных сессии. А для всех анонимных пользователей - максимум 20 сессий.
 
# PerUserLimits            3:20
 
 
# Если файл загружается на сервер, и есть предыдущая его версия с тем же именем,
# то старый файл не будет ни удалён ни усечён. Загрузка будет произведена
# во временный файл и по окончании загрузки будет произведено атомарное
# переключение к новой версии файла. Например, при загрузке большого PHP
# сценария, апач будет работать со старой версией до полной загрузки
# и немедленно переключится на новый как только, он будет полностью передан
# Эта опция несовместима с виртуальными квотами.
 
# NoTruncate               yes
 
 
# Этот параметр (TLS) может принимать три значения: 
# 0 - отключить SSL/TLS шифрование (по-умолчанию).
# 1 - принимать обычные и шифрованные подключения.
# 2 - отклонять подключения которые не используют SSL/TLS, 
# включая анонимные соединения.
# Не раскомментируйте это вслепую. Проверьте, что:
# 1) Ваш сервер был собран с поддержкой SSL/TLS (--with-tls),
# 2) На месте есть действительный сертификат,
# 3) Только совместимые клиенты будут заходить.
 
# TLS                      1
 
 
# Слушать только IPv4 адреса в режиме standalone(автономном режиме)
# (т.е. IPv6 отключен). По дефолту, IPv4 и IPv6 включены.
 
# IPV4Only                 yes
 
 
# Слушать только IPv6 адрес в режиме standalone (т.е. IPv4 отключен)
# По дефолту, IPv4 и IPv6 включены. (IPv6 я обычно отключаю)
 
# IPV6Only                 yes
 
# Поддержка UTF-8 для имён файлов (RFC 2640)
# Определите кодировку для файловой системы сервера и, опционально,
# дефолтовую кодировку для клиентов, которые не используют UTF-8.
# Работает тока если pure-ftpd скомпилен с '--with-rfc2640'
 
# FileSystemCharset     big5
# ClientCharset         big5

Конфигурация pureftpd-mysql.conf

Приступим к редактированию файла соединения с сервером MySQL.

$ sudo vi /usr/local/etc/pureftpd-mysql.conf
 
##############################################
# 28.08.09 - Raven2000
# Конфигурационный файл pure-ftpd для MySQL.
# Смотрите README.MySQL для объяснений.
#
##############################################
 
 
# Опционально: Имя или IP адрес MySQL-сервера. Не задавать этот
# пункт, если используется локальный unix сокет.
 
MYSQLServer     127.0.0.1
 
 
# Опционально: Порт MySQL. Не задавать этот
# пункт, если используется локальный unix сокет.
 
MYSQLPort       3306
 
 
# Опционально: Задаётся имя сокета и местоположения mysql.sock если MySQL сервер
# работает на этом же узеле.
 
MYSQLSocket     /tmp/mysql.sock
 
 
# Обязательно: пользователь, которым работаем с MySQL.
 
MYSQLUser       root
 
 
# Обязательно: пароль пользователя, от которого работаем в MySQL.
 
MYSQLPassword   rootpw
 
 
# Обязательно: БД с которой работаем.
 
MYSQLDatabase   pureftpd
 
 
# Mandatory : how passwords are stored
# Valid values are : "cleartext", "crypt", "md5" and "password"
# ("password" = MySQL password() function)
# You can also use "any" to try "crypt", "md5" *and* "password"
 
MYSQLCrypt      cleartext
 
 
# В последующих директивах части строк заменены, до
# выполнения запроса:
#
# \L заменяется именем пользователя который логинится.
# \I заменяется IP адресом сервера, на который заходит пользователь
# \P заменяется номером порта с которым соединился пользователь.
# \R заменяется IP адресом пользователь.
# \D заменяется IP адресом пользователь, в виде long decimal number
#
# Очень сложные запросы могут быть выполнены с помощью совмещения этих строк,
 
# Запрос на получение пароля из БД:
 
MYSQLGetPW      SELECT Password FROM users WHERE User="\L"
 
 
# Запросов на получение системного имени пользователя, или UID
 
MYSQLGetUID     SELECT Uid FROM users WHERE User="\L"
 
 
# Опционально: default UID вместо запроса на его извлечение MYSQLGetUID
 
#MYSQLDefaultUID 1000
 
 
# Запрос на получение имени группы или gid
 
MYSQLGetGID     SELECT Gid FROM users WHERE User="\L"
 
 
# Опционально: default GID - вместо запроса MYSQLGetGID
 
#MYSQLDefaultGID 1000
 
 
# Запрос на получения домашней директории
 
MYSQLGetDir     SELECT Dir FROM users WHERE User="\L"
 
 
# Опционально: Запрос на максимальное число файлов у пользователя
# Pure-FTPd должен был собран с поддержкой виртуальных квот.
 
# MySQLGetQTAFS  SELECT QuotaFiles FROM users WHERE User="\L"
 
 
# Опционально: запрос на квоту использования диска (виртуальных квот)
# Число должно быть в мегабайтах.
# Pure-FTPd должен был собран с поддержкой виртуальных квот.
 
# MySQLGetQTASZ  SELECT QuotaSize FROM users WHERE User="\L"
 
 
# Опционально: Коэффициенты. Запросы на соотношение download/upload.
# Сервер должен быть собран с ratio поддержкой.
 
# MySQLGetRatioUL SELECT ULRatio FROM users WHERE User="\L"
# MySQLGetRatioDL SELECT DLRatio FROM users WHERE User="\L"
 
 
# Опционально: Полосой пропускания для пользователя. Сервер должен быть
# собран с throttling  опцией. Значение в KB/s .
 
# MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User="\L"
# MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User="\L"
 
# Разрешить расширение "~" . НИКОГДА не делайте этого, если:
# 1) Вы точно знаете что делаете.
# 2) Совпадают реальные и виртуальные юзеры.
 
# MySQLForceTildeExpansion 1
 
 
# Если Вы обновили таблицы до транзакционных (Gemini,
# BerkeleyDB, Innobase...), можно включить транзакции SQL
# Оставьте закомменченым, если используются MyISAM базы данных,
# или старая версия MySQL (< 3.23.x).
 
# MySQLTransactions On

Работа с СУБД

Установка MySQL для OpenBSD.
Теперь будем подключать Pure-ftp к MySQL для начала желательно прочитать:

$ more /usr/local/share/doc/pure-ftpd/README.MySQL

Как сказано в README.MySQL создадим sql файл для создания запроса в БД.

$ cat table_user.sql
CREATE TABLE users (
  User VARCHAR(16) BINARY NOT NULL,
  Password VARCHAR(64) BINARY NOT NULL,
  Uid INT(11) NOT NULL default '-1',
  Gid INT(11) NOT NULL default '-1',
  Dir VARCHAR(128) BINARY NOT NULL,
  PRIMARY KEY  (User)
);

И файл для создания пользователя (в дальнейшем лучше написать скрипт):

$ cat user_ftp.sql
INSERT INTO `users` VALUES ('Raven2000', '12345', 1000, 1000, '/home/Raven2000');

Далее (пример) как вы уже откорректировали под себя конфигурационный файл pureftpd-mysql.conf:

$ sido vi /usr/local/etc/pureftpd-mysql.conf
MYSQLServer     127.0.0.1
#MYSQLPort       3306
MYSQLSocket     /tmp/mysql.sock
MYSQLUser       user_pureftpd
MYSQLPassword   user_pureftpd_pw
MYSQLDatabase   homenet_pureftpd
MYSQLCrypt      cleartext
MYSQLGetPW      SELECT Password FROM users WHERE User="\L"
MYSQLGetUID     SELECT Uid FROM users WHERE User="\L"
MYSQLGetGID     SELECT Gid FROM users WHERE User="\L"
MYSQLGetDir     SELECT Dir FROM users WHERE User="\L"

Создадим БД и пользователя имеющего полные права на созданную БД.

$ sudo mysqladmin -h 127.0.0.1 --user=root --password=root_pw create homenet_pureftpd
$ sudo mysql -h 127.0.0.1 --user=root --password=root_pw -e"GRANT ALL ON homenet_pureftpd.* TO user_pureftpd@127.0.0.1 IDENTIFIED BY 'user_pureftpd_pw'" homenet_pureftpd

Теперь создадим структуру БД и добавим пользователя FTP:

$ sudo mysql -h 127.0.0.1 --user=root --password=root_pw
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.37-log OpenBSD port: mysql-server-5.1.37
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
mysql> use  homenet_pureftpd;
Database changed
mysql> source /usr/local/etc/table_user.sql;
Query OK, 0 rows affected (0.00 sec)
 
mysql> source /usr/local/etc/user_ftp.sql;
Query OK, 1 row affected (0.00 sec)

Проверим:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| homenet_pureftpd   |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.02 sec)
 
mysql> use homenet_pureftpd;
Database changed
mysql> show tables from homenet_pureftpd;
+----------------------------+
| Tables_in_homenet_pureftpd |
+----------------------------+
| users                      |
+----------------------------+
1 row in set (0.02 sec)
 
mysql> select user,password,dir,uid,gid from users;
+-----------+----------+-----------------+------+------+
| user      | password | dir             | uid  | gid  |
+-----------+----------+-----------------+------+------+
| Raven2000 | 12345  | /home/Raven2000 | 1000 | 1000 |
+-----------+----------+-----------------+------+------+
1 row in set (0.00 sec)

Все в порядке движемся дальше.

Директории и anonymous

Для начала определимся, что нам необходимо от ftp и как все должно выглядеть - базовая настройка.

  • Работа с авторизированными пользователями
    • Дать возможность полной работы со своими файлами и директориями (своя домашняя директория на сервере)
  • Работа с анонимными пользователями
    • Дать возможность скачивать (download) файлы из общей директории
    • Дать возможность закачивать (upload) файлы в специальную директорию upload
    • Запретить скачивание (download) из директории upload (те загрузили - молодцы я приду, проверю и вынесу в общую директорию. Не хочу чтобы мой добрый сервис использовали в качестве распространении порно и вареза)

Создаем пользователя ftp для работы не авторизированных - анонимных пользователей. Эта учетная запись не должна использовать пароль. Так же нам необходимо создать домашнюю директорию. И к слову говоря этому пользователю не нужно быть в учетных записях БД MySQL
Добавим псевдо shells для анонимных пользователей:

$ sudo echo /usr/bin/false >> /etc/shells

Добавим учетную запись и директорию пользователя. Анонимным пользователям не нужна учетка в БД.

$ sudo adduser
Use option ``-silent'' if you don't want to see all warnings and questions.
 
Reading /etc/shells
Check /etc/master.passwd
Check /etc/group
 
Ok, let's go.
Don't worry about mistakes. There will be a chance later to correct any input.
Enter username []: ftp
Enter full name []: anonymous ftp
Enter shell csh false ksh nologin sh [ksh]: false
Uid [1001]: Enter
Login group ftp [ftp]: Enter
Login group is ``ftp''. Invite ftp into other groups: guest no
[no]: no
Login class authpf daemon default mysql staff [default]: Enter
Enter password []: Enter
Set the password so that user cannot logon? (y/n) [n]: y
 
Name:        ftp
Password:    ****
Fullname:    anonymous ftp
Uid:         1001
Gid:         1001 (ftp)
Groups:      ftp
Login Class: default
HOME:        /home/ftp
Shell:       /usr/bin/false
OK? (y/n) [y]: y
Added user ``ftp''
Copy files from /etc/skel to /home/ftp
Add another user? (y/n) [y]: n
Goodbye!

Создадим директории и установим необходимые права:

  • /home/ftp - это основная директория. Она должна принадлежать root и иметь разрешение 755 (или для фанов 555)
  • /home/ftp/pub - иногда делают каталог pub это стандартный каталог для файлов которыми вы хотите поделится. Она должна иметь разрешение 755 (или для фанов 555)
  • /home/ftp/upload - это стандартный каталог (можете называть и incoming) для загрузки файлов анонимными пользователями. Она должна иметь разрешение 755 (или для фанов 555)

Создадим необходимые директории и укажем права:

$ sudo mkdir -p /home/ftp/upload
$ sudo chown -R root:ftp /home/ftp
$ sudo chmod -R 755 /home/ftp
$ sudo chmod -R 1775 /home/ftp/upload

И теперь все анонимные пользователи смогут загружать все свои файлы в директорию /home/ftp/upload (но от туда уже им не удалить и не скачать ;)). Далее администратор скопирует нужный и удалит не нужные файлы в подходящую директорию и будет возможность анонимным пользователям скачать их.

Запуск

Для запуска при перезагрузке системы добавляем в файл /etc/rc.local следующее

$ cat /etc/rc.local
# Pure-ftp
if [ -x /usr/local/sbin/pure-config.pl ]; then
  echo 'Starting Pure-FTPd'; /usr/local/sbin/pure-config.pl /usr/local/etc/pure-ftpd.conf
fi

Запустим Pure-FTPd и проверим его работоспособность:

$ sudo /usr/local/sbin/pure-config.pl /usr/local/etc/pure-ftpd.conf
Running: /usr/local/sbin/pure-ftpd -A -c50 -B -C8 -D -fftp -H -I15 -lmysql:/usr/local/etc/pureftpd-mysql.conf -L2000:8 -m4 -s -U133:022 -u999 -g/var/run/pure-ftpd.pid -k99 -Z -4
$ ps -ax |grep ftp
21284 ??  Ss      0:00.00 pure-ftpd: -pure-ftpd (SERVER) (pure-ftpd)

Смотрим кто и что качает:

$ sudo /usr/local/sbin/pure-ftpwho
 
+------+---------+-------+------+-------------------------------------------+
| PID  |  Login  |For/Spd| What |                 File/IP                   |
+------+---------+-------+------+-------------------------------------------+
|26663 | ftp     | 00:00 |  UL  | adminstudioconfigurationmanagered.exe|
|  ''  |    ''   |   7M/s|  ''  | ->                   chief_it.***.local |
+------+---------+-------+------+-------------------------------------------+
 
$ sudo /usr/local/sbin/pure-ftpwho
 
+------+---------+-------+------+-------------------------------------------+
| PID  |  Login  |For/Spd| What |                 File/IP                   |
+------+---------+-------+------+-------------------------------------------+
|31777 | Raven2000| 00:00 |  UL  | adminstudioconfigurationmanagered.exe|
|  ''  |    ''   |   8M/s|  ''  | ->                   chief_it.***.local |
+------+---------+-------+------+-------------------------------------------+

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

$ ftp 127.0.0.1
Connected to 127.0.0.1.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 09:21. Server port: 21.
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Name (127.0.0.1:Raven2000): Raven2000
331 User Raven2000 OK. Password required
Password:
230-User Raven2000 has group access to:  wheel      Raven2000
230 OK. Current restricted directory is /
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is your current location
ftp> ls
150 Accepted data connection
drwxr-xr-x    8 Raven2000  wheel             512 Aug 31 15:25 net2ftp
-rw-r--r--    1 Raven2000  wheel             223 Aug 31 15:32 db.txt
226-Options: -l
226 2 matches total
ftp> exit;
?Invalid command.
ftp> exit
221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
221 Logout.

В лог файле

$ tail -3 /var/log/xferlog
Sep  1 09:21:06 madcat pure-ftpd: (?@127.0.0.1) [INFO] New connection from 127.0.0.1
Sep  1 09:21:12 madcat pure-ftpd: (?@127.0.0.1) [INFO] Raven2000 is now logged in
Sep  1 09:21:25 madcat pure-ftpd: (Raven2000@127.0.0.1) [INFO] Logout.

Virtual-Users

Добавить Virtual-Users пользователя можно так

$ sudo pure-pw useradd Vasia -m -u ftp -d /home/ftp

Прочтите README.Virtual-Users

Web интерфейс

Использовать будем проверенный временем net2ftp. Его удобно пилить до нужного состояния.

1 - Скачиваем последнюю версию и распаковываем в директорию веб сервера.
2 - Изменим права на директорию /temp как 777.

$ chmod 777 temp/

3 - Изменим настройки в файле settings.inc.php
<?php
//  28.08.09 - Raven2000
// -----------------------------------------------------------------------------
// Базовые настройки
// -----------------------------------------------------------------------------
 
// Введите ваш адрес электронной почты 
// Это используется в качестве адреса "от" при отправке файлов вложений
$net2ftp_settings["email_feedback"] = "webmaster@enter-your-domain-here.com";
 
// Язык и скин по умолчанию (смотрите в директории /languages 
// и /skins чтобы посмотреть имеющиеся)
$net2ftp_settings["default_language"] = "ru";
$net2ftp_settings["default_skin"]     = "blue";
 
// Введите адрес вашей страницы помощи, форума или тикет системы. Добавится
// ссылка в низу страницы. Если у вас нет ничего то оставьте строку пустой.
$net2ftp_settings["help_text"] = "";
$net2ftp_settings["help_link"] = "";
 
// Рапорт PHP об ошибках
//$net2ftp_settings["error_reporting"] = "NONE";
$net2ftp_settings["error_reporting"] = "standard";
//$net2ftp_settings["error_reporting"] = "ALL";
 
// Фиксим прозрачные PNG изображения для IE
$net2ftp_settings["fix_png"] = "yes";
 
// MD5 шифрование строки (замените их для лучшей безопастности)
$net2ftp_settings["encryption_string"] = "462E16CB7C3F369BD9F4DBEE0A926F4FFB3";
 
 
// -----------------------------------------------------------------------------
// Администраторская панель имя пользователя и пароль
// Если пароль не задан то панель не будет доступна.
// -----------------------------------------------------------------------------
 
$net2ftp_settings["admin_username"] = "admin";
$net2ftp_settings["admin_password"] = "admin_pw";
 
 
// -----------------------------------------------------------------------------
// Сообщение в браузере
// -----------------------------------------------------------------------------
 
$net2ftp_settings["message_browse"] = "Welcome to the FTP server!";
 
 
// -----------------------------------------------------------------------------
// MySQL БД опционально. Может быть использована: для логирования пользователей, 
// проверка использования сетевых и серверных ресурсов (объем передачи данных 
// и время выполнения скрипта), а так же проверка домашней директории
// пользователей
// -----------------------------------------------------------------------------
 
// MASTER ПАРАМЕТР который перекрывает другие параметры ниже: использования БД?
$net2ftp_settings["use_database"] = "yes"; // "yes" или "no" (по умолчанию)
 
// Введите MySQL настройки 
$net2ftp_settings["dbusername"] = "user_net2ftp";
$net2ftp_settings["dbpassword"] = "user_pureftpd_pw";
$net2ftp_settings["dbname"]     = "homenet_net2ftp";
$net2ftp_settings["dbserver"]   = "localhost"; // в основном "localhost" 
// Переключатель различных типов журналов или выключатель
$net2ftp_settings["log_access"] = "yes";
$net2ftp_settings["log_error"]  = "yes";
 
// Автоматическое удаление журналов старше Х дней.
$net2ftp_settings["log_length_days"] = 31; // число дней
 
 
// -----------------------------------------------------------------------------
// Вход в систему регистратора
// -----------------------------------------------------------------------------
 
$net2ftp_settings["use_syslog"] = "no";
$net2ftp_settings["syslog_priority"] = LOG_NOTICE;
$net2ftp_settings["syslog_facility"] = LOG_MAIL;
$net2ftp_settings["syslog_ident"] = "net2ftp";
 
 
// -----------------------------------------------------------------------------
// Файлы размором больше чем тут указанны быдут исключенны из:
// upload, download, copy, move, search, view, edit
// -----------------------------------------------------------------------------
 
// 100 MB в байтах, ( по умолчанию 10 MB)
$net2ftp_settings["max_filesize"]  = "100000000";
 
// Примечание: Если вы хотите, чтобы закачивали большие файлы.
// Вам придется отредактировать следующие параметры:
//       1 - в файле php.ini: upload_max_filesize, post_max_size,
//           max_execution_time, memory_limit
//       2 - в файле  php.conf: LimitRequestBody
 
 
// -----------------------------------------------------------------------------
// Параметры потребление ресурсов сервера
// -----------------------------------------------------------------------------
 
// Переключатель проверки потребления или выключить.
$net2ftp_settings["check_consumption"] = "yes";
 
// Максимальная скорость передачи данных объемом в день (в байтах)
$net2ftp_settings["max_consumption_ipaddress_datatransfer"] = 50000000; // на IP
$net2ftp_settings["max_consumption_ftpserver_datatransfer"] = 50000000; // на FTP
 
// Максимальное время исполнения скрипта в день (в секундах)
$net2ftp_settings["max_consumption_ipaddress_executiontime"] = 1500; // на IP
$net2ftp_settings["max_consumption_ftpserver_executiontime"] = 1500; // на FTP
 
// Максимальное количество FTP серверов, которые могут быть доступна в один день.
$net2ftp_settings["max_consumption_ipaddress_nr_of_ftpservers"] = 50; // на IP
 
// Проверка домашней директории пользователя? 
$net2ftp_settings["check_homedirectory"] = "yes";
 
 
// -----------------------------------------------------------------------------
// Ничего не изменяйте НИЖЕ ЭТОЙ ЛИНИИ 
// -----------------------------------------------------------------------------
 
$net2ftp_settings["application_version"] = "0.98";
$net2ftp_settings["application_build_nr"] = "45";
 
// Это net2ftp.com или net2ftp установка
$net2ftp_settings["net2ftpdotcom"] = "no";
 
// Реклама Google Adsense 
// Не показан при использовании HTTPS, чтобы избежать предупреждений при 
// каждом перзагрузке страницы 
$net2ftp_settings["show_google_ads"] = "no";
 
?>

3.1 - Изменим настройки в файле settings_authorizations.inc.php
В этом файле настраиваем скрипт для работы с фтп серверами и дополнительными разрешениями.

<?php
// 28.08.09 - Raven2000
// -----------------------------------------------------------------------------
// Проверка авторизации?
// Значение да или нет.
// -----------------------------------------------------------------------------
$net2ftp_settings["check_authorization"] = "yes";
 
 
// -----------------------------------------------------------------------------
// Разрешенные FTP сервера
// Установите значение "ALL" или сделайте список серверов доступных к работе 
// с скриптом.
// Виды настроек:
//    - При выборе значения "ALL" то в поле входа в FTP сервер будет показана 
//      строка для заполнения
//    - если введено один сервер, то поле входа в FTP сервер не будет показан 
//    - если введено более чем один сервер, то сервер FTP нужно будет выбрать
//      из выпадающего сервера
// -----------------------------------------------------------------------------
 
//$net2ftp_settings["allowed_ftpservers"][1] = "ALL";
//$net2ftp_settings["allowed_ftpservers"][1] = "localhost";
//$net2ftp_settings["allowed_ftpservers"][2] = "192.168.1.1";
//$net2ftp_settings["allowed_ftpservers"][3] = "ftp.mydomain2.org";
$net2ftp_settings["allowed_ftpservers"][3] = "ftp.homenet.local";
 
// -----------------------------------------------------------------------------
// Заблокированные FTP сервера
// Установить первому NONE, или введите список запрещенных серверов
// -----------------------------------------------------------------------------
 
$net2ftp_settings["banned_ftpservers"][1] = "NONE";
//$net2ftp_settings["banned_ftpservers"][1] = "127.0.0.1";
//$net2ftp_settings["banned_ftpservers"][2] = "192.168.1.2";
//$net2ftp_settings["banned_ftpservers"][3] = "192.168.1.3";
 
 
// -----------------------------------------------------------------------------
// Разрешённый порт FTP сервера
// Установите значение ALL, или конкретный порт
// -----------------------------------------------------------------------------
 
//$net2ftp_settings["allowed_ftpserverport"] = "ALL";
$net2ftp_settings["allowed_ftpserverport"] = "21";
 
 
// -----------------------------------------------------------------------------
// Разрешённые IP адреса или IP диапазон адресов с которых пользователь может 
// подключатся
// Установите первое значение ALL, или список разрешенных IP адресов
// -----------------------------------------------------------------------------
 
$net2ftp_settings["allowed_addresses"][1] = "ALL";
//$net2ftp_settings["allowed_addresses"][1] = "127.0.0.1";   // IP address
//$net2ftp_settings["allowed_addresses"][2] = "192.168.100"; // IP address range
//$net2ftp_settings["allowed_addresses"][3] = "10.0.0.1";
 
 
// -----------------------------------------------------------------------------
// Заблокированные IP адреса или диапазон IP адресов с которых запрещено работать
// Установите первое значение ALL, или список запрещенных IP адресов
// -----------------------------------------------------------------------------
 
$net2ftp_settings["banned_addresses"][1] = "NONE";
//$net2ftp_settings["banned_addresses"][1] = "127.0.0.1";
//$net2ftp_settings["banned_addresses"][2] = "192.168.1.2";
//$net2ftp_settings["banned_addresses"][3] = "192.168.1.3";
 
 
// -----------------------------------------------------------------------------
// Запрещенные директории и имена файлов
// Установите первое значение NONE, или список запрещенных слов
// -----------------------------------------------------------------------------
 
//$net2ftp_settings["banned_keywords"][1] = "NONE";
$net2ftp_settings["banned_keywords"][1] = "paypal";
$net2ftp_settings["banned_keywords"][2] = "ebay";
$net2ftp_settings["banned_keywords"][3] = "wachoviabank";
$net2ftp_settings["banned_keywords"][4] = "wellsfargo";
$net2ftp_settings["banned_keywords"][5] = "bankwest";
$net2ftp_settings["banned_keywords"][6] = "hsbc";
$net2ftp_settings["banned_keywords"][7] = "halifax-online";
$net2ftp_settings["banned_keywords"][8] = "lloydstsb";
$net2ftp_settings["banned_keywords"][9] = "egg.com";

3.2 - Изменим настройки в файле settings_screens.inc.php
.
В этом файле тонко настраивается скрипт под текущие нужды администратора, что показать или убрать с глаз пользователей. Я стараюсь убрать все, что мне не нужно.

<?php
// 28.08.09 - Raven2000
// -----------------------------------------------------------------------------
// Функция просмотра в браузере - Верхее левое
// Укажите какие функции должны быть включены или выключены.
// -----------------------------------------------------------------------------
 
// Создание новой директории
$net2ftp_settings["functionuse_newdir"] = "yes";
 
// Создание нового файла 
$net2ftp_settings["functionuse_newfile"] = "yes";
 
// Закачка (закачать, закачать и распаковать)
$net2ftp_settings["functionuse_upload"] = "yes";
 
// Закачать через Java
$net2ftp_settings["functionuse_jupload"] = "no";
 
// Закачать через Flash
$net2ftp_settings["functionuse_swfupload"] = "no";
 
// Создание веб-сайта из готового HTML шаблонов 
$net2ftp_settings["functionuse_easyWebsite"] = "no";
 
// Закладки на странице 
$net2ftp_settings["functionuse_bookmark"] = "yes";
 
// Установить функции
$net2ftp_settings["functionuse_install"] = "yes";
 
// Дополнительные функции 
$net2ftp_settings["functionuse_advanced"] = "yes";
 
 
// -----------------------------------------------------------------------------
// Функция просмотра в браузере - Верхее правое
// Укажите какие функции должны быть включены или выключены.
// -----------------------------------------------------------------------------
 
// Копирования, перемещения и удаления директорий и файлов
$net2ftp_settings["functionuse_copy"]   = "yes";
$net2ftp_settings["functionuse_move"]   = "yes";
$net2ftp_settings["functionuse_delete"] = "yes";
 
// Переименовать 
$net2ftp_settings["functionuse_rename"] = "yes";
 
// Изменить права (chmod)
$net2ftp_settings["functionuse_chmod"] = "yes";
 
// Zip-and-download
$net2ftp_settings["functionuse_downloadzip"] = "yes";
 
// Unzip
$net2ftp_settings["functionuse_unzip"] = "yes";
 
// Zip-and-save, zip-and-email
$net2ftp_settings["functionuse_zip"] = "yes";
 
// Подсчет размера
$net2ftp_settings["functionuse_calculatesize"] = "yes";
 
// Строка поиска
$net2ftp_settings["functionuse_findstring"] = "yes";
 
 
// -----------------------------------------------------------------------------
// Функция просмотра в браузере - уровень строк
// Укажите какие функции должны быть включены или выключены.
// -----------------------------------------------------------------------------
 
// Скачать файл
$net2ftp_settings["functionuse_downloadfile"] = "yes";
 
// Просмотр файла
$net2ftp_settings["functionuse_view"] = "yes";
 
// Редактирование файла 
$net2ftp_settings["functionuse_edit"] = "yes";
 
// Обновить файл (бета-функция) 
$net2ftp_settings["functionuse_update"] = "no";
 
// Открыть файл
$net2ftp_settings["functionuse_open"] = "yes";
 
?>

4 - Создадим БД и таблицы, а так же пользователя для работы net2ftp с БД.

$ sudo mysqladmin -h 127.0.0.1 --user=root --password=root_pw create homenet_net2ftp
$ sudo mysql -h 127.0.0.1 --user=root --password=root_pw -e"GRANT ALL ON homenet_net2ftp.* TO user_net2ftp@127.0.0.1 IDENTIFIED BY 'user_pureftpd_pw'" homenet_net2ftp

В директории net2ftp есть файл create_tables.sql оттуда возьмем структуру.
Теперь создадим структуру БД:

$ sudo mysql -h 127.0.0.1 --user=root --password=root_pw
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.37-log OpenBSD port: mysql-server-5.1.37
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
mysql> use  homenet_net2ftp;
Database changed
mysql> source /home/Raven2000/net2ftp/create_tables.sql;
Query OK, 0 rows affected, 1 warning (0.01 sec)
 
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
Query OK, 0 rows affected, 1 warning (0.02 sec)
 
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
Query OK, 0 rows affected, 1 warning (0.01 sec)
 
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
Query OK, 0 rows affected, 1 warning (0.01 sec)
 
mysql> show tables from homenet_net2ftp;
+-----------------------------------+
| Tables_in_homenet_net2ftp         |
+-----------------------------------+
| net2ftp_log_access                |
| net2ftp_log_consumption_ftpserver |
| net2ftp_log_consumption_ipaddress |
| net2ftp_log_error                 |
| net2ftp_users                     |
+-----------------------------------+
5 rows in set (0.02 sec)
mysql> exit;
Bye

Скриншоты:

Заключение

Вот и все теперь пользователи работают и я все вижу, логирую, управляю, смотрю статистику (про AWStats, MySQL, Apache будет отдельная статья) и отдыхаю.

Ссылки

  • _http://www.pureftpd.org/project/pure-ftpd
  • _http://ru.wikipedia.org/wiki/Pure-FTPd
  • _http://openports.se/net/pure-ftpd

Дополнительные материалы
Ваша оценка: Нет Средняя: 4 (5 голосов)

а где можно задать расширение

а где можно задать расширение которые можно закачивать на ФТП или наоборот - запретить закачивать?

RE:а где можно задать расширение

В самом конфиге фтп я такого не видел. Скорее всего надо будет писать скрипт.

Если хочешь разобраться... Так иди и разбирайся!
[ igNix.ru | Технология жизни - технологии будущего ] [ Forum.igNix.ru ]

Pure-FTPd+MySQL+Web

Не могли бы вы поподробнее описать настройку Web интерфейса. Я никогда этого не делал и возникает масса "дурацких" вопросов. На Openbsd директория
Web сервера это /var/www? Я так понимаю надо было установить пакеты PHP. Надо ли что-то изменять в httpd.conf или в php.ini или ещё где-то? Что из папки net2ftp надо положить в директорию Web сервера или всю папку? А то всё работает кроме Web.

RE:Pure-FTPd+MySQL+Web

Пожалуйста задайте вопрос в соответствующей ветке форума.

Если хочешь разобраться... Так иди и разбирайся!
[ igNix.ru | Технология жизни - технологии будущего ] [ Forum.igNix.ru ]

Отлично , спасибо за перевод

Отлично , спасибо за перевод на русский конфига, токо что ставил сравнил дифом дефольтный конфиг , все тоже самое, ничего нового,в синтаксисе :)
буду осваивать как замену proftpd

Хранение аккаунтов pure-ftpd в файлах формата puredb (ftp)
http://www.opennet.ru/base/net/pureftpd_puredb.txt.html

Web интерфейс для Pure-FTPd

Open source интерфейс для управления Pure-FTPd+MySQL

http://pure-ftpd-webui.org/

Настройка конфига под AwStats

Добрый день.
Подскажите как поправить файлы конфигурации, чтобы можно было смотреть статистику по Pure-ftpd в AwStats.
Строка AltLog clf:/var/log/pureftpd.log у меня разкомментирована, но файл /var/log/pureftpd.log не пишется, а awstats не парсит стандартный лог, который пишется в /var/log/xferlog

Помогите

Уважаемый автор помогите мне с настройкой и установкой.

Последние статьи

Новые комментарии

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer