VSFTPd - виртуальные серверы

()

Введение

В статье рассматривается один из способов создания виртуальных 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
/sbin/ifconfig eth0:2 192.168.226.4 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

Ключевые слова: vsftpd, slackware.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

Комментарии:

MooSE 2007-03-01 08:57:43 (#)

Прошу прощения что так долго не подтверждал статью. Заметил не сразу. И потом ещй в HTML её форматировал.

В любом случае автору респект:)

nexus 2007-03-09 06:37:52 (#)

Вышло так, что я работаю с профтпд. Уж точно не менее функциональный пакет.

Oper.kh 2010-09-27 17:47:02 (#)

у VSFTPd есть какойто глюк. При закачки на него скорость 25-30 Мбит\с, а при скачки порядка 100 Мбит\с (100 Мбит сетевая).
При этом при закачке в ту же папку, но через самбу, скорость выше, порядка 100 Мбит\с

MooSE 2010-09-28 10:22:08 (#)

у VSFTPd есть какойто глюк. При закачки на него скорость 25-30 Мбит\с, а при скачки порядка 100 Мбит\с (100 Мбит сетевая).
При этом при закачке в ту же папку, но через самбу, скорость выше, порядка 100 Мбит\с

У меня обратная проблема:) Самба медленнее чем фтп:)

Oper.kh 2010-09-28 22:27:30 (#)

Ну самба то ли в проц, то ли в озу опирается. Был селерон 850 МГц и 512 озу DIMM, ща пентиум дуал кор под 3ГГц 2 ядра и 1 Гб озу DDG2 и самба летает) Сетевые карты в обеих случаях интеловские.

MooSE 2010-09-29 01:55:04 (#)

У меня самба тупит уже на Celeron Dual Core 2MHz/2GB при ширине канала в 10мбит.

Oper.kh 2010-10-01 01:24:46 (#)

разгони Dual Core 2MHz до 2 GHz (оверклок 100000%) и будет летать)

[flood=off]Кстати на дуал коре (не путать с пинтиум дуал кор) можно сделать 100% разгон - шину 200 поднять до 400 и он нормально тянет[/flood=off]

MooSE 2010-10-02 12:18:59 (#)

я описался. сорри. конечно же процессор 2GHz :)
Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2024 Вадим Калинников aka MooSE
Политика конфиденциальности