Введение
В статье рассматривается один из способов создания виртуальных FTP серверов на базе "самого быстрого и безопасного" FTP демона - VSFTPD. В примере рассматривается создание двух виртуальных серверов. Первый - полностью анонимный, с двумя директориями pub и incoming (наверное самый распространенный вариант). В каталоге incoming пользователи смогут создавать директории, загружать и скачивать файлы. Удалять закачанное - нельзя. В будущем содержимое этой директории должно анализироваться администратором ftp сервера. Администратор должен удалять мусор а все нужное и полезное перемещать в директорию pub. К директории pub пользователи имеет доступ только для чтения. Второй - с доступом только по учетным записям. Аккаунт anonymous отсутствует. "Изюминка" его реализации - индивидуальная конфигурация для каждого пользователя. Итак, начнем...
Установка сервера
# installpkg vsftpd-2.0.5-i486-1.tgz
Создаем загрузочный скрипт /etc/rc.d/rc.vsftpd
#!/bin/sh
ftp_start()
{
echo "Starting VSFTPD: "
if ! ps axc | grep -q " vsftpd" ; then
vsftpd &
else
echo "VSFTPD already running!"
fi
}
ftp_stop()
{
if ps axc | grep -q " vsftpd" ; then
killall vsftpd
else
echo "VSFTPD not running!"
fi
}
ftp_restart()
{
ftp_stop
sleep 1
ftp_start
}
case "$1" in
'start')
ftp_start
;;
'stop')
ftp_stop
;;
'restart')
ftp_restart
;;
*)
echo "usage $0 start|stop|restart"
esac
Делаем его исполняемым
# chmod a+x /etc/rc.d/rc.vsftpd
По умолчанию, домашняя директория пользователя FTP - /home/ftp. Я предпочитаю все что предоставляет компьютер как сервер - размещать в директории /srv. Например /srv/ftp, /srv/samba, /srv/www. Имхо так как-то порядка в системе больше :) Но это только мое ИМХО, а так - "на вкус и цвет все фломастеры разные" ;) Открываем файл /etc/passwd, ищем пользователя ftp и меняем ему домашнюю директорию на /srv/ftp. Если вы предпочитаете другое расположение - замените все пути описанные ниже с /srv/ftp на ваши.
Теория реализации виртуальных FTP серверов
Виртуальные хосты на VSFTPD можно организовать двумя способами. Первый способ: запустить нужное количество серверов в режиме демона и в конфигурационном файле каждого сервера указать слушаемые IP адреса listen_address=x.x.x.x. Т.е. если нужно 10 вируальных FTP серверов - нужно запусть 10 копий vsftpd. Как видно это не самый лучший способ. Врядли к этим 10 серверам постоянно будут подключены клиенты. Гораздо экономнее запускать VSFTPD по требованию от суперсервера. Стандартный inetd входящий в поставку дистрибутива Slackware нам не подойдет потому, что в нем нельзя указать IP на котором будут слушаться соединения. Заменим inetd на xinetd.
Установка xinetd
Останавливаем суперсервер
# /etc/rc.d/rc.inetd stop
Удаляем inetd
# removepkg inetd
Делам файл /etc/rc.d/rc.inetd неисполняемым
# chmod a-x /etc/rc.d/rc.inetd
Устанавливаем xinetd
# installpkg xinetd-2.3.14-i486-1bms.tgz
Переименовываем файл rc.xinetd.new в rc.xinetd
mv /etc/rc.d/rc.xinetd.new /etc/rc.d/rc.xinetd
Делам его исполняемым
chmod a+x /etc/rc.d/rc.xinetd
Из файла /etc/rc.d/rc.local.new копируем строки запуска сервера в наш файл /etc/rc.d/rc.local. Руками переписывать - лень, перенаправим вывод всего файла в конец нашего rc.local. Откроем файл /etc/rc.d/rc.local.new и удалим из него все строки до # Start the xinetd server. Копируем текст в наш rc.local
# cat /etc/rc.d/rc.local.new >> /etc/rc.d/rc.local
Теперь файл можно удалить.
# rm /etc/rc.d/rc.local.new
Запускаем xinetd
# /etc/rc.d/rc.xinetd start
Пробуем подключиться к FTP
# ftp 127.0.0.1
Connected to 127.0.0.1. 220 (vsFTPd 2.0.5)
Name (127.0.0.1:coder): 530 This FTP server is anonymous only.
ftp>
Запустился! Посмотреть кто когда и что хотел запустить можно через cat /var/log/servicelog.
06/12/17@13:29:36: START: ftp pid=3195 from=127.0.0.1
Видим что 17-го декабря 2006, по запросу с адреса 127.0.0.1 был запущен ftp сервер и ему был присвоем pid 3195. Здорово! Чтобы было еще интереснее в файле /etc/xinetd.conf допишем строку
log_on_success = HOST
до
log_on_success = HOST USERID PID DURATION EXIT
Перезапустим сервер и теперь в логах будет оботбражаться даже продолжительность вызванных соединений ;)
Создание общей структуры каталогов
Займемся виртуальными хостами. Т.к. виртуальных FTP может быть и больше 10, чтобы не мусорить в /etc желательно создать директорию /etc/vsftpd
# mkdir /etc/vsftpd
А в нем, так как у нас будет два вируальных FTP сервера - создать директории для каждого из них Например у нас будут 2 ftp на адресах 192.168.226.3 (ftp1) и 192.168.226.4 (ftp2).
# mkdir /etc/vsftpd/192.168.226.3
# mkdir /etc/vsftpd/192.168.226.4
Скопируем в эти каталоги конфигурационный файл.
# cp /etc/vsftpd.conf /etc/vsftpd/192.168.226.3/vsftpd.conf
# cp /etc/vsftpd.conf /etc/vsftpd/192.168.226.4/vsftpd.conf
Тоже касается и логов. Создаем директорию /var/log/vsftpd. В ней будут файлы с логами соответствующих виртуальных FTP серверов. Т.е. в /etc/vsftpd/192.168.226.3/vsftpd.conf ищем строчку
xferlog_file=/var/log/vsftpd.log
и меняем ее на
xferlog_file=/var/log/vsftpd/192.168.226.3.log
Тоже самое для второго FTP.
Прописываем создание двух дополнительных IP адресов при запуске. В конец файла /etc/rc.d/rc.inet1 добавляем
/sbin/ifconfig eth0:1 192.168.226.3 netmask 255.255.255.0 up
Сохраняемся, выходим.
И создаем их сейчас:
# ifconfig eth0:1 192.168.226.3 netmask 255.255.255.0 up
# ifconfig eth0:2 192.168.226.4 netmask 255.255.255.0 up
Добавим записи о FTP серверах в DNS (прямая зона)
ftp1 IN A 192.168.226.3
ftp2 IN A 192.168.226.4
Перезапустим DNS сервер
# /etc/rc.d/rc.bind restart
Открываем файл /etc/xinetd.conf и множим секцию ftp. В одну секцию добавляем директиву
bind = 192.168.226.3
а строку server_args = vsftpd допоолняем до
server_args = vsftpd /etc/vsftpd/192.168.226.3/vsftpd.conf
в другую
bind = 192.168.226.4
и
server_args = vsftpd /etc/vsftpd/192.168.226.4/vsftpd.conf
Перезапустим xinetd
# /etc/rc.d/rc.xinetd restart
Теперь xinetd в зависимости на какой IP обратились, будет запускать vsftpd с соответствующими конфигурационными файлами. Внимание: интерфейсы и записи в DNS должны существовать до того как будет перезапущен xinetd! Иначе ничего не получиться. Т.е. сначала создаем интерфейсы (или дополнительные IP адреса), если будет использоваться DNS - прописываем адреса в DNS и только потом запускаем/перезапускаем xinetd.
Настройка анонимного сервера
Создадим струткуру каталогов для анонимного сервера. Директория incoming предназначена для закачки файлов пользователями. pub - только для скачивания.
Структура анонимного FTP сервера:
# mkdir /srv/ftp/192.168.226.3
# mkdir /srv/ftp/192.168.226.3/incoming
# mkdir /srv/ftp/192.168.226.3/pub
Для anonymous пользователя корневым будут каталог /srv/ftp/192.168.226.3. Тем самым создается иллюзия что это разные серверы. Хотя на самом деле - просто разные директории.
Пропишем это в конфигруационном файле:
anon_root=/srv/ftp/192.168.226.3
Чтобы сделать директорию incoming доступной для записи - нужно установить ее в группу ftp и дать этой группе права на запись.
# chgrp -R ftp /srv/ftp/192.168.226.3/incoming/
# chmod -R g+w /srv/ftp/192.168.226.3/incoming/
Вот в принципе и все. На этом можно считать настройку анонимного ftp сервера законченной. Вот листинг конфигурационного файла
anonymous_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_umask=022
file_open_mode=0777
anon_root=/srv/ftp/192.168.226.3
local_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd/192.168.226.3.log
xferlog_std_format=YES
ls_recurse_enable=YES
Настройка сервера с доступом только по учетным записям
Создадим файл userlist, в который будем прописывать пользователей которым разрешен доступ на FTP.
# touch /etc/vsftpd/192.168.226.4/userlist
Пропишем в него первым делом самого себя :) у меня это пользователь coder Создадим директорию для хранения индивидульных настроек для каждого пользователя
# mkdir /etc/vsftpd/192.168.226.4/users
Создадим в этом каталоге файл для настроек пользователя coder
# touch /etc/vsftpd/192.168.226.4/users/coder
Пропишем в него все права и корневую директорию. Добавим:
cmds_allowed=ABOR,MKD,CWD,DELE,LIST,MDTM,NLST,PASS,PASV,PORT,PWD,QUIT,RETR,RMD,RNFR,RNTO,SIZE, STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST
local_root=/srv/ftp/192.168.226.4/
Сообщим vsftpd о том, что мы будем использовать индивидуальные настройки для каждого пользователя. Добавим в /etc/vsftpd/192.168.226.4/vsftpd.conf следующие строки:
anonymous_enable=NO
local_enable=YES
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/192.168.226.3/userlist
user_config_dir=/etc/vsftpd/192.168.226.3/users
Все пользователи в Slackware по умолчанию принадлежат группе users. Дадим всем пользователям группы users доступ на запись в /srv/ftp/192.168.226.4.
# chgrp -R users /srv/ftp/192.168.226.4
# chmod -R g+w /srv/ftp/192.168.226.4
Для примера, создадим пользователя webmaster, который в теории должен через этот FTP заливать файлы на корпоративный сайт.
# adduser webmaster
Установим пароль
# passwd webmaster
В директории /srv/ftp/192.168.226.4/users/ создадим файл настроек пользователя webmaster.
# touch /srv/ftp/192.168.226.4/users/webmaster
Пропишем в него директорию в которая будет корневой для пользователя (в данном случае директория с сайтом)
local_root=/srv/www/www.mysite.lan/
Сменим группу и пользователя директории с сайтом на webmaster:users
# chown -R webmaster:users /srv/www/www.mysite.lan
Чтобы webmaster мог быстро перейти на сайт зайдя например по SSH или с SAMBA, в его домашней директории создадим символьную ссылку на директорию с web сайтом.
# ln -s /srv/www/www.mysite.lan /home/webmaster/www
Вот в принципе и все. Можно проверять.
Полное содержание vsftpd.conf:
anonymous_enable=NO
file_open_mode=0777
local_enable=YES
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/192.168.226.4/userlist
user_config_dir=/etc/vsftpd/192.168.226.4/users
chroot_local_user=YES
write_enable=YES
local_umask=022
ftpd_banner=Welcome to FTP server
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd/192.168.226.4.log
xferlog_std_format=YES
ls_recurse_enable=YES
MooSE 2007-03-01 08:57:43 (#)
В любом случае автору респект:)