Пример начальной настройки vsftpd в Ubuntu 9.10

Так получилось, что выбирая из двух ftp-серверов (proftpd и vsftpd) я выбрал последний, и по руководству на официальном сайте настроил на работе ftp-сервер с анонимным доступом. Сегодня решил настроить этот ftp-сервер на домашнем компьютере. Только уже не с анонимным доступом, а с доступом по паролю. Для этого в vsftpd можно использовать “виртуальные учетные записи”. Настройку vsftpd выполнял по руководству с официального сайта. Дальше собственно и будет это самое руководство в упрощенном виде, в моем вольном пересказе и с некоторыми дополнениями, касающимися Ubuntu 9.10.

Еще раз о задаче: настраиваю ftp-сервер, который будет доступен из сети Интернет на чтение. Для доступа к серверу необходимо ввести логин и пароль. Все действия выполнялись удаленно через ssh.

Сначала установим ftp-сервер vsftpd:

1
$ sudo apt-get install vsftpd

Теперь приступим к настройке.

Шаг первый. Создаем учетную запись виртуального пользователя (пользователей).

Для аутентификации виртуального пользователя будет использована подсистема PAM и ее модуль pam_userdb. Для модуля pam_userdb необходимо создать файл db-формата в котором будет содержаться учетная запись виртуального пользователя и пароль. Сначала необходимо создать обычный текстовый файл в котором будет логин и пароль, а затем на его основе сконвертировать db-файл.

Для генерации пароля использовал программу pwgen. Если pwgen не установлена, устанавливаем:

1
$ sudo apt-get install pwgen

Создаем файл login.txt, в котором будет логин - userftp и пароль:

1
2
$ echo userftp > login.txt
$ pwgen -N 1 >> login.txt

Проверяем файл login.txt:

1
2
3
$ cat login.txt
userftp
rekhahra

Далее генерируем db-файл - vsftpd_login.db с помощью утилиты db_load. Но сначала установим пакет в который входит данная программа:

1
$ sudo apt-get install db4.7-util

Теперь выполняем команду которая создаст db-файл:

1
$ sudo db4.7_load -T -t hash -f login.txt /etc/vsftpd_login.db

Устанавливаем разрешения на файл /etc/vsftpd_login.db:

1
$ sudo chmod 600 /etc/vsftpd_login.db

Шаг второй. Создаем PAM-файл в котором пропишем правила аутентификации. Для этого открываем в текстовом редакторе файл /etc/pam.d/vsftpd:

1
$ sudo nano /etc/pam.d/vsftpd

и в конце файла дописываем следующие две строки:

1
2
auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd_login

Остальные строки нужно закомментировать. В этом файле мы указываем подсистеме PAM выполнять аутентификацию на основе учетных записей, которые содержаться в созданном db-файле.

Шаг третий. Создаем локального пользователя и каталог для ftp-сервера. Локальный пользователь нужен, чтобы задать права для ftp-каталога. Этот пользователь не будет иметь пароля, и зарегистрироваться локально в системе используя эту учетную запись будет нельзя. Назовем учетную запись virtualftp, а каталог для ftp-сервера - /home/vsftp/. Создаем пользователя:

1
$ sudo useradd -d /home/vsftp -s /sbin/false virtualftp

Далее создаем каталог /home/vsftp/ и выставляем разрешения:

1
2
3
$ sudo mkdir /home/vsftp
$ sudo chown virtualftp:virtualftp /home/vsftp/
$ sudo chmod 700 /home/vsftp/

Проверяем разрешения:

1
2
$ sudo ls -l /home/
drwx------  2 virtualftp virtualftp  4096 2010-03-30 21:21 vsftp

Шаг четвертый. Создаем конфигурационный файл vsftpd.conf. Переместим существующий файл в домашний каталог:

1
$ sudo mv /etc/vsftpd.conf ~

а на его месте создадим новый (sudo nano /etc/vsftpd.conf) следующего содержания:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
anonymous_enable=NO
local_enable=YES
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
anon_world_readable_only=NO
guest_enable=YES
guest_username=virtualftp
chroot_local_user=YES
listen=YES
listen_port=10021
pasv_min_port=30000
pasv_max_port=30999

Пояснения к параметрам пока писать не буду так как они хорошо описаны в оригинальном руководстве.

На этом настройка vsftpd закончена. Скопируем в каталог /home/vsftp/ какой-нибудь файл для проверки:

1
$ sudo cp hello.txt /home/vsftp/

Выставим разрешения для пользователя virtualftp:

1
2
$ sudo chown virtualftp:virtualftp /home/vsftp/hello.txt
$ sudo chmod 700 /home/vsftp/hello.txt

Теперь выполним рестарт ftp-сервера:

1
2
3
$ sudo /etc/init.d/vsftpd restart
 * Stopping FTP server: vsftpd     [ OK ]
 * Starting FTP server: vsftpd     [ OK ]

Проверяем работу ftp-сервера:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ftp localhost 10021
Connected to localhost.
220 (vsFTPd 2.2.0)
Name (localhost:igor): userftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rwx------    1 1003     1004            8 Mar 30 18:37 hello.txt
226 Directory send OK.

ftp-сервер vsftpd - работает. Обращаю также внимание на, что в качестве логина используется не локальная учетная запись (virtualftp), а виртуальная учетная запись userftp, которая создавалась на первом шаге.

Если необходимо вести лог-файл, то в конфигурационный файл /etc/vsftp.conf нужно добавить строчку:

1
xferlog_enable=YES

В этом случае информация о работе ftp-сервера будет записываться по умолчанию в файл /var/log/vsftpd.log.

Для того чтобы ftp-сервер был доступен из сети Интернет, пробросил на своем модеме D-Link 2640 необходимые порты. Описывать здесь эту процедуру не буду, чтобы не перегружать статью. Скорее всего напишу об этом отдельно.

В завершении темы о настройке vsftpd рекомендую перевод man vsftpd.conf в котором расписаны значения каждого параметра файла vsftpd.conf.

Статьи и новости схожей тематики:

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

  1. sergkarpenko:

    мдя, как оно все устроено по хитрому
    а я просто использую пароль юзера в системе :(

    а если по ссх заходить из под такого юзера без пароля - совсем не пустит в систему? или выбросит назад в консоль?

    Ответить

    Igorka Reply:

    Из под любого юзера не пустит. Виртуальных - так как они виртуальные, а virtualftp не пустит, так как у него ни пароля нет ни шелла.

    Ответить

    sergkarpenko Reply:

    а под pam-mysql не пробовал? что то мне беркли дб не сильно нравится
    если получится pam-mysql я себе сделаю через pam-mysql
    и напишу пару скриптов и будет у мну вхост с фтп создаваться через веб-морду :)

    Ответить

    Igorka Reply:

    Не пробовал. Я делал по конкретному руководству. И для конкретной задачи. Просто я сейчас так и на работе сделал. А с mysql все получится, так как когда количество пользователей большое и они постоянно добавляются, то именно mysql и используют. Не будешь же под каждого пользователя заново базу создавать. Там в примере berkeley db, для простоты была указана, чтобы было проще разобраться в самом механизме. Это я так думаю :)

    Ответить

    sergkarpenko Reply:

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

    Ответить

    Igorka Reply:

    Кстати на работе сделал для двух виртуальных пользователей и с разными каталогами. Например, есть два виртуальных пользователя: user1 и user2. Создаем два каталога: /home/vsftp/user1 и /home/vsftp/user2. В файл vsftpd.conf добавляем еще две строки:

    1
    2
    local_root=/home/vsftp/$USER
    user_sub_token=$USER

    Теперь если зайти на фтп под учетной записью user1, то попадаем в в каталог /home/vsftp/user1, видим файлы только этого каталога и он же является корневым, если заходим под учеткой user2, то соответственно попадаем в каталог /home/vsftp/user2. Думаю принцип понятен.

    Ответить

    sergkarpenko Reply:

    у меня чуть более сложный случай,
    у меня есть случаи, когда папка и юзер называются по разному :)
    нужно конечно переделать, но там сайтов уже порядка 15 висит и не сильно хочется

    Ответить

    sergkarpenko Reply:

    сейчас читаю про pam-mysql

    Ответить

    sergkarpenko Reply:

    и еще хочу настроить FTPS навсякий, не знаю только насколько сильно оно проц грузит

    Ответить

    L1kbezZz Reply:

    Помогите плз! У меня такая проблема: я все настроил, все работает, только вот никак не хочет разрешать записывать файлы на сервер, что только не пробовал… Есть какие-нибудь идеи?((

    Ответить

    Igorka Reply:

    Что “все настроил”? Что “все работает”? Что “не хочет записывать файлы” и куда? Согласитесь на такой вопрос трудно, что либо ответить… Разве, что-нибудь из области “посмотрите там, исправьте здесь и все начнет записывать” :) Конкретней пожалуйста.

    Ответить

    L1kbezZz Reply:

    Извиняюсь за такой неконкретный вопрос=)
    Но, оказалось все в порядке, помог reboot =)
    п.с. За статью спасибо.

    Ответить

  2. sergkarpenko:

    еще недавно прочитал, что автор vsftpd добавил в сервер поддержку http ;)
    http://www.opennet.ru/opennews/art.shtml?num=25883

    читая там комменты застрял в них на пару часов. там такой срач устроили :)

    Ответить

  3. Александр:

    Спасибо тебе добрый человек, просто и понятно с пояснениями, отличный пример быстрого старта.
    Кстати, все тоже актуально и для 10.04.

    Ответить

    Igorka Reply:

    Пожалуйста! И спасибо за отзыв.

    Ответить

  4. andor:

    День добрый всем!
    Есть задача выпустить в инет фтп сервер который находится за шлюзом (нат).
    Уже кучу вариантов перебрал.
    Результат - не отрабатывает команда LIST. Тоесть все перенаправляется кроме того что папка юзверя получается пустой.
    Сейчас пользуюсь tcpproxy.

    Чего порекомендуете?

    Ответить

    Igorka Reply:

    Добрый день,

    Мой домашний ftp (настроенный по описанному выше варианту) тоже находится за натом (ADSL модем в режиме роутера). Все работает корректно. А права на просмотр каталога у юзера есть?

    Ответить

  5. andor:

    Если цепляюсь CuteFTP то пишет в логах:
    КОМАНДА:> [22.06.2010 17:36:47] USER qwe
    [22.06.2010 17:36:47] 331 Please specify the password.
    КОМАНДА:> [22.06.2010 17:36:47] PASS *****
    [22.06.2010 17:36:47] 230 Login successful.
    СОСТОЯНИЕ:> [22.06.2010 17:36:47] Вход выполнен.
    КОМАНДА:> [22.06.2010 17:36:47] PWD
    [22.06.2010 17:36:47] 257 “/”
    СОСТОЯНИЕ:> [22.06.2010 17:36:47] Домашний каталог:/
    СОСТОЯНИЕ:> [22.06.2010 17:36:47] Данный узел поддерживает функции.
    СОСТОЯНИЕ:> [22.06.2010 17:36:47] Данный узел поддерживает SIZE.
    СОСТОЯНИЕ:> [22.06.2010 17:36:47] Данный узел может возобновить прерванные загрузки.
    КОМАНДА:> [22.06.2010 17:36:47] REST 0
    [22.06.2010 17:36:47] 350 Restart position accepted (0).
    КОМАНДА:> [22.06.2010 17:36:47] PORT 192,168,0,152,11,221
    [22.06.2010 17:36:48] 500 Illegal PORT command.
    ОШИБКА:> [22.06.2010 17:36:48] Синтаксическая ошибка: команда не распознана.
    ОШИБКА:> [22.06.2010 17:36:48] Не удалось установить сокет данных.

    Ответить

  6. setler:

    Настраиваю vsftpd под ubuntu 8.04. Всё получается, только есть пару вопросов.
    1. Не получается запереть пользователя в свой домашней папке. Заходит в неё нормально, а потом может выйти на уровень выше и гулять где угодно. Какой параметр нужно добавить.
    2. При входе пользователем на FTP в свою папку кирилица показывает абракадаброй. Как настроить чтобы нормально русские имена отображало?

    Спасибо.

    Ответить

    Igorka Reply:

    1. Смотрите в сторону параметра chroot_local_user.
    2. Официальный релиз vsftpd с кириллицей не очень дружит. Поэтому рекомендуют использовать неофициальную версию, которую можно найти на сайте http://vsftpd.devnet.ru/ Сам не использовал пока.

    Ответить

  7. Денис:

    А есть способы добавления пользователей в уже существующую ив?

    Ответить

  8. Сергей:

    сделал все так же как у автора, прям все команды копировал и у себя в консоле вставлял, все прошло хорошо…но никак не могу зайти на ФТП, пишет,что не правильно указан логин или пароль…в чем проблема ? логин и пароль ввожу те что у меня в login.txt

    Ответить

    Сергей Reply:

    проблему решил - забыл закомментировать ненужные строки в /etc/pam.d/vsftpd , теперь другая проблема - нету доступа на запись, как решить ?

    Ответить

    Igorka Reply:

    Хорошо, что решили проблему самостоятельно. Нужно будет выделить в статье слово “закомментировать”. А то, что нет записи - это не проблема данной статьи. Читайте начало: “Еще раз о задаче: настраиваю ftp-сервер, который будет доступен из сети Интернет на чтение”. На чтение, подчеркиваю. О записи здесь речь не идет. Если нужна запись - смотрите параметры vsftp сервера: http://www.opennet.ru/man.shtml?topic=vsftpd.conf&category=5&russian=0 . Пробуйте, экспериментируйте. Если не получится - пишите, будем вместе решать.

    Ответить

    Сергей Reply:

    проблему с записью решил так - добавил в конфиг строки virtual_use_local_privs=YES и local_umask=700 т.е. виртуальный пользователь наследует права реального.Но появилась другая проблема - файлы, закачанные на фтп не имею никаких прав, в конфиг добавил параметры - local_umask=0700 и file_open_mode=0700, судя по мануалу они дают права на закачанные файлы..но почему то не работает это, а следовательно я немогу перезаписать уже закачанный файл. ((((

    Ответить

    Сергей Reply:

    и эту проблему решил…. вообщем удалил из конфига local_umask и file_open_mode, перезагрузился и вроде как все хорошо стало

    Ответить

    Igorka Reply:

    “Перезагрузился” имеется ввиду выполнил команду sudo /etc/init.d/vsftpd reload ?

    Ответить

    Igorka Reply:

    А изменить опцию write_enable на YES ?

    Ответить

    Сергей Reply:

    проблема решена именно удалением local_umask и file_open_mode из конфига.Write_enable стоит YES.

    Ответить

    Igorka Reply:

    В статье эта опция установлена в NO (write_enable=NO)
    Вы писали, что сделали все как у автора, а затем написали какие параметры меняли, чтобы разрешить запись. write_enable среди этих параметров не было. Поэтому и возникает естественный вопрос о нем. Другие читатели прочитав ваш комментарий и выполнив те же действия не получат запись, так как вы ничего не cказали о том, что параметр write_enable также нужно установить в YES.

    Ответить

    Сергей Reply:

    извеняюсь, этот параметр я изменил на YES, но не он отвечает за запись т.к. что с ним что без него у меня не получалось все равно записать.Помогло добавление virtual_use_local_privs=YES … без этого параметра виртуальные пользователи наследуют права анонимов, которые имеют ограничения на запись.

    Ответить

    Igorka Reply:

    Извинения приняты. Подытожу для посетителей: чтобы разрешить виртуальному пользователю запись, нужно в конфигурационный файл представленный в статье, добавить строчку virtual_use_local_privs=YES и изменить значение параметра write_enable с NO на YES.

    Ответить

  9. Сергей:

    есть другая задача, немогу решить…как сделать, чтобы
    к примеру 1user мог зайти в главную папку к примеру /home/vsftpd , в ней мог читать и писать а затем в этой папке мог переместиться в свою личную папку - /home/vsftpd/1user и из нее только читать, т.к. в папке vsftpd будут папки других пользователей (/home/vsftpd/1user….2user…3user и т.д.) то он не должен иметь доступ к ним, только на свою! ..вот такая задачка %)

    Ответить

    Igorka Reply:

    Как сделать точно так как вы хотите пока не знаю. Если я правильно понял идею, то нужен каталог общий для всех где все пользователи могут читать и писать, а также индивидуальный каталог для каждого, в котором только один пользователь имеет доступ на чтение.
    Тогда можно создать подкаталог /home/vsftpd/pub - общий для всех и личные подкаталоги /home/vsftpd/1user….2user…3user. Если нужно записать информацию подключаемся под пользователем pub (пароль которой известен всем) и записывает или читает информацию из каталога. Если нужно в свой, то подключается под своей учетной записью.
    Правда эта схема не очень удобна когда нужно часто копировать файлы из своего каталога в каталог pub

    Ответить

    Ilya Reply:

    То что вы описываете это очень просто реалезуеться с помощью apparmor + pam.

    Ответить

  10. Ilya:

    Есть другая задача: разрешить вход в систему пользователю B без пароля в случае если пользователь A уже в системе.

    Ответить

  11. max:

    Спасибо тебе добрый человек всё гуд!! заработало на раз !!!

    Ответить

    Igorka Reply:

    Пожалуйста. Заходите еще!

    Ответить

  12. Konstantin:

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

    Ответить

    Igorka Reply:

    Не за что. Спасибо за высокую оценку.

    Ответить

  13. Konstantin:

    Если можно хотелось бы поподробней узнать про добавление в файл базы данных логина и пароля новых виртуальных пользователей. Иными словами просто как добавить несколько пользователей со своими папками для доступа?

    Ответить

    Igorka Reply:

    В комментариях я упоминал об этом - http://igorka.com.ua/2010-03-31/primer-nachalnoj-nastrojki-vsftpd-v-ubuntu-910/comment-page-1/#comment-2767 Там все достаточно просто.

    Ответить

    foxlis Reply:

    Добрый день, не могу понять как добавлять несколько пользователей с именами схожими со своими каталогами

    Ответить

    Konstantin Reply:

    Да но тут http://igorka.com.ua/2010-03-31/primer-nachalnoj-nastrojki-vsftpd-v-ubuntu-910/comment-page-1/#comment-2767 не написано как конкретно в файл базы данных добавить двух юзеров, так как у меня получается ошибка при добавлении и к тому же про различные имена катологов тоже нет информации.
    Спасибо заранее.

    Ответить

  14. Юрий:

    Здравствуйте, уважаемый автор!
    А не приходилось ли вам ставить из исходников пропатченный vsftpd отсюда: http://vsftpd.devnet.ru/
    Мне необходимо, чтобы русские названия файлов и каталогов были читаемы, но поставить из этих сырцов никак не получается. Если поставите и напишете мануал, как это грамотно сделать, будет вам респект от многих граждан!
    Да, чуть не забыл, ставлю на сервер ubuntu 10.04

    Ответить

    Igorka Reply:

    Юрий, здравствуйте.
    О пропатченном vsftpd читал, но не ставил. Как только появится свободное время, обязательно попробую и отпишу.

    Ответить

  15. Женя:

    Здравствуйте, у меня проблема, заключается она в том что после настройки с localhost заходит без проблем, с внешнего ип доходит до пароля, и после его ввода выдает ошибку типа неудачная авторизация…комп стоит за роутером…порт ставил стандартный 21-й, на роутере он открытый (та если бы был закрытый, то и до авторизации бы не дошло, если я правильно понимаю)…подскажите, пожалуйста, где искать решение проблемы

    Ответить

    Igorka Reply:

    Добрый день,
    Здесь нужно разбираться. Возможно вы подключаетесь к самому роутеру. Так как к роутеру есть возможность подключится по FTP протоколу. Попробуйте набрать логин и пароль роутера когда подключаетесь на внешний адрес, если подойдет значит подключаетесь к роутеру, а не фтп-серверу. Для того чтобы подключатся к фтп-серверу за роутером, нужно на роутере пробросить фтп-порты, плюс не забывать, что если фтп-сервер работает в пассивном режиме то нужно еще пробросить и диапазон портов для пассивного режима.

    Ответить

  16. Egor:

    Приветствую. Спасибо за статью http://igorka.com.ua/2010-03-31/primer-nachalnoj-nastrojki-vsftpd-v-ubuntu-910 , очень помогла.
    Игорь, помогите мне пожалуйста.
    Мне нужно реализовать в vsftp команду REIN

    Всё делал по мануалу.
    Конфиг прилагаю.
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    anon_upload_enable=YES
    anon_mkdir_write_enable=NO
    anon_other_write_enable=NO
    anon_world_readable_only=NO
    guest_enable=YES
    guest_username=virtualftp
    chroot_local_user=YES
    chroot_list_enable=YES
    listen=YES
    listen_port=21
    pasv_min_port=30000
    pasv_max_port=30999
    virtual_use_local_privs=YES
    xferlog_enable=YES

    пишет REIN not implemented.
    Добавление строки cmds_allowed=ABOR,ACCT,ALLO,APPE,CDUP,CWD,DELE,EPRT,EPSV,FEAT,HELP,LIST,MDTM,MKD,MODE,NLST,NOOP,OPTS,PASS,PASV,PORT,PWD,QUIT,REIN,REST,RETR,RMD,RNFR,RNTO,SITE

    не помогает.

    Заранее спасибо

    Ответить

  17. Andrey:

    Приветствую.
    Делаю все как описано в статье, но не пускает меня на фтп, причем даже на стадии локального входа. Пароль ввожу верно.

    root@ip:/etc# ftp localhost 10021
    Connected to localhost.
    220 (vsFTPd 3.0.2)
    Name (localhost:ubuntu): userftp
    331 Please specify the password.
    Password:
    530 Login incorrect.
    Login failed.

    вот что в vsftpd.conf

    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    anon_upload_enable=NO
    anon_mkdir_write_enable=NO
    anon_other_write_enable=NO
    anon_world_readable_only=NO
    guest_enable=YES
    guest_username=unityftp
    chroot_local_user=YES
    listen=YES
    listen_port=10021
    pasv_min_port=30000
    pasv_max_port=30999

    Ответить

Оставьте свой отзыв