FTP4ALL: установка, настройка, управление

Автор: | 12/25/2013
 

ftp4all_logoFTP4ALL — очень старая система, предшественник сервера 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 (crescent@ftp4all.de)
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 (crescent@ftp4all.de)
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