Некоторые роутеры или файрволы достаточно умны. Они анализируют подключения и при обнаружении FTP-подключения бесшумно подменяют данные передающиеся между клиентом и сервером. Такое поведение является саботажем данных и может доставить неприятности, если пользователь не разрешил такое поведение явным образом.
Приведем пример. Предположим, что клиент находится за NAT-роутером и пытается подключиться к серверу. Предположим также, что клиент не осведомлен в том, что он находится за NAT и использует активный режим. Клиент отсылает команду PORT со своим локальным, немаршрутизируемым IP-адресом, серверу:
PORT 10,0,0,1,12,34
Эта команда указывает серверу на подключение по адресу 10.0.0.1 на порту 12*256+34 = 3106
После этого NAT-роутер бесшумно подменяет команду, включая внешний IP-адрес, а также создает временный порт для переброски FTP-сессии, возможно даже на другом порту:
PORT 123,123,123,123,24,55
Эта команда указывает серверу на подключение по адресу 123.123.123.123 на порту 24*256+55 = 6199
Благодаря такому поведению NAT-роутер позволяет неправильно настроенному клиенту использовать активный режим.
Почему такое поведение не является приемлемым? Если эта возможность используется по умолчания, без согласия пользователя, из этого следует множество проблем. FTP-подключение в своей основе будет работать, но сразу после исчерпания тривиальных случаев использования передача будет разорвана, не оставляя особых средств диагностики проблемы.
· NAT-роутер слепо предполагает, что некоторые подключения принадлежат FTP основываясь на таких данных, как целевые порты или ответы сервера:
· Нет никакой гарантии относительно используемого протокола, несмотря на автоматическое определение (такие случаи называют ложной тревогой). Хоть это и маловероятно, вполне допустимо, что в будущих версиях протокола FTP синтаксис команды PORT может измениться. NAT-роутер, модифицируя команду PORT, изменяет без ведома пользователя параметры, которые он не поддерживает, из-за чего соединение будет разорвано.
· Определение протокола роутером может не распознать FTP. Предположим, что роутер следит только за целевым портом, а если этот порт 21-ый, он будет распознан как FTP. Подключения в активном режиме от неправильно настроенного клиента к серверу на 21-ом порту будут работать, но подключения к другим серверам на нестандартных портах - нет.
· Очевидно, что NAT-роутер не сможет модифицировать подключение, если FTP-сессия зашифрована, оставляя пользователя в недоумении, т.к. работать будут только незашифрованные подключения.
· Предположим, что клиент за NAT-роутером отсылает "PORT 10,0,0,1,12,34". Каким образом NAT-роутер осведомлен в том, что клиент настроен неправильно? Также возможен случай с правильно настроенным клиентом, который инициирует FXP (сервер-сервер) передачу между сервером, к которому он подключен и устройством, которое находится в локальной сети сервера.
Как мы видим, возможности специфические для протоколов, включенные на NAT-роутере по умолчанию могут вызвать множество проблем. Хороший NAT-роутер всегда и полностью работает с протоколом без информации о самом протоколе. Исключением может быть случай, когда пользователь явно применил эту возможность и осознает все возможные последствия.
В этом подразделе мы рассматривали сочетание NAT-роутера на стороне клиента в активном режиме, те же рассуждения применяются и в случае сервера за NAT и ответами на команду PASV.
PureFTPd.
Pure-FTPd — свободный FTP-сервер для операционных систем семейства UNIX, распространяется по лицензии BSD. Основное внимание уделяется безопасности и простоте настройки.
Функциональные возможности
· Простота установки и конфигурирования.
· Встроенная поддержка UTF-8.
· При подключении по медленным каналам и работе с несколькими серверами возможна работа по FXP протоколу.
· Может выполняться как отдельный демон (standalone mode), так и через супер-сервер inetd.
· Поставляется с программой мониторинга pure-ftpwho (с версии 0.97.7), которая в реальном времени показывает кто скачивает/загружает файлы и с какой скоростью. Возможен запуск pure-ftpwho как CGI приложения с возможностью генерации выходных данных в виде HTML или XML.
· Сообщения сервера на данный момент переведены на 21 язык (в том числе и на русский).
· Поддержка как базового, так и расширенного (например MLST) набора FTP команд[3].
· Возможность использования различных методов идентификации: unix (для пользователей перечисленных в /etc/passwd), PAM, LDAP (поддерживаются методы plaintext, Crypt, MD5, SMD5, SHA и SSHA), MySQL, PostgreSQL, PureDB (механизм самого Pure-FTPd), расширенный (возможность написать и подключить свой модуль идентификации). Допустимо использование нескольких методов одновременно. Имя пользователя и пароль будут проверяться каждым методом последовательно. Проверка завершается и оставшиеся методы использованы не будут если пользователь найден (вне зависимости от того, правильный пароль или нет).
· Возможен запуск рабочих процессов в chroot-е.
· Создание виртуальных пользователей.
· Задание индивидуальных квот, не связанных с системными, для пользователей (максимальное количество файлов, максимальный размер каталога, максимальная скорость скачивания/закачивания).
· После загрузки файла на сервер возможен автоматический запуск внешних скриптов или программ (например, для проверки на вирусы, расчет MD5 хэшей файлов, отправка уведомлений о загрузке).
· Возможность создания виртуальных FTP серверов (поскольку ftp протокол не поддерживает обращение к серверу по имени, то для каждого сервера необходим выделенный IP адрес).
· Можно запускать несколько копий сервера с различными конфигурационными опциями.
· Запрет доступа к dot-файлам (имя которых начинается с точки, например, .ssh directories, .bash_history files, .rhosts).
· Создание псевдонимов (алиасы) для директорий. Например, если создать алиас pictures для /home/user/pictures и выполнить команду cd находясь в /home, то сервер автоматически совершит редирект в /home/user/pictures (конечно при условии, что не существует директории /home/pictures). Может использоваться для быстрого перехода в определенные каталоги (т.е. работать как shortcuts).
· Операции загрузки файлов атомарны.
· Работа по IPv6, в том числе поддержка EPSV/EPRT команд.
· По заявлению авторов Pure-FTPd первый сервер поддерживающий ESTA и ESTP команды.
PURE-FTPD — файловый сервер для ОС семейства Linux. Для работы используется дистрибутив Linux Mandriva 2010.0.
Чтобы включить или отключить некоторые функции файлового сервера, необходимо отредактировать файл конфигурации сервера, а именно убрать «комментирование» строчки с описанием функции (стереть символ # вначале строки) и выставить текстовое или числовое значение, согласно функции. Если необходимо отключить некоторые функции, то не нужные строчки «комментируются», то есть в начале ставится знак #. Если в начале строки стоит знак #, то вся строка читаться сервером не будет, носит характер комментария. После чего необходимо перезагрузить файл конфигурации в сервер и перезапустить сервер.
Файл конфигурации сервера PURE-FTPd выглядит следующим образом:
/etc/pure-ftpd/pure-ftpd.conf
# Для запуска Pure-FTPd с этой конфигурацией вместо параметров
# командной строки, запустите такую команду:
# /usr/sbin/pure-config.pl /etc/pure-ftpd/pure-ftpd.conf
#
# Не забудьте изучить документацию на сайте, для получения
# полного списка команд - http://www.pureftpd.org/documentation.shtml
# Chroot`ить всех пользователей в их хомяках
ChrootEveryone yes
# Если в предыдущей опции было выбрано "no", то члены следующей
# группы не будут chroot`ится. Всё остальные - будутe. Если Вы не хотите
# chroot`ить всех, то просто раскоментируйте ChrootEveryone и TrustedGID.
# TrustedGID 100
# Включить "фичи" совместимости, для кривых клиентов
BrokenClientsCompatibility no
# Максимальное число одновременных юзеров
MaxClientsNumber 50
# Работать в фоне (демоном)
Daemonize yes
# Максимальное число одновременных соединений с одного IP
MaxClientsPerIP 8
# Если вы хотите логировать все команды клиентов, то в этом
# пункте должно быть "yes". Если необходимо логгировать также
# ответы сервера, то просто продублируйте этот пункт.
VerboseLog no
# Показывать или нет файлы, начинающиеся с точки, даже когда клиент
# явно не говорит, что это надо делать, опцией "-a".
DisplayDotFiles yes
# Не разрешать аутентифицированных юзеров - этот FTP
# только для анонимных клиентов.
AnonymousOnly no
# Запретить анонимоусов - FTP тока для регистрованных юзеров.
NoAnonymous no
# Средства syslog (auth, authpriv, daemon, ftp, security, user, local*)
# Дефолт - "ftp". "none" - отключает логирование.
SyslogFacility ftp
# Показывать какие-то куки? (Display fortune cookies)
# FortunesFile /usr/share/fortune/zippy
# Не резольвить имена хостов в логах. Логи становятся менее информативными,
# но и ресурсов требуется меньше. "yes" - имеет смысл ставить на очень
# загруженных серверах, или при неработающем DNS.
DontResolve yes
# Максимальное время простоя (по окончании рвётся коннект), в минутах
# (default = 15 minutes)
MaxIdleTime 15
# Файл конфигурации LDAP (смотрите README.LDAP)
# LDAPConfigFile /etc/pureftpd-ldap.conf
# Файл конфигурации MySQL (смотрите README.MySQL)
MySQLConfigFile /usr/local/etc/pureftpd-mysql.conf
# Файл конфигурации Postgres (смотрите README.PGSQL)
# PGSQLConfigFile /etc/pureftpd-pgsql.conf
# база данных юзеров PureDB (смотрите README.Virtual-Users)
# PureDB /etc/pureftpd.pdb
# путь к сокету pure-authd (смотрите README.Authentication-Modules)
# ExtAuth /var/run/ftpd.sock
# Если нужно подключить PAM аутентификацию раскомментируйте
# следующую линию
# PAMAuthentication yes
# Если нужна системная, Unix аутентификация (/etc/passwd),
# раскомментируйте следующую линию
# UnixAuthentication yes
# Пожалуйста, отметтьте, что LDAPConfigFile, MySQLConfigFile,
# PAMAuthentication и UnixAuthentication могут использоваться только
# один раз, но они могут использоваться вместе. Например, если вы
# используете MySQLConfigFile, затем UnixAuthentication, то идёт запрос
# к MySQL. Если в БД такой пользователь не найден, то пробуется
# системный пользователь в /etc/passwd и /etc/shadow. Если SQL
# аутентификация неудачна по причине неправильного пароля, то происходит
# остановка дальнейшего поиска пользователя. Методы аутентификации
# будут ипользоваться в порядке в которм они заданы
# Пределы рекурсии команды 'ls'. Первй аргумент - максимально число файлов,
# которое будет показано. Второе - максимальное число подкаталогов
# LimitRecursion 2000 8
# Имеют ли право анонимоусы создвать новые директории?
# AnonymousCanCreateDirs no
# Если система загружена более, чем указанное тут значение, то
# анонимоусы не могут что-либо скачивать
# MaxLoad 4
# Диапазон портов для пассивного соединения. Если у вас файрволл рубает
# стандартный диапазон
# PassivePortRange 30000 50000
# Принудительный IP адрес в PASV/EPSV/SPSV ответах. - для NAT.
# Символические имена хостов такде приняты для шлюзов с динамическим IP
# ForcePassiveIP 192.168.0.1
# Соотношение upload/download для анонимоусов.
# AnonymousRatio 1 10
# Соотношение upload/download для всех юзеров.
# Эта директива не перекрывает предыдущую.
# UserRatio 1 10
# Запретить скачку файлов владельцем которых является "ftp", т.е.
# файлы были загружены но не одобрены местным (локальным) админом.
# (Название пункта интересное :)))
# AntiWarez yes
# IP адрес/порт на которых слушаем (дефолт = все IP и порт 21).
#Bind 192.168.254.254,21
# Максимальная скорость для анонимоусов в KB/s
# AnonymousBandwidth 8
# Максимальная скорость для всех юзеров (включая анонимов) в KB/s
# Используйте AnonymousBandwidth или UserBandwidth, использовать оба,
# не имеет смысла.
# UserBandwidth 8
# Маска для создаваемых файлов. <umask для файлов>:<umask для директорий>.
# 177:077 - если вы параноик :)
# umask - это такое число, при вычитании которого из максимума (777) и
# получается нужная маска. т.е. для случая ниже маски будут, соответствено:
# 644 для файлов, и 755 для директорий
Umask 133:022
# Минимальный UID с которым юзер будет пущен.
# (В родном варианте тут было 100. Я поставил тыщщу)
MinUID 1000
# Разрешить передачу FXP для авторизованных юзеров.
# (Это передача файлов прям между серверами - т.е. если вам надо
# скопировать файл с одного сервака на другой, вы его вначале тащите
# к себе, затем кладёте куда надо. При включении этой опции сервера
# сами перекинут файл между собой. Но это палево - я серверов с
# включенной этой функцией ещё не видел :)))
AllowUserFXP no
# Разрешить передачу FXP для анонимоусов и не-анонимоусов
# (видимо, для всех вообще).
AllowAnonymousFXP no
# Пользователи не могут удалять и изменять файлы начинающиеся на точку('.')
# даже если они их владельцы. Если TrustedGID включена, эта группа имеет
# доступ к этим файлам.
ProhibitDotFilesWrite no
# Запретить чтение файлов начинающихся с точки (.history, .ssh...)
ProhibitDotFilesRead no
# Никогда не перезаписывать файлы. Когда имя, для закачиваемго файла уже
# существует, он будет автоматически переименован в file.1, file.2, file.3, ...
AutoRename no
# Запретить анонимным юзерам загружать новые файлы (no = аплоад разрешён)
AnonymousCantUpload no
# Только подключения к этому IP адресу могут быть не анонимными. Вы
# можете использовать эту директиву чтобы использовать несколько IP
# для анонимного FTP, и оставить приватный, зафаерволленый IP для
# удалённого администрирования. также вы можете разрешить нероутабельный
# локальный IP (типа 10.x.x.x) для аутентификации и оставить публичный
# (для анонимоусов) FTP-сервер на другом IP.
#TrustedIP 10.1.1.1
# Если вы хотите чтобы PID добавлялся в каждую линию лога,
# то раскомемнтируйте следующую линию.
#LogPID yes
# Создавать дополнительный лог-файл с логом в формате типа "apache":
# fw.c9x.org - jedi [13/Dec/1975:19:36:39] "GET /icap.tar.bz2" 200 21808
# Этот лог-файл может быть обработан программами для
# анализа логов апача.
# AltLog clf:/var/log/pureftpd.log
# Создавать дополнительный лог-файл в формате оптимизированном для
# статистических отчётов (х.з. как это. Надо будет посмотреть)
# AltLog stats:/var/log/pureftpd.log
# Создавать ещё один лог с переданными файлами в стандарте W3C
# (совместим с многими коммерческими анализаторами)
# AltLog w3c:/var/log/pureftpd.log
# Отключить команду CHMOD. Пользователи не смогут менять разрешения
# на файлы.
#NoChmod yes
# Позволить юзерам закачивать но не удалять файлы.
#KeepAllFiles yes
# Автоматически создавать домашнюю директорию пользователя,
# если она отсутствует
#CreateHomeDir yes
# Включить виртуальную квоту. Первое число - максимальное число файлов.
# Второе число - максимальный размер, в мегабайтах.
# Так 1000:10 ограничивает каждого пользователя 1000 файлов и 10-ю мегами.
#Quota 1000:10
# Если pure-ftpd скомпилен с поддержкой standalone режима, вы можете изменить
# местоположение pid-файла. Дефолтовое положение - /var/run/pure-ftpd.pid
#PIDFile /var/run/pure-ftpd.pid
# Если pure-ftpd скомпилен с поддержкой pure-uploadscript,
# то этот пункт позволяет писать информацию о новых загруженных
# файлах в /var/run/pure-ftpd.upload.pipe так что pure-uploadscript может
# прочесть их и обработать загруженный файл.
#CallUploadScript yes
# Эта опция полезна на серверах, гда позволен аплоад анонимоусам.
# Если /var/ftp находится в отдельном разделе /var, это позволяет
# сохранить свободное место и защитить файлы логов. Когда процент
# заполнения больше чем указанный тут, аплоад автоматом запрещается.
MaxDiskUsage 99
# Установите 'yes' в этой опции если хотите разрешить юзерам
# переименовывать файлы.
#NoRename yes
# Включить 'customer proof': какая-то ошибка, типа 'chmod 0 public_html',
# при совместной работе, чтоль... Короче это не баг а фича... :) И чтобы
# тупые клиенты не напрягали ваш саппорт надо поставить 'yes' в этом
# пункте. Если клиенты имеют немного знаний по Unix то эта фича
# бесполезна. Если у Вас хостинг - включите её.
# (перевод почти дословный - но про что речь я так и не понял...)
CustomerProof yes
# Число параллельных процессов. Работает тока если сервер был
# скомпилен с опцией '--with-peruserlimits' (тут чё-то про то, что
# в большинстве бинарных дистрибов так оно и есть).
# Формат:<максимум сессий на юзера>:<максимум сеансов анонимоусов>
# Например, 3:20 значит что аутентифичированный юзер может иметь три
# активных сеанса. А на всех анонимов - максимум 20 сеансов.
#PerUserLimits 3:20
# Когда загружен файл на сервер, и есть предыдущая версия (с тем же именем),
# то старый файл не будет ни удалён ни усечён. Загрузка будет произведена
# во временный файл и по окончании загрузки будет произведено атомарное
# переключение к новой версии файла. Например, при загрузке большого PHP
# сценария, апач будет работать со старой версией до полной загрузки
# и немедленно переключится на новый как тока он будет полностью передан
# Эта опция несовместима с виртуальными квотами.
#NoTruncate yes
# Эта опция может принимать три значения:
# 0 - отключить SSL/TLS шифрование (по-умолчанию).
# 1 - принимать и шифрованные и обычные подключения.
# 2 - отклонять подключения которые не используют SSL/TLS,
# включая анонимные соединения.
# Не раскомментируйте это вслепую. Проверьте, что:
# 1) Сервер скомпилен с поддержкой SSL/TLS (--with-tls),
# 2) Положен валидный сертификат,
# 3) Только совместимые клиенты залогинятся.
# TLS 1
# Слушается тока IPv4 адрес в режиме standalone (т.е. IPv6 отключен)
# По дефолту, IPv4 и IPv6 включены.
IPV4Only yes
# Слушается тока IPv6 адрес в режиме standalone (т.е. IPv4 отключен)
# По дефолту, IPv4 и IPv6 включены.
# IPV6Only yes
# Поддержка UTF-8 для имён файлов (RFC 2640)
# Определите кодировку для файловой системы сервера и, опционально,
# дефолтовую кодировку для клиентов, которые не юзают UTF-8.
# Работает тока если pure-ftpd скомпилен с '--with-rfc2640'
FileSystemCharset koi8-r
ClientCharset cp1251