19 марта 2013

Пассивный и активный FTP

В этой статье объясняется в чем разница между пассивным и активным режимами. Это показывается на примере vsftpd и ipfw.  Даются рекомендации по их настройке и описываются необходимые правила фаервола.

На иностранном языке это называется PORT и PASV mode. FTP-соединение всегда начинается одинаково для пассивного и активного режимов. Клиент устанавливает соединение с произвольного порта на 21 порт сервера и передает логин/пароль.
Дальше, если используется активный режим, то клиент сообщает серверу произвольный порт из диапазона 1024-65535, по которому сервер может подключится и организовать канал передачи данных. Со стороны сервера используется порт 20.
Если выбран пассивный режим, то наоборот сервер сообщает номер произвольного порта, по которому клиент может подключиться для организации канала передачи данных.

Активный режим безопаснее для сервера и разрешается всего двумя правилами фаервола. Правило на открытие 21 порта для входящего трафика и правило на 20 порт для исходящего. В активном режиме работает Total Commander, и все ftp-клиенты FileZilla, Cute FTP и др.  Но для клиента безопаснее пассивный режим и поэтому браузеры и проводник Windows используют пассивный режим. Здесь на стороне сервера нужно открыть для входящего трафика 21 порт и весь диапазон 1024-65535. Весьма не безопасно, но на vsftpd этот диапазон может быть уменьшен параметрами pasv_min_port и pasv_max_port. Для полной совместимости со всеми клиентами на сервере придется использовать оба режима.

В vsftpd пассивный режим включается опцией
pasv_enable=YES
а активный
port_enable=YES

Далее приведу целиком свой конфиг vsftpd.conf

# vsftpd работает самостоятельно, без помощи inetd/xinetd в "standalone mode"
listen=YES

# слушаем 21 порт
listen_port=21

# работа в фоновом режиме
background=YES

# приветствие при входе
ftpd_banner=Welcome you to Serra's FTP Server! Here is allowed only 10 users with 10 connections at the same time. Have a pleasant pastime!

# включаем пассивный режим
pasv_enable=YES

# диапазон портов для пассивного режима
pasv_min_port=40000
pasv_max_port=40500

# максимальное количество клиентов, которые могут быть подключены
max_clients=10

# максимальное количество соединений с одного ip
max_per_ip=10

# запрет анонимных пользователей
anonymous_enable=NO

# Разрешить локальных пользователей из файла /etc/passwd
local_enable=YES

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

# домашние директории, которые указаны в файле /etc/passwd
passwd_chroot_enable=YES

# пользователи указанные в vsftpd.chroot_list не запираются в тюрьму
chroot_list_enable=YES

# отключаем проверку которая вызывает ошибку "vsftpd: refusing to run with writable root inside chroot()"
allow_writeable_chroot=YES

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

# задаём права для файлов, но не каталогов
file_open_mode=0777

# маска на создаваемые локальными пользователями файлы.
local_umask=002

# безопасный каталог, должен быть пустым и без прав записи пользователю ftp
secure_chroot_dir=/var/empty

# включаем запись логов
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log

# пользователи из списка vsftpd.user_list блокируются перед запросом пароля
userlist_enable=YES

# разрешаем ативный режим
port_enable=YES

# исходяшие соединения идут с 20 порта
connect_from_port_20=YES

# входящие соединения на 20 порт
ftp_data_port=20

# поддержка древних FTP клиентов
async_abor_enable=YES

# скрываем настоящих владельцев файлов на ftp
hide_ids=YES
Чтобы лог-файл не переполнялся, обязательно нужно настроить его ротацию.
Открываем /etc/newsyslog.conf  и добавляем строчку:
/var/log/vsftpd.log  600  2     1024 *     ZC 
Он будет ротироваться при достижении 1 MB и сжиматься.

Говоря про vsftpd еще нужно отметить, что он не умеет работать с кириллицей windows , поэтому если вам нужна такая функция, то надо ставить из портов версию  vsftpd-ext, в ней реализована перекодировка на лету в CP1251. Настраивается опциями:
convert_charset_enable=YES
local_charset=UTF8
remote_charset=WIN1251
Еще для этой версии, что бы корректно работал автозапуск нужно добавить файл /etc/rc.local со следующими строчками:
/usr/local/libexec/vsftpd /usr/local/etc/vsftpd.conf
Правила для ipfw должны быть следующими, где rl1 - внешний интерфейс:
add 1050 allow tcp from any to me 20,21, 40000-50000 in via rl1
add 1060 allow tcp from me 20 to any out via rl1

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

Отправка комментария