The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Виртуальные серверы на базе VSFTPD (ftp virtual)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: ftp, virtual,  (найти похожие документы)
From: CoderInside <coder@linuxportal.vrn.ru.> Newsgroups: email Date: Mon, 27 Feb 2007 14:31:37 +0000 (UTC) Subject: Виртуальные серверы на базе VSFTPD Источник: Воронежский Linux портал Содержание
  • 1 Введение
  • 2 Установка сервера
  • 3 Теория реализации виртуальных FTP серверов
  • 4 Установка xinetd
  • 5 Создание общей структуры каталогов
  • 6 Настройка анонимного сервера
  • 7 Настройка сервера с доступом только по учетным записям Введение В статье рассматривается один из способов создания виртуальных 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

  • << Предыдущая ИНДЕКС Правка src / Печать Следующая >>

    Обсуждение [ RSS ]
  • 1.1, mike_k (?), 21:03, 27/02/2007 [ответить]  
  • +/
    не относящася к теме мелочь(если уж так разжевывать):
    после правки записей DNS неплохо бы напомнить пользователям увеличить serial зоны; и вместо рестарта bind корректнее было бы выполнить
    # rndc reload
     
  • 1.2, dimus (??), 07:14, 28/02/2007 [ответить]  
  • +/
    Статья - это яркий пример того, как вредно не читать документацию. А в документации есть упоминание о такой полезной штуке, как переменная окружения VSFTPD_LOAD_CONF, которая указывает на конфиг для vsftpd а еще есть такая штука, как tcpwrappers, которая на основании /etc/hosts.allow может эту переменную устанавливать в разные значения в зависимости, например, от ИП - адреса, откуда идет коннект. Таким образом, все что нужно - это запускать vsftpd при помощи враппера и иметь разные конфиги на пользователей. Точнее даже не разные конфиги, а разные файлы с переопределяемыми параметрами - именно на них должна ссылаться приведенная выше переменная окружения.

    Пример hosts.allow:
    vsftpd: 192.168.0.0/255.255.255.0, 127.0.0.1: setenv VSFTPD_LOAD_CONF /etc/vsftpd-int.conf : nice 15
    vsftpd: 192.168.1.0/255.255.255.0 : setenv VSFTPD_LOAD_CONF /etc/vsftpd-ext.conf : nice 15

    cat /etc/vsftpd-int.conf
    # Этот конфиг для внутренних нужд - скорость по максимуму
    anon_max_rate=0
    local_max_rate=0

    tail /etc/vsftpd.conf
    ls_recurse_enable=YES
    chroot_local_user=YES
    tcp_wrappers=YES
    userlist_deny=YES
    userlist_enable=YES
    anon_max_rate=32000
    local_max_rate=64000

    видно, что переопределяется скорость закачки для клиентов из локальной сети. Аналогично можно переопределить любые параметры из vsftpd.conf

     
  • 1.3, gen (??), 16:00, 12/03/2007 [ответить]  
  • +/
    Хорошая статья, полезная. Для тех, кто устанавливает не на Slackware в этом месте:
    ---
    Из файла /etc/rc.d/rc.local.new копируем строки запуска сервера в наш
    файл /etc/rc.d/rc.local.
    ---
    было бы не плохо привести содержимое, поскольку из текста не ясно, что в этом файле должно быть (точнее, что нужно добавить..). Спасибо за статью!
     
  • 1.4, Diablo (??), 00:04, 22/07/2007 [ответить]  
  • +/
    На самом деле, вполне подойдет и стандартный inetd.
    --
    #man inetd
    For internet services, the first field of the line may also have a host address specifier prefixed to it, separated from the service name by a colon.  If this is done, the string before the colon in the first field indicates what local address inetd should use when listening for that service. Multiple local addresses can be specified on the same line, separated by commas.
    --
    10.13.0.1:ftp   stream  tcp     nowait  root    /usr/sbin/tcpd  vsftpd  /etc/vsftpd/eth0.conf
    10.13.1.1:ftp   stream  tcp     nowait  root    /usr/sbin/tcpd  vsftpd  /etc/vsftpd/eth1.conf
    --
     
  • 1.5, micro_bite (?), 12:20, 07/08/2007 [ответить]  
  • +/
    мне нужна помощь, по поводу скорости.

    так вот установил я этот сервер всё вроде работает. запускаю анонимный сервер и подключаюсь к нему через локалку (дома стоит еще два компа). так вот всё работает кроме скорости.

    короче на окачивание лимита нет, файлы летят со скоростью 8000 10000 килобайт, но вот закачка на сервер не поднимается выше 35-41 килобайт.

    применил параметр:
    anon_max_rate=0

    вроде должен снять ограничение, но этого не происходит. если выставить значение:

    anon_max_rate=2000

    соответствующая скорость получаю 2-5 килобайт, решил прописать:

    anon_max_rate=1000000

    скорость все равно не превышает 35-41 килобайт.

    при этом если к серверу еще с одного локального компа подключаюсь то и этот комп может вместе с первым на сервер закачивать со скоростью 35-41 килобайт вместе выходит 70-82 килобайта, значит какое-то ограничение на одного пользователя, но не могу понять какое.

    так вот помогите пожалуйста разобраться, может так и должно бить а может я что-то не то делаю.

     

    лог модерирования

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    MIRhosting
    Fornex
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру