пятница, 17 августа 2007 г.

Создание FTP сервера с поддержкой русских имен файлов

После того, как вы установили Linux, вам, возможно, захочется поднять свой FTP сервер. Если до этого вы до сих пор не задавались такой целью, то, скорее всего, побродив по интернету в поисках наиболее удобного для вас сервера и даже поставив пару из них, вы обнаружите, что ни один из них не умеет правильно работать с файлами, имена которых содержат русские буквы.

Вы можете сказать, что выкладывать на FTP сервер файлы с русскими именами - плохая идея. Я с вами соглашусь, но только в том случае, когда вы настраиваете FTP сервер, имеющий выход в интернет. Если же он вам нужен исключительно для локальной (городской) сети, где каждый выкладывает на общий доступ практически весь свой диск за исключением личных файлов, то, скорее всего, вам все-таки понадобится FTP сервер, который нормально работает с именами файлов, содержащими русские буквы, т. к. далеко не все могут похвастаться тем, что на их компьютере все файлы содержат исключительно символы латинского алфавита. И я в их числе. :)

Сразу скажу, что данные проблемы имеются у FTP серверов не потому, что их пишут плохие программисты. :) Дело в том, что стандарту, описывающему протокол FTP уже довольно много лет, и создавался он тогда, когда о таких вещах, как интернационализация никто не задумывался. А дотошные UNIX программисты четко следуют стандартам. :)

Помню как пару лет назад я настраивал сервер proftpd, который некорректно работал с файлами, содержащими букву "я". Тогда приходилось на него ставить патч, чтобы все работало нормально. Как сейчас у него с этим обстоят дела, я не в курсе, т. к. пользуюсь другим сервером - vsftpd, о котором и пойдет речь в данной статье. Проблема у него такая же, но источник проблемы другой.

Практически во всех современных дистрибутивах установлена локаль ru_RU.UTF-8, а, следовательно, FTP сервер выдает имена файлов в кодировке UTF-8. Но подавляющее большинство Windows'овских FTP клиентов считают, что все сообщения FTP сервера идут в кодировке Windows-1251. Поэтому пользователь, зашедший к вам на FTP сервер, например, через стандартный Windows'овский проводник, видит белиберду вместо нормальных имен файлов.

Так что для того, чтобы наш сервер понимали все клиенты, FTP сервер должен при обмене сообщениями с клиентом автоматически перекодировть их из UTF-8 в Windows-1251 и обратно.

Заставить vsftpd производить такую перекодировку без правки исходного кода невозможно. Но, бродя по просторам интернета в поисках решения данной проблемы, я наткнулся на проект под названием vsftpd.ext. vsftpd.ext - это все тот же vsftpd, но только со слегка расширенным функционалом. Вот он то как раз и умеет перекодировать имена файлов из одной кодировки в другую.

Так что если вас все устраивает в vsftpd - вперед. Ставьте vsftpd.ext, читайте документацию по vsftpd, благо написана она очень даже неплохо.

На мой взгляд, если вам не нужно настраивать для FTP сервера каких-нибудь экзотических прав доступа - vsftpd очень неплохой выбор.

Для ленивых или для тех, кто что-то не понял в документации, выкладываю свои конфигурационные файлы.

/etc/xinetd.d/vsftpd:
# default: on
# description:
#   The vsftpd FTP server serves FTP connections. It uses
#   normal, unencrypted usernames and passwords for authentication.
#   vsftpd is designed to be secure.

service ftp
{
socket_type = stream
wait        = no
user        = root
server      = /usr/local/sbin/vsftpd
nice        = 0
disable     = no

# Max connections
instances   = UNLIMITED

# Max connections per IP
per_source  = 2
}

/etc/vsftpd.user_list:
anonymous
friend

/etc/vsftpd.conf:
ftpd_banner=Welcome to my FTP server!

# vsftpd будет запускаться через inetd
listen=NO

# Разрешаем анонимусов
anonymous_enable=YES

# Домашний каталог анонимуса
anon_root=/home/anonymous

# Разрешить анонимусам создавать дирректории
anon_mkdir_write_enable=YES

# Запрещаем анонимусам удалять и переименовывать файлы
anon_other_write_enable=NO

# Разрешить анонимусам заливать файлы (write_enable должна быть активирована)
anon_upload_enable=YES

# Не требуем у анонимуса пароль
no_anon_password=YES

# Разрешаем скачивать анонимусам только те файлы, у которых стоит разрешение на чтение для всех
anon_world_readable_only=YES

# Выставляет владельца для залитых файлов равным chown_username
chown_uploads=YES

# Владелец файлов, залитых анонимусами (актуально только при включенном chown_uploads)
chown_username=dmitry

# Имя анонимного пользователя
ftp_username=anonymous

# Маска для залитых анонимными пользователями файлов
anon_umask=000

# Отображать владельца так, как будто всегда владелец и группа - пользователь ftp
hide_ids=YES

# Запрещаем локальным юзерам выполнять SITE CHMOD (анонимусам такое никогда не разрешено)
chmod_enable=NO

# Разрешаем логиниться локальным юзерам
local_enable=YES

# Разрешаем ls -R
ls_recurse_enable=YES

# Не разрешаем локальным юзерам выходить за пределы домашней дирректории
chroot_local_user=YES

# Если нужен подробный лог (для отладки)
log_ftp_protocol=NO

# Включаем использование списка разрешенных/запрещенных пользователей
userlist_enable=YES

# Список пользователей отражает только разрешенных пользователей
# Внимание!!! Данный файл не должен быть пустым - иначе будут допускаться все пользователи!
userlist_deny=NO

# Виртуальным юзерам будут присвоены те привилегии, которые есть у соответствующих им локальных юзеров.
virtual_use_local_privs=YES

# Разрешаем запись
write_enable=YES

# Отбражение информации, о том, кто подключен в данный момент информации о процессах
setproctitle_enable=YES

# Включаем лог
xferlog_enable=YES

# Скорость для анонимусов
anon_max_rate=0

# Таймаут для клиентской сессии
idle_session_timeout=300

# Скорость для локальных юзеров
local_max_rate=0

# Маска для файлов, создаваемых локальными юзерами
local_umask=000

# Максимальное количество одновременно подключенных клиентов
max_clients=0

# Максимальное количество потоков от каждого клиента
max_per_ip=2

# Не проверяем шелл для локальных юзверей
check_shell=NO

# Пустая папка для нужд фтп сервера
secure_chroot_dir=/home/anonymous

# Настройки кодировки для расширенной версии vsftpd
convert_charset_enable=1
local_charset=UTF8
remote_charset=WIN1251
Домашняя страница vsftpd: http://vsftpd.beasts.org/
Домашняя страница vsftpd.ext: http://vsftpd.devnet.ru/

Да, и один маленький совет: если вы все настроили, но почему-то сервер не работает, включите в конфиге standalone запуск (опция listen) и запустите его из терминала - в таком случае он выведет ошибку на консоль.

Удачи!

2 комментария:

Константин комментирует...

Спасибо большое Дмитрий.
Ваша статья очень мне помогла.

Dmitry комментирует...

Написано гладко. Наверное все так и есть. Только Линукс не каждому по зубам. А вот рекомендации для Винды не вижу.
А хотелось бы чтоб и Винда могла делать что-то подобное.