В соответствии со Священным писанием поднял и настроил proFTPd 1.3.2a. Сразу скажу - с MySQL всё срослось, с этим проблем не испытываю. Проблемы образовались другого плана.
1. Проблема с правами на каталоги и файлы. Демон у меня стартует от имени юзера ftp, пребывающего в одноимённой группе. Домашним каталогом для всяческих юзеров я определил /var/ftp, там складируются подкаталоги юзеров. Для /var/ftp и подкаталогов владельцем выставлен ftp:ftp. Права доступа - 755.
Когда логинюсь каким-нибудь юзером (из локальной сети, без файрволла), он успешно заходит в свой каталог, успешно читает его содержимое, успешно скачивает файлы. А вот закачать или удалить не может. Хоть тресни. Проблему удаётся "решить", выставив на домашний каталог юзера права 777. Сами понимаете, это ни фига не решение проблемы. Где же грабли? Ведь юзер ftp:ftp, от имени которого и работает FTP-сервер, имеет все права на каталоги юзеров!
2. Проблема с доступом извне. Всё это безобразие установлено на машине, которая имеет подключается к инету через "Стрим". 21-й порт у них закрыт. Пришлось использовать другой (именно - TCP-порт 40). Открыв его в своём файрволле, я сперва не мог понять, почему извне FTP-сервер не работает корректно. Потом вспомнил, что нужно же ещё обеспечить порт FTPDATA, т.е. TCP-порт 20. К счастью, он не прикрыт "Стримом", поэтому я открыл его в файрволле. Однако это не шибко-то помогло. Из своей локальной сети (от которой файрволл не защищает, allow all) я вполне могу работать с FTP-сервером, скачивать и закачивать (исключая приведённую в п. 1 проблему), а вот извне - грабли. Из proFTPd FAQ я узнал, что FTP-клиент должен быть настроен на активный режим, и при открытых портах FTP (или аналог) и FTPDATA всё должно быть ок. Ниже приводится лог подключения извне, в роли FTP-клиента выступает Total Commander. Сперва клиент пытается подключиться (это удаётся после долгих тормозов), затем пытается закачать файл (ip.txt), неудачно. Прочитать содержимое каталога тоже не получается, равно как и скачать файл (russia_89.png) вслепую. Значительная часть команд (LIST, QUIT) выполнялась с большими тормозами, чего не было при работе из локальной сети.
Код: Выделить всё
----------
Connect to: (01.11.2009 15:55:44)
hostname=myserver.org:40
username=myuser
startdir=
myserver.org=xx.xx.xx.xx
220 ProFTPD 1.3.2a Server (MyServer) [xx.xxx.xx.xxx]
USER myuser
331 Необходим пароль для пользователя myuser
PASS ***********
230 Пользователь myuser подключён
SYST
215 UNIX Type: L8
FEAT
211-Возможности:
MDTM
MFMT
LANG ru-RU.KOI8-R*
MFF modify;UNIX.group;UNIX.mode;
MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*;
REST STREAM
SIZE
211 Конец
Connect ok!
PWD
257 "/" является текущей директорией
Чтение каталога...
TYPE A
200 Тип установлен в A
PORT xxx,xxx,xx,xx,6,115
200 Команда PORT успешно обработана
LIST
PORT failed, try PASV mode!
PASV
TYPE I
425 Невозможно создать соединение данных: Operation timed out
PASV
227 Entering Passive Mode (xx,xxx,xx,xxx,213,27).
PORT xxx,xxx,xx,xx,6,177
200 Команда PORT успешно обработана
STOR ip.txt
425 Невозможно создать соединение данных: Operation timed out
Чтение каталога...
TYPE A
200 Тип установлен в A
PORT xxx,xxx,xx,xx,6,245
200 Команда PORT успешно обработана
LIST
PORT failed, try PASV mode!
PASV
Чтение каталога...
PASV
425 Невозможно создать соединение данных: Operation timed out
PORT xxx,xxx,xx,xx,7,31
227 Entering Passive Mode (xx,xxx,xx,xxx,220,188).
LIST
200 Команда PORT успешно обработана
SIZE russia_89.png
425 Невозможно создать соединение данных: Operation timed out
TYPE I
550 SIZE не разрешено в режиме ASCII
PORT 217,150,28,2,7,76
200 Тип установлен в I
RETR russia_89.png
200 Команда PORT успешно обработана
QUIT
Вот мой конфиг:
Код: Выделить всё
ServerName "MyServer"
ServerAdmin root@myserver.org
ServerType standalone
DefaultServer on
ScoreboardFile /var/run/proftpd/proftpd.scoreboard
LangEngine on
UseEncoding UTF-8 CP1251
Port 40
Umask 022
MaxInstances 30
CommandBufferSize 512
User ftp
Group ftp
AllowOverwrite on
<Limit SITE_CHMOD>
DenyAll
</Limit>
SQLAuthTypes Plaintext
SQLAuthenticate users
SQLConnectInfo ftp@localhost:3306 ftp ftp
SQLUserInfo `users_table` `username` `password` `uid` `gid` \
`homedir` `shell`
RequireValidShell off
SQLLogFile /var/log/proftpd.log
SQLLog PASS counter_login
SQLNamedQuery counter_login UPDATE "`last_login`=UNIX_TIMESTAMP(), `login_count`=`login_count`+1 WHERE `username`='%u'" `users_table`
SQLLog ERR_PASS counter_err
SQLNamedQuery counter_err UPDATE "`last_err_login`=UNIX_TIMESTAMP(), `err_login_count`=`err_login_count`+1 WHERE `username`='%U'" `users_table`
SQLLog RETR,STOR log_story_transfer
SQLNamedQuery log_story_transfer INSERT "'', UNIX_TIMESTAMP(),'%u', '%f', '%b', '%h', '%a', '%m', '%T'" `xfer_table`
SQLLOG ERR_RETR,ERR_STOR,ERR_DELE,ERR_RMD,ERR_RNTO\
log_err_modify
SQLNamedQuery log_err_modify INSERT "'', UNIX_TIMESTAMP(), '%u', '%f', '%h', '%a', '%m'" `xfer_errors`
UseReverseDNS off
IdentLookups off
DefaultRoot ~ !admin
<Directory ~>
AllowOverwrite on
<Limit Write>
AllowAll
</Limit>
<Limit READ>
AllowAll
</Limit>
</Directory>
<Anonymous /var/ftp/ftp>
User ftp
Group ftp
UserAlias anonymous ftp
MaxClients 10 "Sorry, max %m users - try again later"
<Limit WRITE>
DenyAll
</Limit>
</Anonymous>
Код: Выделить всё
[root@myserver /var/ftp]# ls -alF
total 10
drwxr-xr-x 5 ftp ftp 512 1 ноя 12:18 ./
drwxr-xr-x 26 root wheel 512 1 ноя 01:18 ../
drwxr-xr-x 2 ftp ftp 512 1 ноя 01:19 admin/
drwxr-xr-x 2 ftp ftp 512 1 ноя 12:18 ftp/
drwxrwxrwx 2 ftp ftp 512 1 ноя 15:44 myuser/
Где грабли, братия?