Зачем:
Ну, даже не знаю, зачем нужен фтп-сервер.
Давайте договоримся, что модный админ с модным сервером не мыслит жизнь свою без обязательного атрибута в виде фтп.
Если серьезно - один из хороших вариантов распространения файлов. У меня по фтп бегает обновления антивируса, windows, ползеркала gentoo и проч.
Установка:
Я долгое время пользовался proftpd. Спустя несколько лет захотелось чего-то новенького, не так муторного в настройке и, главное, легкого и гибкого. Путем опроса коллег-админов об альтернативных решениях попробовал несколько демонов и остановился на vsFTPd. Если бы не несколько очень мелких ньюансов, можно было бы утверждать про "идеальный вариант".
"Штатный"
vsftpd не всегда красиво дружит с кириллицей, поэтому пользуюсь "модом" по имени
vsftpd-devnet . К сожалению, эта редакция не входит в штатный набор ebuild-ов, поэтому вариантов два: либо писать/искать ебилд самому, либо поискать в альтернативных деревах portage (иначе - в overlay-ях). Когда писал этот текст, мне больше понравился второй вариант, поэтому "план такой":
1. Ставим и настраиваем layman для работы с альтернативными portage.
2. Находим vsftpd-devnet и ставим-настраиваем штатным для Gentoo способом.
2.1 Установка и настройка Layman.
Так как некоторые наборы идут по subversion, у меня флагами сборки это предусмотрено:
emerge -pav layman
[ebuild N ] app-portage/layman-1.3.3 USE="subversion -bazaar -cvs -darcs -git -mercurial -test" 0 kB
Ставим:
emerge layman
Обновляем общий список "альтернативщиков":
layman --fetch
Ради интереса посмотрим, сколько их вообще на свете:
layman --list
Добавлю в свой локальный набор отдельно взятый оверлей:
layman --add sunrise
cat /var/lib/layman/make.conf >> /etc/make.conf
Для проверки успешности, поищем наш демон:
emerge -Ss vsftpd
Один из овтетов будет что-то типа
* net-ftp/vsftpd-devnet
Latest version available: 2.1.2_p1
Latest version installed: [ Not Installed ]
Size of files: 196 kB
Homepage: http://vsftpd.devnet.ru/
Description: Very Secure FTP Daemon with devnet patchset
License: GPL-2
Ура, оверлей подцеплен и работает, осталось только поставить:
emerge -p vsftpd-devnet
[ebuild N ] net-ftp/ftpbase-0.01-r1 USE="pam"
[ebuild N ] net-ftp/vsftpd-devnet-2.1.2_p1 USE="pam ssl tcpd -caps (-selinux) -xinetd"
emerge vsftpd-devnet
2.2 Настройка.
Настройки, как обычно, лежат в
/etc/vsftpd/vsftpd.conf.
По идее, наверно и как обычно, останавливаться на каждой строчке не буду, если кому-то будет интересно, то отпишет.
Полный набор настроек можно увидеть
тут или (частично переведенный вариант)
тут.
На данную минуту у меня нет цели сделать авторизацию виртуальных пользователей или загнать базу авторизации в базу, также нет цели делать анонимный фтп (терпеть ненавижу!), так что авторизация пойдет по логину и паролю существующего в системе пользователя. Дополнительно есть цель "запереть" пользователя в рамках его домашнего каталога.
# cat /etc/vsftpd/vsftpd.conf
listen=YES
connect_from_port_20=YES
idle_session_timeout=60000
data_connection_timeout=12000
nopriv_user=nobody
ascii_upload_enable=NO
ascii_download_enable=NO
convert_charset_enable=YES
local_charset=UTF8
remote_charset=WIN1251
local_enable=YES
write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
user_config_dir=/etc/vsftpd/users
userlist_file=/etc/vsftpd/user.allowed
userlist_enable=YES
userlist_deny=NO
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/user.chrooted
anonymous_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
no_anon_password=YES
anon_root=/home/ftp
connect_from_port_20=YES
async_abor_enable=YES
use_localtime=YES
#background=YES
dirmessage_enable=YES
ftpd_banner=Hi! We come in atos ftp server
chown_uploads=NO
xferlog_enable=YES
idle_session_timeout=600
data_connection_timeout=120
chroot_list_enable=YES
ls_recurse_enable=NO
Файл, в котором по-строчно перечисляются пользователи разрешенные к логину:
#cat user.allowed
testuser
Файл, в котором построчно перечисляются пользователи, имеющие доступ за пределы домашнего каталога.
#cat user.chrooted
admin
В этом каталоге, в каждом файле, идет перекрытие общих настроек демона под конкретный логин
#cat ./users/testuser
convert_charset_enable=NO
local_root=/home/gentoo/
force_dot_files=YES
Дополнительно:
1. Надо помнить, что simlink в ФТП не работает. Только конструкции вида
mount --bind /mnt/hdd1-750gb/dvd /home/testuser/dvd
(монтирование одного каталога в другой).
2. Файлы, имя которых начинается с точки по умолчанию не отображаются. Включить это можно опцией
force_dot_files=YES в глобальном конфиге (правда, нафига?) или в конфиге конкретного пользователя.
3. Если в машине несколько интерфейсов, демон можно привязать к айпишнику и/или пору:
listen_address=1.2.3.4
listen_port=30005
4. Можно на-лету менять права загружаемых файлов (как глобально, так и по акканту):
chown_uploads=YES
chown_username=ftpuser #непосредственно имя нового владелеца
local_umask=007 # права "наоборот", например 007 для 770.
5. Если фантазия не может уложить приветственный баннер в одну строку, можно указать файл:
banner_file=/etc/vsftpd/vsftpd.banner
6. Можно регулировать скорости работы:
anon_max_rate=0 # или anon_max_rate=32000
local_max_rate=0 # или local_max_rate=64000
7. Можно задать разные конфиги для разных сетей:
Допустим, внутриофисная сеть 192.168.0.0/24, с которой надо что-то разрешить, а для остальных - запретить.
Редактируем файл
/etc/hosts.allow
#Разрешаем внутренней сети, конфиг под нее /etc/vsftpd/vsftpd-int.conf :
vsftpd: 192.168.0.0/255.255.255.0, 127.0.0.1: setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpd-int.conf : nice 15
#Для всех остальных - иные правила, конфиг под них штатный, /etc/vsftpd/vsftpd.conf :
vsftpd: ALL : nice 15
Не отвеченные вопросы:
Так до конца и не раскопал, как сделать раздельное логгирование, например, по каждому пользователю. Но пока списываю на собственную лень. И не пробовал прикручивать mysql как базу авторизации - остановило то, что виртуальных пользователей надо отображать на что-то реальное… Как-нибудь продолжу эксперименты
Совсем, как всегда, забыл: неплохо было бы его добавить в автозагрузку:
rc-update add vsftpd default