FTP4ALL – очень старая система, предшественник сервера OpenFTPD, и более не поддерживается разработчиками:
FTP4ALL is no longer maintained. This web site is only for historic purposes. Visit the successor project OpenFTPD instead.
Но – пришлось с ним иметь дело. Так как документации о нём практически нет (спасибо официальному сайта проекта – там информации более чем достаточно), тем более на русском языке – немного описания работы с этим сервером.
Главные его достоинства – для его установки не требуются права root
, он имеет фактически собственную файловую систему, своих пользователей, группы, права доступа, ограничения по скорости для каждого пользователя/группы и прочее.
Установка производится на:
$ cat /etc/SuSE-release SUSE Linux Enterprise Server 10 (x86_64) VERSION = 10 PATCHLEVEL = 4
Создаём пользователя, под которым будет работать на FTP-сервер:
# useradd ftp4all
# passwd ftp4all Changing password for user ftp4all. New password: BAD PASSWORD: it is based on a dictionary word Retype new password: passwd: all authentication tokens updated successfully.
Переключаемся на него:
# su -l ftp4all
Создаём каталог:
$ mkdir ftp
$ cd ftp/
Качаем последнюю сборку FTP4ALL:
$ wget http://www.csse.de/ftp4all/archive/ftpd-3.012.tar.gz
Распаковываем:
$ tar xfp ftpd-3.012.tar.gz
$ ls -l total 144 drwxr-xr-x 7 ftp4all ftp4all 4096 Jul 24 2004 ftp4all -rw-r--r-- 1 ftp4all ftp4all 142542 Dec 24 12:13 ftpd-3.012.tar.gz
$ cd ftp4all/
Распакованный каталог должен выглядеть так:
$ ls -l total 72 drwxr-xr-x 2 ftp4all ftp4all 4096 Mar 5 2000 bin drwxr-xr-x 2 ftp4all ftp4all 4096 Mar 5 2000 cfg -rw-r--r-- 1 ftp4all ftp4all 19064 Mar 4 2000 CHANGES lrwxrwxrwx 1 ftp4all ftp4all 13 Dec 24 12:20 configure -> cfg/configure drwxr-xr-x 2 ftp4all ftp4all 4096 Oct 22 1999 lib -rw-r--r-- 1 ftp4all ftp4all 15095 Sep 24 1998 LICENSE -rw-r--r-- 1 ftp4all ftp4all 8686 Jan 18 2000 README drwxr-xr-x 6 ftp4all ftp4all 4096 Mar 5 2000 src drwxr-xr-x 7 ftp4all ftp4all 4096 Feb 2 2000 standard -rw-r--r-- 1 ftp4all ftp4all 22 Mar 4 2000 VERSION
Запускаем конфигурирование:
$ ./configure +----------===== Configuring FTP4ALL Version 3.012 =====---------- | checking for C-compiler ... gcc | checking for sparcv9 architecture ... no | checking for sys/select.h ... found | checking for sys/time.h ... found | checking for library crypt ... not needed | checking for library nsl ... not needed | checking for library socket ... not needed | checking for library resolv ... not needed | checking for library V3 ... not needed | checking for memmove() ... not found, using bcopy() instead | checking for raise() ... not found, using kill() instead | checking for sigset() ... not found, using sigaction() instead | checking for setenv() ... not found, using putenv() instead | checking for socketpair() ... not found, using pipe() instead | compiling test programs ... done | examining data type int ... 32 bit | examining data type short ... 16 bit | examining data type long ... 64 bit | examining data type long long ... 64 bit | want DES encryption (y/n) ? n | creating Makefile ... done | creating src/Makefile ... done | creating src/common/Makefile ... done | creating src/ftpa/Makefile ... done | creating src/ftpd/Makefile ... done | creating src/ftps/Makefile ... done | creating src/common/tweak.h ... done +----------===================================---------- If you want to change the maximum filename length, edit variable MAXFILENAMELENGTH in src/common/tweak.h now (before make). But beware, because old permission files will become unusable !!! Configuration finished. Type "make" to compile FTP4ALL.
Для более подробной информации – можно запустить configure
с опцией debug
:
$ ./configure debug
Вопрос:
| want DES encryption (y/n) ? n
В данном случае, есть возможность зашифровать файлы сервера, в которых хранятся логины/пароли пользователей. Смысла нет, т.к. сервер будет работать под отдельной учётной записью.
Примечание:
MAXFILENAMELENGTH in src/common/tweak.h now (before make).
По-умолчанию FTP4ALL поддерживает длину имён файлов в 32 символа. Если требуется больше – необходимо отредактировать файл src/common/tweak.h
.
Запускаем сборку:
$ make make[1]: Entering directory `/home/ftp4all/ftp/ftp4all/src' make[2]: Entering directory `/home/ftp4all/ftp/ftp4all ... make[2]: Leaving directory `/home/ftp4all/ftp/ftp4all/src/ftps' make[1]: Leaving directory `/home/ftp4all/ftp/ftp4all/src'
На CentOS 6.4 x64 во время сборки возникло несколько сложностей.
Первая:
$ make ... f4adp_user.o: In function `f4adp_usr_pwd': f4adp_user.c:(.text+0xfa0): undefined reference to `crypt' f4adp_user.o: In function `f4adp_usr_chg': f4adp_user.c:(.text+0x340e): undefined reference to `crypt' f4adp_user.o: In function `f4adp_usr_adq': f4adp_user.c:(.text+0x37a7): undefined reference to `crypt' serverd.o: In function `user_request_login_permission': serverd.c:(.text+0x2a9a): undefined reference to `crypt' collect2: ld returned 1 exit status
Решается редактированием файла configure:
$ vim ../../ftp/ftp4all/configure
Находим строку:
echo $ac_n "| want DES encryption (y/n) ? $ac_c"
Чуть ниже её редактируем:
else DES="" LIB=${LIB} fi
И устанавливаем:
DES="" LIB=${LIB}" -lcrypt" fi
Хотя библиотека crypt
вроде как и не должна использоваться вообще – но сборка “ломалась”.
Вторая ошибка:
common.c:52: error: conflicting types for ‘setenv’ /usr/include/stdlib.h:585: note: previous declaration of ‘setenv’ was here
Редактируем файл:
$ vim ./src/ftps/common.c
Находим блок:
#ifndef HAVE_SETENV void setenv(char* var, char* val, int new) { char str[256]; sprintf(str,"%s=%s",var,val); putenv(str); } #endif /* HAVE_SETENV */
И комментируем объявление setenv
:
#ifndef HAVE_SETENV /* void setenv(char* var, char* val, int new) { char str[256]; sprintf(str,"%s=%s",var,val); putenv(str); } */ #endif /* HAVE_SETENV */
Продолжаем.
Создаём директорию, в которой будет работать наш FTP-сервер:
$ mkdir ../../ftpdir
Копируем из текущего каталога папку standard
, которая содержит в себе стадартный набор директорий сервера:
$ cp -R standard/ ../../ftpdir/
Копируем файлы управления демона и его служб:
$ cp bin/* ../../ftpdir/standard/sbin/
Переходим в рабочий каталог:
$ cd ../../ftpdir/standard/
$ ls -l total 20 drwxr-xr-x 4 ftp4all ftp4all 4096 Dec 24 20:46 bin drwxr-xr-x 2 ftp4all ftp4all 4096 Dec 24 20:46 etc drwxr-xr-x 2 ftp4all ftp4all 4096 Dec 24 20:46 log drwxr-xr-x 4 ftp4all ftp4all 4096 Dec 24 20:46 msg drwxr-xr-x 2 ftp4all ftp4all 4096 Dec 24 20:47 sbin
Создадим директорию, в которой будет происходить обмен данными FTP-сервера, и который будет являться корневым для пользователей “внутри” FTP:
$ mkdir ../site
$ ls -l ../ total 8 drwxrwxr-x 2 ftp4all ftp4all 4096 Dec 24 20:49 site drwxr-xr-x 7 ftp4all ftp4all 4096 Dec 24 20:46 standard
Редактируем файл настроек:
$ vim etc/ftpd.reg
$ cat etc/ftpd.reg adminport 2002 basedir /home/ftp4all/ftpdir/site port 2000
adminport
– порт для подклчюения с помощью утилиты Admin GUI;
basedir
– директория для хранения и обмена данными FTP-сервера;
port
– порт, на котором FTP-сервер будет принимать соединения.
Полный список доступных опций есть тут>>>.
Стартуем сервер:
$ ./sbin/ftpd FTP4ALL 3.012, Copyright (C) 1996-2000 by Crescent ([email protected]) This program is FREE SOFTWARE and distributed under GNU PUBLIC LICENSE Server on host lms-teamcity is ready and listening on *:2000 Base directory : /home/ftp4all/ftpdir/site Readme file : (none) Permission file: .permissions Errlog file : log/ftpd.err Log file : log/ftpd.log Log program : (none) Server program : /home/ftp4all/ftpdir/standard/sbin/ftps
В случае ошибок вида:
$ ./bin/ftpd FTP4ALL 3.012, Copyright (C) 1996-2000 by Crescent ([email protected]) This program is FREE SOFTWARE and distributed under GNU PUBLIC LICENSE ftpd[18036] ERROR: Startup of server failed. See error log for details.
Смотрите лог ошибок:
$ less log/ftpd.err
Проверяем подключение:
$ ftp 127.0.0.1 2000 Connected to 127.0.0.1 (127.0.0.1). 220 FTP4ALL FTP server ready. Local time is Tue Dec 24, 2013 20:55. Name (127.0.0.1:ftp4all): root 331 Password required for root. Password: 230-Welcome, root - I have not seen you since Thu Jan 01, 1970 03:00 ! 230-At the moment, there are 0 guest and 1 registered users logged in. 230 You uploaded 0 Bytes and downloaded 0 Bytes so far (u/d-ratio is n/a). Remote system type is UNIX. Using binary mode to transfer files.
Т.к. пароль пользователя root
не установлен – в поле Password
: просто нажимаем Enter.
Посомтрим содержимое каталога:
ftp> ls 227 Entering Passive Mode (127,0,0,1,225,101). 150 Opening ASCII mode data connection for /bin/ls. total 0 226 Directory listing completed.
Сервер готов к работе.
Теперь – нам создать пользователя, группу, назначить пароли.
Основное управление происходит с помощью набора команд site
, полное описание доступных команд есть тут>>>.
Посмотрим, какие пользователи есть сейчас:
ftp> site user list 211-name group c icp l uid gid mb_down mb_up'd lim mb_cred last_login 211-root 0 *s --- 0 0 0 0 0 0 0 25/12 12:27 211 <end of list>
Установим пароль пользователя root
:
ftp> site passwd root password 200 Password changed
Проверим имеющиеся группы пользователей:
ftp> site group list 211-NAME GID LIM MBCRED DMIN DMAX UMIN UMAX UMASK LG INFO IDENT 211 <end of list>
Пусто. Создадим группу users
с GID
1:
ftp> site group add users 1 200 Group added
Проверяем:
ftp> site group list 211-NAME GID LIM MBCRED DMIN DMAX UMIN UMAX UMASK LG INFO IDENT 211-users 1 0 0 0 0 0 0 0x000000 0 - 0.0.0.0 211 <end of list>
Добавляем пользователя:
ftp> site user add ftpuser 200 User added
Устанавливаем пароль:
ftp> site passwd ftpuser password 200 Password changed
Добавляем его в группу users
:
ftp> site groups ftpuser +users 200 User added to group
Или так:
ftp> site user change ftpuser gid=1 200 User changed.
Кроме того, необходимо установить IP, с которых пользователю будет открыт доступ:
ftp> site user change ftpuser ip0=*.*.*.* 200 User changed.
ip[0-9|+|i] | ip ranges from which the user may log in, up to 10 ranges are possible. ip+ inserts the ip at the first available position. ip- removes an ip/ip-range |
В данном случае – с любого IP-адреса.
Посмотреть группы пользователя можно так:
ftp> site groups ftpuser 200-Primary group: nogroup 200 Secondary groups: users
Удалить пользователя:
ftp> site user remove ftpuser 200 User removed
Теперь – создадим каталог для группы:
ftp> mkdir usersdir 257 MKDIR command successful.
Проверим права доступа к каталогу:
ftp> ls -la 227 Entering Passive Mode (127,0,0,1,92,151). 150 Opening ASCII mode data connection for /bin/ls. total 12 d--------- 0 nobody nogroup 4096 Dec 25 12:43 . d--------- 0 nobody nogroup 4096 Dec 24 20:49 .. drwxr-x--- 0 root 0 4096 Dec 25 12:43 usersdir 226 Directory listing completed.
Установим владельца корневого каталога сервера:
ftp> site chown root:0 / 250 CHOWN command successful. ftp> ls -la 227 Entering Passive Mode (127,0,0,1,58,119). 150 Opening ASCII mode data connection for /bin/ls. total 12 drwxr-x--- 0 root 0 4096 Dec 25 13:57 . d--------- 0 nobody nogroup 4096 Dec 24 20:49 .. drwxr-x--- 0 root 0 4096 Dec 25 12:43 usersdir
Меняем владельца каталога usersdir
:
ftp> site chown ftpuser:users usersdir 250 CHOWN command successful.
Если пользователь/группа созданы, но сервер сообщает, что:
501 User not found.
Попробуйте перелогиниться.
Проверим права:
ftp> site mod usersdir 250-directory : (no flags) 250-owner [ftpuser ] : (full rights) 250-group [users ] : cd ls get 250 others : (no rights)
Последняя проверка – подключаемся с другого хоста под новым пользователем:
$ ftp 10.***.***.239 2000 Connected to 10.***.***.239. 220 FTP4ALL FTP server ready. Local time is Wed Dec 25, 2013 17:09. Name (10.***.***.239:root): ftpuser 331 Password required for ftpuser. Password: 230-Welcome, ftpuser - I have not seen you since Wed Dec 25, 2013 16:33 ! 230-At the moment, there are 0 guest and 1 registered users logged in. 230 You uploaded 0 Bytes and downloaded 0 Bytes so far (u/d-ratio is n/a). Remote system type is UNIX. Using binary mode to transfer files.
ftp> ls -l 500 Unrecognised command (EPSV). 227 Entering Passive Mode (10,***,140***239,252,51). 150 Opening ASCII mode data connection for /bin/ls. total 4 drwxr-x--- 0 ftpuser users 4096 Dec 25 16:23 usersdir 226 Directory listing completed.
На этом настройку можно считать завершённой.
Выключить сервер можно командой:
ftp> site shutdown 421 Server shutdown initiated