Bog BOS: FTP серверы (wu-ftpd)

Washington University at Saint Louis FTP daemon for Unix (wu-ftpd и BeroFTPD)

Ссылки:

  • официальное место
  • источник (ftp.wu-ftpd.org/pub, ftp.wu-ftpd.org/pub/wu-ftpd, ftp.wu-ftpd.org/pub/BeroFTPD, ftp.wu-ftpd.org/pub/support)
  • ftp://ftp.academ.com/pub/wu-ftpd - полуофициальное место, где его берут (там еще есть закрытая директория, из которой можно извлечь beta-версию) - разработка здесь уже закрыта
  • faq для него
  • Resource Center
  • guestgroup howto
  • virtual ftp servers
  • архив maillist с поиском

Отличия 2.6.1 от 2.6.0

  • virtial passwd/shadow

Комплект поставки wu-ftpd для RedHat Linux 6.0 (wu-ftpd-2.5.0-5.6.0.rpm):

  • /etc
    • ftpaccess
    • ftpconversions
    • ftpgroups
    • ftphosts
    • ftpusers
  • /etc/logrotate.d/ftpd (перенумерация /var/log/xferlog без сжатия)
  • /etc/pam.d/ftp (не разбирался)
  • /usr/bin
    • ftpcount
    • ftpshut
    • ftpwho
  • /usr/doc/wu-ftpd-2.5.0
  • /usr/man
    • man1 (ftpwho.1, ftpcount.1)
    • man5 (ftpaccess.5, ftpconversions.5, ftphosts.5, xferlog.5)
    • man8 (ftpd.8, ftpshut.8)
  • /usr/sbin
    • in.ftpd (он же wu.ftpd и in.wuftpd)
    • xferstats

Параметры configure при установке (не все, а только полезные):

  • --with-etc-dir=PATH (по умолчанию - /etc, но лучше поставить /usr/local/etc/ftpd)
  • --disable-upload (не будет поддержки строки upload в ftpaccess)
  • --disable-overwrite (не будет поддержки строки overwrite в ftpaccess)
  • --disable-hostxs (не будет поддержки строк allow и deny в ftpaccess)
  • --disable-private (не будет поддержки site group/site gpass)
  • --enable-paranoid (отключить потенциально опасные функции: DELETE, SITE (umask, chmod, group, exec, newer), overwrite (put и rename), запрет доступа пользователям с неправильной домашней директорией)
  • --enable-quota (поддержка quota)--enable-quota
  • --enable-chmod (расширенная команда chmod: флаги t и x - надеюсь не понадобится)
  • --disable-rfc931 (обязательно отключить ident)
  • --disable-daemon (работать только через inetd)
  • --disable-throughput (не контролировать толщину потока)
  • --disable-count (не вести счетчики переданных байт и т.п.)
  • --enable-noop
  • --disable-log-rp (журнализовать относительные имена файлов, а не настоящие)
  • --disable-virtual
  • --disable-dns
  • --disable-port (запретить команду PORT)
  • --disable-pasv (запретить команду PASV)
  • --disable-plsm (не выдавать в журнал так достающие сообщения о lock sleep)
  • --disable-pasvip (не требовать совпадения управляющего соединения и соединения данных в режиме PASV; менее безопасно, но firewall будет счастливее)
  • --disable-anonymous
  • --enable-ls (внутренний ls, пока есть ошибки)
  • --disable-mail (отключить возможность посылки письма при загрузке файла)
  • --enable-badclients (обязательно, иначе половина клиентов не сможет работать; увы надо еще ручками добавлять define SUPPORT_BROKEN_CLIENTS в config.h после configure)

Процесс установки 2.6.0 для Solaris 2.5 и gcc 2.6.2

  • качаем архив и разтариваем его (создается директория wu-ftpd-2.6.0)
  • ./configure с соответствующими параметрами
    • сервер под себя, чтобы можно было забирать файлы с компьютера
      • --with-etc-dir=/usr/local/etc/ftpd
      • --disable-upload
      • --disable-private
      • --enable-paranoid
      • --disable-rfc931
      • --disable-daemon
      • --disable-throughput
      • --enable-noop
      • --disable-virtual
      • --disable-plsm
      • --disable-anonymous
      • --disable-mail
      • --enable-badclients
    • сервер для себя и администраторов, временно: закачки домашних страниц клиентами и владельцами хостируемых доменов с локальных линий, ящики для обмена файлами для клиентов с локальных линий (группы: webadmin, webusers; пользователи: я, администраторы (только ftp?), webadmin (только ftp)
      • --with-etc-dir=/usr/local/etc/ftpd
      • --disable-private
      • --enable-quota (не компилируется extension.c)
      • --disable-rfc931
      • --disable-daemon
      • --disable-throughput
      • --enable-noop
      • --disable-virtual
      • --disable-plsm
      • --disable-anonymous
      • --disable-mail
      • --enable-badclients

    который создает

    • Makefile (меняем /usr на /usr/local)
    • src/Makefile
    • support/Makefile (заменить gar на ar)
    • util/privatepw/Makefile (меняем /usr на /usr/local)
    • src/pathnames.h
    • config.h (define SUPPORT_BROKEN_CLIENTS)
    • src/config.h (define FACILITY LOG_LOCAL3, вместо DAEMON для перенаправления syslog)
  • добавляем /usr/ccs/bin в PATH и make
  • что-то сделать со старой версией (переименовать или удалить)
    • /usr/local/bin или sbin (ftpcount, ftpwho, ftpshut, ftprestart, in.ftpd/ftpd, ckconfig) - в разных версиях по-разному
    • директория с файлами конфигурации
  • возможно придется ручками создать директории (mkdir /usr/local/etc/ftpd)
  • make install (с правами root)
  • ftpusers
    • сервер под себя - все имена из passwd, кроме себя
    • сервер для себя и администраторов, временно: закачки домашних страниц - все имена из passwd, кроме себя, администраторов и клиентов с домашними страницами
  • ftphosts
    • сервер под себя - allow для себя с локальной сетки и диалапа
    • сервер для себя и администраторов, временно: закачки домашних страниц -прописать allow для каждого
  • ftpconversions - компрессия/декомпрессия, затаривание, затаривание с компрессией, выдача crc (заменить /bin на /usr/local/bin и убрать md5, которого в Solaris нет)
  • ftpgroups - должен отсутствовать
  • ftpaccess
    • сервер под себя
      • классы: LAN_real, dialup_real
      • предупреждение при входе, больше никаких сообщений
      • побольше журнализации (и на syslog)
      • deny-uid для всех и allow-uid только для себя (на всякий случай)
    • сервер для себя и администраторов, временно: закачки домашних страниц
      • классы: LAN_real, dialup_real, LAN_guest, dialup_guest, world_guest (при наличии неприкрытого squid-a, dialup ничем не отличается от LAN)
      • guestgroup все (все пользователи являются гостями; см. про гостевые группы)
      • realuser настоящие-пользователи (т.е. я и администраторы)
      • defumask 027
      • предупреждение при входе о назначении сервера (greeting и banner)
      • hostname, подходящий для самых частых посетителей
      • email ответственного за сервер
      • побольше журнализации (и на syslog). Сообщения о пересылках копировать на xferlog для локальной обработки.
      • разрешить tar и compress всем (на этом сервере нет больших архивов)
      • chmod/delete/overwrite/rename/umask - запретить для анонимных пользователей
      • chmod/umask - запретить для guest (пытаюсь навязать политику прав доступа)
      • ограничить номер порта, открываемого по команде PASV: passive ports 0.0.0.0/0 начало конец (интервал д.б. согласован с правилами firewall)
      • path-filter из примера для guest и anon (проверка имени файла на корректность)
      • запретить гостям запись кроме как в домашнюю директорию (для каждого отдельно)
      • deny-uid - запретить доступ всем, allow-uid - разрешить конкретным пользователям и группам
      • restricted-uid - запретить доступ всем (кроме себя и администраторов) вовне домашних директорий (глюк - не дает ничего делать в ПОДДИРЕКТОРИЯХ)
      • dns refuse_mismatch и dns refuse_no_reverse
  • если нужен анонимный доступ
  • гостевая группа (пользователи с реальными именами/паролями, но для которых производится chroot)
    • создать группу в /etc/group
    • создать пользователя (/etc/passwd и /etc/shadow)
      • в качестве shell указать /bin/true (внести его в /etc/shells)
      • имя домашней директории имеет вид:
        • путь для chroot
        • строка "/./"
        • домашняя поддиректория
    • директория, в которую делается chroot, должна
      • иметь права: "dr-xr-x--x"
      • принадлежать root:root
      • содержать (кроме домашних поддиректорий) тот же набор, что и для анонимного доступа (bin, dev, etc, usr)
        • bin (root:root:111)
          • ls (root:root:111)
        • dev (root:root:111)
          • tcp (root:sys:666) - char 11, 42
          • zero (root:sys:444) - char 13,12
        • etc (root:root:111)
          • passwd (root:root:444) - можно пустой
        • usr (root:root:111)
          • lib (root:root:111)
            • ld.so.1 (root:root:555)
            • libc.so.1
            • libdl.so.1
            • libintl.so.1
            • libw.so.1
          • local (root:root:111)
            • bin (root:root:111)
              • compress (root:root:111)
              • gzip (root:root:111)
              • tar (root:root:111)
          • share/lib/zoneinfo/Europe (root:root:111)
            • Moscow(root:root:444)
  • ftpservers - должен отсутствовать
  • проверяем конфигурацию /usr/local/sbin/ckconfig
  • в /etc/inetd.conf
    ftp stream tcp nowait root /usr/local/sbin/in.ftpd in.ftpd -a -l -I -W
  • послать сигнал HUP процессу inetd (с правами root), чтобы перечитал inetd.conf
  • почистить /etc/group, /etc/passwd

Процесс установки 2.6.0/2.6.1 для RedHat Linux 6.0/6.2/7.0

  1. качаем архив и разтариваем его (создается директория wu-ftpd-2.6.0)
  2. ./configure с соответствующими параметрами
    • полный доступ для себя, доступ к обихоженной части mirror для своих anonymous, upload в это место для mirror, ящик для входящих факсов (специальный пользователь fax, группа fax и имя хоста fax-holder); софт из нашей библиотеки для доступа к интернет /software/internet с возможностью изменений (специальный пользователь ftpadmin, группа ftpadmin)
      • --with-etc-dir=/usr/local/etc/ftpd
      • --disable-private
      • --disable-rfc931
      • --disable-daemon
      • --disable-throughput
      • --enable-noop
      • --disable-virtual
      • --disable-plsm
      • --enable-badclients
    • ftp/http сервер (специальный пользователь ftpadmin, группа ftpadmin; специальный пользователь webadmin, группа webadmin; владельцы сайтов, группа webusers)
      • --with-etc-dir=/usr/local/etc/ftpd
      • --disable-private
      • --disable-rfc931
      • --disable-daemon
      • --disable-throughput
      • --enable-noop
      • --disable-virtual
      • --disable-plsm
      • --enable-badclients
      • --enable-quota

    который создает

    • Makefile (меняем /usr на /usr/local)
    • src/Makefile
    • support/Makefile
    • util/privatepw/Makefile (меняем /usr на /usr/local)
    • src/pathnames.h
    • config.h (define SUPPORT_BROKEN_CLIENTS)
    • src/config.h (define FACILITY LOG_LOCAL3, вместо FTP для перенаправления syslog, я бы оставил FTP, но Solaris этого не понимает)
  3. make
  4. сохранить старую версию (вместе с RHL 6.0 поставляется 2.5.0)
    • качнуть wu-ftpd...rpm на этот компьютер (так, на всякий случай ;)
    • переименовать в .old
      • /etc: ftpaccess, ftpconversions, ftpgroups, ftphosts, ftpusers
      • /usr/bin: ftpcount, ftpshut, ftpwho
      • /usr/sbin: xferstat, in.ftpd (пусть wu.ftpd и in.wuftpd ссылаются в никуда)
      • /usr/man/man1: ftpwho.1, ftpcount.1
      • /usr/man/man5: ftpaccess.5, ftpconversions.5, ftphosts.5, xferlog.5
      • /usr/man/man8: ftpd.8, ftpshut.8
      • /etc/logrotate.d/ftpd оставить как есть
      • /usr/doc/wu-ftpd-2.5.0 оставить как есть
      • /etc/pam.d/ftp: заменить /etc/ftpusers на /usr/local/etc/ftpd/ftpusers
  5. mkdir /usr/local/etc/ftpd
  6. make install (с правами root)
    • /usr/local/sbin: in.ftpd, ftpshut, ftprestart, ckconfig, privatepw
    • /usr/local/bin: ftpcount, ftpwho
    • /usr/local/man/man8: ftpd.8, ftpshut.8, ftprestart.8, privatepw.8
    • /usr/local/man/man1: ftpcount.1, ftpwho.1
    • /usr/local/man/man5: ftphosts.5, ftpaccess.5, ftpconversions.5, xferlog.5
    • /usr/local/etc/ftpd: ftpaccess, ftpconversions
  7. ftpusers
    • полный доступ для себя, доступ к обихоженной части mirror для своих anonymous, upload в это место для mirror, ящик для входящих факсов
      все имена из /etc/passwd, кроме себя, fax, ftpadmin и ftp
    • ftp/http сервер
      все имена из /etc/passwd, кроме себя, webadmin, ftpadmin, держателей сайтов и ftp
  8. ftphosts
    • полный доступ для себя, доступ к обихоженной части mirror для своих anonymous, upload в это место для mirror, ящик для входящих факсов
      allow для себя, fax, ftpadmin и ftp с локальной сетки и диалапа
    • ftp/http сервер
      allow для себя, ftpadmin, webadmin и владельцев сайтов с локальной сетки и диалапа; ftp - отовсюду
  9. ftpconversions - компрессия/декомпрессия, затаривание, затаривание с компрессией, выдача crc, md5
  10. ftpgroups - должен отсутствовать
  11. ftpaccess
    • полный доступ для себя, доступ к обихоженной части mirror для своих anonymous, upload в это место для mirror, ящик для входящих факсов
      • классы: LAN_real, dialup_real, LAN_guest, dialup_guest, LAN_anon, dialup_anon (при наличии неприкрытого squid-a, dialup ничем не отличается от LAN)
      • guestgroup все-кроме-ftp (все пользователи - кроме анонимных - по умолчанию являются гостями; см. про гостевые группы)
      • realuser настоящие-пользователи (т.е. я)
      • defumask 027
      • предупреждение при входе о назначении сервера (greeting и banner)
      • hostname, подходящий для самых частых посетителей
      • email ответственного за сервер
      • отдельные message для отдельных классов пользователей с описанием что, где и как для выдачи при входе в систему и при переходах в некоторые директории (вместо стандартного .message выбрать какое-нибудь специфичное имя, чтобы не пересекаться с отмирроренными сайтами). readme в основном дублирует те же самые функции, но пусть пока будет.
      • побольше журнализации (и на syslog). Сообщения о пересылках копировать на xferlog для локальной обработки.
      • запретить tar и compress для анонимных пользователей (зрелище затаривания 2-гигабайтной директории неразумным клиентом меня раздражает)
      • chmod/delete/overwrite/rename/umask - запретить для анонимных пользователей
      • chmod/rename/umask - запретить для guest
      • ограничить номер порта, открываемого по команде PASV: passive ports 0.0.0.0/0 начало конец (интервал д.б. согласован с правилами firewall)
      • path-filter из примера для guest и anon (проверка имени файла на корректность)
      • запретить анонимным пользователям запись куда бы то ни было с помощью upload
      • запретить гостям запись кроме как в домашнюю директорию (для fax - без поддиректорий)
      • deny-uid - запретить доступ всем, allow-uid - разрешить конкретным пользователям (в т.ч. ftp)
      • restricted-uid - запретить доступ всем (кроме себя) вовне домашних директорий
      • dns refuse_mismatch и dns refuse_no_reverse
    • ftp/http сервер
      • классы: LAN_real, dialup_real, LAN_guest, dialup_guest, LAN_anon, dialup_anon, world_anon (при наличии неприкрытого squid-a, dialup ничем не отличается от LAN)
      • guestgroup все-кроме-ftp (все пользователи - кроме анонимных - по умолчанию являются гостями; см. про гостевые группы)
      • realuser настоящие-пользователи (т.е. я)
      • defumask 027
      • ограничить число внешних анонимных пользователей (не забыть файл с текстом сообщения)
      • предупреждение при входе о назначении сервера (greeting и banner)
      • hostname, подходящий для самых частых посетителей
      • email ответственного за сервер
      • отдельные message для отдельных классов пользователей с описанием что, где и как для выдачи при входе в систему
      • побольше журнализации (и на syslog). Сообщения о пересылках копировать на xferlog для локальной обработки.
      • разрешить tar и compress всем (на этом сервере нет больших архивов)
      • chmod/delete/overwrite/rename/umask - запретить для анонимных пользователей
      • chmod/umask - запретить для guest (пытаюсь навязать политику прав доступа)
      • ограничить номер порта, открываемого по команде PASV: passive ports 0.0.0.0/0 начало конец (интервал д.б. согласован с правилами firewall)
      • path-filter из примера для guest и anon (проверка имени файла на корректность)
      • запретить анонимным пользователям запись куда бы то ни было с помощью upload
      • запретить гостям запись кроме как в домашнюю директорию (для каждого отдельно)
      • deny-uid - запретить доступ всем, allow-uid - разрешить конкретным пользователям (в т.ч. ftp)
      • restricted-uid - запретить доступ всем (кроме себя) вовне домашних директорий
      • dns refuse_mismatch и dns refuse_no_reverse
  12. если нужен анонимный доступ
    • заводится группа ftp (/etc/group)
    • заводится пользователь ftp (/etc/passwd). В качестве домашней директории указывается место, где будут лежать файлы, доступные анонимным пользователям. В это место будет делаться chroot, так что если предполагается делать линки, то это надо иметь в виду. Можно добавить в конец "/./pub", чтобы пользователь сразу попадал туда (некоторые клиенты этого не любят - MS IE). Поле пароля в /etc/shadow - забить.
    • Создать саму домашнюю директорию (root:root 551). MS IE ("мать, мать, мать" - привычно откликнулось эхо) пытается посмотреть листинг корневой директории и выдает пользователю пустой список файлов. Пришлось поменять права на 555, что слегка уменьшает безопасность, но делает любителей мелкомягких счастливее.
    • внутри нее
      • директория bin (и директория и файлы внутри с правами root:root 111): compress, cpio, gzip, ls, sh, tar, zcat (зачем нужны sh и cpio?)
      • директория etc (директория с правами root:root 111, файлы внутри root:root 444)
        • passwd, group - можно пустые
        • welcome*, banner*
        • ld.so.cache (root:root 644)
      • директория lib (root:root 111), для RH 6.2 - 2.1.3, для RH 7.0 - 2.2 вместо 2.1.1
        • ld-2.1.1.so, libc-2.1.1.so, libnsl-2.1.1.so, libnss_files-2.1.1.so (root:root, 555)
        • для RH 6.2 дополнительно libtermcap.so.2.0.8
        • ld-linux.so.2 -> ld-2.1.1.so
        • libc.so.6 -> libc-2.1.1.so
        • libnsl.so.1 -> libnsl-2.1.1.so
        • libnss_files.so.2 -> libnss_files-2.1.1.so
        • для RH 6.2: libtermcap.so.2 -> libtermcap.so.2.0.8
      • директория pub (root:ftp dr-xr-sr-x)
        • внутренние поддиректории, заполняемые вручную, должны иметь те же права, что и pub
        • для каждого наполняющего автомата завести свою поддиректорию с необходимыми правами (hardlink на директории в ext2fs не работает). В любом случае директории должны иметь права на чтение и исполнение для пользователя ftp, файлы - только на чтение.
  13. гостевая группа (пользователи с реальными именами/паролями, но для которых производится chroot)
    • создать группу в /etc/group
    • создать пользователя (/etc/passwd и /etc/shadow)
      • в качестве shell указать /bin/true (внести его в /etc/shells)
      • имя домашней директории имеет вид:
        • путь для chroot
        • строка "/./"
        • домашняя поддиректория
    • директория, в которую делается chroot, должна
      • иметь права: "dr-xr-x--x"
      • принадлежать root:root
      • содержать (кроме домашних поддиректорий) тот же набор, что и для анонимного доступа (bin, etc, lib)
  14. ftpservers - должен отсутствовать
  15. проверяем конфигурацию /usr/local/sbin/ckconfig
  16. в /etc/inetd.conf (нужен ли tcpd на самом деле?)
    ftp stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/in.ftpd -a -l -I -W (для RH 7.0: /etc/xinetd.d/wu-ftpd: stream,nowait,root,/usr/local/sbin/in.ftpd,-l -a -I -W)
  17. /etc/pam.d/ftp (?)
  18. послать сигнал HUP процессу inetd/xinetd (с правами root), чтобы перечитал inetd.conf/xinetd.conf
  19. проделать дырки в защите для доступа с LAN, dialup и снаружи

Процесс установки wu-ftpd-2.4.2 для Solaris 2.5 и gcc 2.6.2

  1. качаем архив (я извлек версию 2.4.2-beta-11)
  2. разтариваем его (создается директория wu-ftpd-2.4.2-beta-11)
  3. заходим в нее
  4. сильно меняем src/pathnames.h (отключая условную компиляцию)
    • #define _PATH_EXECPATH "/usr/local/wu-ftpd/ftp-exec"
    • #define _PATH_FTPUSERS "/usr/local/wu-ftpd/etc/ftpusers"
    • #define _PATH_FTPACCESS "/usr/local/wu-ftpd/etc/ftpaccess"
    • #define _PATH_CVT "/usr/local/wu-ftpd/etc/ftpconversions"
    • #define _PATH_PRIVATE "/usr/local/wu-ftpd/etc/ftpgroups"
    • #define _PATH_PIDNAMES "/var/tmp/ftp.pids-%s"
    • #define _PATH_XFERLOG "/usr/local/wu-ftpd/xferlog"
    • #define _PATH_FTPHOSTS "/usr/local/wu-ftpd/etc/ftphosts"
  5. говорим (не забудь /usr/ccs/bin в список поиска) ./build sol
  6. меняем в Makefile /usr/sbin на /usr/local/sbin, а /usr/share/man на /usr/local/man, а то уж очень неприлично получается (/usr/local/man/man1m должен существовать!).
  7. под суперпользователем говорим ./build install
  8. меняем /etc/inetd.conf, чтобы вызывался новый ftpd
    ftp stream tcp nowait root /usr/local/sbin/in.ftpd in.ftpd -a
  9. посылаем сигнал HUP процессу inetd (под суперпользователем), чтобы заново зачитал inetd.conf
  10. копируем doc/ftpaccess в /usr/local/wu-ftpd/etc/ftpaccess и правим:
    • class localreal real *.deol.ru 194.84.39.*
      класс честных людей
    • class localanon anonymous *.deol.ru 194.84.39.*
      местные конспираторы (в том числе и через PPP)
    • class remoteanon anonymous *
      удаленные конспираторы
    • class allguest guest *
      для наших дилеров псевдопользователь
    • guestgroup guest
      где guest - это имя группы из /etc/group
      в /etc/passwd заводим пользователя
      dealer:x:401:600:ftp for dealer:/usr/local/wu-ftpd/home/./4dealers:/bin/true
      заметьте выражение /./ - это необходимо: wu-ftpd делает какие-то заключения из этого
      /bin/true вместо командного интерпретатора необходимо сами понимаете (не забудь добавить в /etc/shells)
      директория 4dealers должна быть с правами:
         dr-xrwx--- 2 dealer <имя группы администраторов>
      внутри директорию upload с правами
         drwxrwx--- dealesr <имя группы администраторов>
    • limit localreal -1 Any
      себя не ограничиваем ни в чем
    • limit localanon 40 Any /usr/local/wu-ftpd/msgs/msg.local.dead
      местных конспираторов не более 40 (не забудь создать файл сообщений)
    • limit remoteanon 10 Any /usr/local/wu-ftpd/msgs/msg.remote.dead
      удаленных конспираторов не более 10 (не забудь создать файл сообщений)
    • limit allguest 10 Any /usr/local/wu-ftpd/msgs/msg.remote.dead
      псевдопользователей (дилеров) не более 10
    • noretrieve core
      не разрешать извлекать файлы с именем core
    • private no
      я не понял зачем это надо, но на всякий случай выключил
    • banner /usr/local/wu-ftpd/msgs/banner
      приветствие, выдаваемое перед вводом имени пользователя (можно разнести по виртуальным хостам)
    • readme README login
      readme README cwd=*
      информация о файле README (когда был создан и когда последний раз изменен) будет выдаваться при входе на сервер и при переходе в директорию
    • message /etc/welcome.msg login localanon remoteanon
      при входе конспираторов им выдается сообщение (реальное имя файла /usr/local/wu-ftpd/home/etc/welcome.msg)
    • message /usr/local/wu-ftpd/home/etc/welcome.msg login localreal
      тоже самое сообщение для честных людей
    • message .message cwd=*
      при входе в директорию будет выдаваться файл .message
    • compress yes *
      tar yes *
      разрешать сжатие и затаривание всем (реальное описание процессов в файле /usr/local/wu-ftpd/etc/ftpconversions
    • log commands real,anonymous
      все команды должны попадать в журнал, но я что-то не заметил их там
    • log transfers anonymous,real inbound,outbound
      весь трафик должен попадать в журнал: /usr/local/wu-ftpd/xferlog, формат xferlog.5
    • сообщение по окончанию сеанса я отключил (где оно должно лежать?)
    • chmod no guest,anonymous
      delete no guest,anonymous
      overwrite no guest,anonymous
      rename no guest,anonymous
      umask no guest,anonymous
      разрешать конспираторам подобные вещи - самоубийство
    • passwd-check rfc822 warn
      делаем полную проверку формата адреса e-mail для конспираторов и ругаемся если что не так (запрещать вход нельзя, т.к. Netscape генерит адрес Mozilla@)
    • email [email protected]
      почтовый адрес администратора: выдается в сообщения вместо %E (%T - локальное время, %F - свободное место в килобайтах, %C - текущая директория, %R - имя удаленного хоста, %L - имя локального хоста, %U - как себя назвал пользователь, %u - как показала перепроверка, %N - текущее число пользователь в данном классе, %M - макс. число пользователей в данном классе.
    • разобраться с path-filtr и upload

  11. создаем файл /usr/local/wu-ftpd/etc/ftpusers и заносим в него все имена пользователей, которые есть в /etc/passwd, но которых мы не хотим видеть через ftp (root, uucp и др.)
  12. создаем файл /usr/local/wu-ftpd/etc/ftphosts, в который можно занести для каждого пользователяадреса откуда ему можно заходить и откуда нет (сейчас пустой)
  13. создаем файл /usr/local/wu-ftpd/etc/ftpconversions, который описывает преобразования, который ftp-сервер делает "на лету" (сжатие, затаривание)
  14. файл /usr/local/wu-ftpd/etc/ftpgroups не создаю, т.к. не понимаю для чего эти группы нам нужны.
  15. выполняем bin/ckconfig, чтобы проверить правильность конфигурирования (ух ты сколько сообщений...)
  16. создаем группу ftp с помощью admintool (например, 400) и добавляем в нее члена ftp
  17. создаем пользователя ftp с идентификатор (например, 400) из группы 400(ftp), комментарий: "Anonymous FTP", shell: /bin/true, password: account is locked, создать домашнюю директорию: /usr/local/wu-ftpd/home
  18. директория /usr/local/wu-ftpd/home должна принадлежать суперпользователю и группе ftp, иметь права доступе 555
  19. теперь создаем в ней вспомогательные файлы (все директории с правами 111, исполняемые файлы 111, тексты 444, кроме явно именованных):
    bin/ls
    dev/tcp - права 666 (mknod dev/tcp c 11 42 для Solaris)
    dev/zero - права 444 (mknod dev/zero c 13 12 для Solaris)
    etc/passwd - можно пустой
    etc/group - можно пустой
    etc/welcome.msg
    usr/lib/ld.so.1 - права 555
    usr/lib/libc.so.1 - права 555
    usr/lib/libdl.so.1 - права 555
    usr/lib/libintl.so.1 - права 555
    usr/lib/libw.so.1 - права 555
    usr/local/bin/compress
    usr/local/bin/gzip
    usr/local/bin/tar
    usr/share/lib/zoneinfo/Europe/Moscow
  20. не забудь про /etc/shells
  21. теперь разберемся с pub (root ftp 2555), внутренние директории должны иметь те же права
  22. создаем внутреннюю директорию pub/incoming (root ftp 733+t) - если надо - перед этим надо разобраться с директивами upload, path-filtr и научиться ограничивать размер
  23. под суперпользователем
    cd /usr/local/wu-ftpd/home
    touch .forward;chmod 400 .forward
    touch .rhosts;chmod 400 .rhosts
    touch /usr/spool/mail/ftp; chmod 400 /usr/spool/mail/ftp (?)
  24. монтировать NFS внутрь ~ftp только так:
    other:/u1/linux /home/ftp/pub/linux nfs ro,noquota,nosuid,intr,bg 1 0
  25. ну и самое интересное: заполнение pub

Еще раз к вопросу о пассивном ftp : измени права к файлу ~ftp/dev/tcp с crw-rw-rw- на crw-rw-r-- и права на пассивный ftp (команда PASV - например, Microsoft Internet Explorer без нее не живет) будут иметь только пользователи из группы sys (а анонимные пользователи нет).

Программы, входящие в комплект

  • ftpd - собственно сервер (нужны -a -l -I -X -W)
    • -d или -v (записывать отладочную информацию на syslog)
    • -l (каждую сессию - кто и откуда зашел к нам - записывать на syslog, уровень info)
    • -t  секунд (inactive timeout, по умолчанию - 900, может быть изменен клиентом)
    • -T секунд (максимальный inactive timeout)
    • -a (использовать ftpaccess)
    • -A (не использовать ftpaccess - по умолчанию)
    • -L (записывать все команды клиента на syslog, можно поменять в ftpaccess, уровень info)
    • -i (делать запись о полученных файлах в xferlog, можно поменять в ftpaccess)
    • -I (запрещает использовать протокол ident)
    • -o (делать запись о переданных файлах в xferlog, можно поменять в ftpaccess)
    • -X (делать записи о полученных и переданных файлах в syslog, а не xferlog; можно поменять в ftpaccess, уровень info)
    • -u umask (маска по умолчанию)
    • -w (записывать заходы в wtmp, по умолчанию)
    • -W (не записывать заходы в wtmp)
    • -s (запуск в самостоятельный полет, а не через inetd)
    • -S (запуск в самостоятельный полет, а не через inetd, отсоединиться от терминала)
    • -p порт (управляющий порт, по умолчанию ftp из /etc/services; при работе через inetd не используется)
    • -P порт (порт данных, по умолчанию ftp-data из /etc/services или на единицу меньше управляющего)
    • -q (по умолчанию, использовать файлы для хранения номеров процессов)
    • -Q (не использовать эти файлы; не будет работать ограничение на количество пользователей в классе)
    • -r rootdir (сделать chroot немедленно после запуска, не дожидаясь ввода имени пользователя; для параноиков)
  • ftpwho - показывает информацию о каждом клиенте (в Solaris 2.5 вызывает ps с неправильными параметрами)
  • ftpcount - показывает текущее и максимальное количество пользователей для каждого класса
  • ftpshut - аккуратное завершение работы ftp-серверов
    -l за-сколько-минут-запрещать-дальнейшие-соединения -d за-сколько-минут-разрывать-текущие-соединения время-завершения [ форматированное-сообщение ]
    где время-завершения:
    • now
    • +минут - через сколько минут
    • HHMM - абсолютное время
  • ftprestart - разрешить запуск ftp-сервера, если он был завершен по ftpshut (удаляет записанные им сообщения о завершении работы)
  • ckconfig - проверить конфигурацию (очень слабая проверка)
  • privatepw

Аутентификация пользователя:

  1. имя пользователя д.б. в /etc/passwd (или как его там) и иметь непустой пароль и иметь стандартный shell, возвращаемый getusershell (/etc/shells)
  2. это имя не д.б. указано в ftpusers
  3. если клиент предъявляет имя anonymous или ftp, то д.б. пользователь ftp в /etc/passwd. Пароль в этом случае не проверяется. Сервер делает chroot в домашнюю директорию пользователя ftp.

Конфигурационные файлы (root:sys:600):

  • ftpservers - определяет набор файлов конфигурации для каждого виртуального сервера. Каждая строка описывает виртуальный сервер и содержит два поля:
    • имя/IP-адрес хоста
    • имя директории, содержащей файлы конфигурации. Имена файлов фиксированны: ftpaccess, ftpusers, ftpgroups, ftphosts, ftpconversions. Если определенный файл отсутствует, то используется соответствующий файл из конфигурации основного сервера (из той же директории, в которой лежит сам файл ftpservers).
  • ftpaccess
    • управление правами доступа
      • autogroup имя-группы класс ...
        если анонимный пользователь является членом одного из указанных классов, то сервер переходит в группу (из /etc/group) с указанным именем, что позволяет дать анонимным пользователям из разных классов доступ к различным директориям
      • class класс typelist шаблон-адресов ...
        позволяет отнести клиента в указанный класс исходя из IP-адреса и типа клиента, где:
        typelist - список из ключевых слов anonymous (клиенты, зашедшие под именами ftp или anonymous), guest (гостевая группа) и real (зарегистрированные на локальном хосте - /etc/passwd) через запятую;
        шаблон-адресов - шаблон имени или адреса хоста клиента или адрес:маска или адрес/cidr или имя файла (должно начинаться со слеша и содержать шаблоны адресов); восклицательный знак перед шаблоном отрицает действие шаблона; несколько шаблонов в строке образует логическое ИЛИ.
        Если клиент м.б. отнесен к нескольким классам, то используется первая строка class. Если клиента нельзя отнести ни к одному классу, то доступ запрещается.
      • deny шаблон-адресов файл-с-текстом-сообщения
        запретить доступ клиентов с указанного адреса с выдачей текста сообщения. В качестве шаблона м.б. указана строка !nameserved, что запрещает доступ с хостов, имя которых не определяется по адресу. Можно также указывать имя файла, начинающееся со слеша.
      • guestgroup имя-группы ...
        если РЕАЛЬНЫЙ пользователь является членом указанной группы (из /etc/group), то с ним поступают так же как с анонимным (chroot, запрет на команды USER и PASS). Домашняя директория такого пользователя д.б. оформлена также как для анонимного доступа (строка делится на две части, разделяемые "/./", первая часть используется для chroot, вторая является его собственной директорией относительно нового корня). Вместо имени группы можно использовать номер, перед которым надо поставить процент, или интервал номеров или звездочку для всех групп.
      • guestuser имя-пользователя ...
        аналогично guestgroup, но используется имя РЕАЛЬНОГО пользователя
      • realgroup имя-группы ...
        ревертирует действие guestgroup и guestuser
      • realuser имя-пользователя ...
        ревертирует действие guestgroup и guestuser
      • nice дельта [ класс ] - изменение приоритета процесса
      • defumask umask [ класс ] - задание umask, применяемой при создании демоном файлов
      • tcpwindow байт [ класс ] - для диалапных пользователей надо поменьше
      • keepalive { yes |  no } - установить TCP SO_KEEPALIVE (и какой будет эффект?)
      • timeout accept секунд - сколько ждать входного соединения для передачи данных (PASV) (120)
      • timeout connect секунд - сколько ждать установления выходного соединения для передачи данных (PORT) (120)
      • timeout data секунд - максимальный период неактивности на соединении для передачи данных (1200)
      • timeout idle секунд - сколько ждать следующей команды (900)
      • timeout maxidle секунд - клиент имеет возможность установить idle самостоятельно. Maxidle устанавливает верхний предел для клиента (1200)
      • timeout RFC931 секунд - максимальное время ожидания ответа для протокола ident. Если 0, то не использовать ident вовсе (10).
      • file-limit [ raw ] { in | out | total } число [ класс ]
        ограничить число передаваемых файлов. raw ограничивает число любых передач, а не только файлов данных (а какие еще бывают? оглавления?)
      • byte-limit [ raw ] { in | out | total } число [ класс ]
        ограничить число передаваемых байт. raw ограничивает любые передачи, а не только файлов данных. Текущая операция не прерывается.
      • limit-time { * | anonymous | guest } минут
        ограничение времени сессии. Реальные пользователи не ограничиваются никогда.
      • guestserver [ имя-серверного-хоста ]
        гостевой и анонимный доступ предоставляется только к указанному хосту (хостам). Клиенту при неудачном доступе сообщается имя первого хоста, куда он может обратиться. Имеет смысл, если сервер обслуживает несколько виртуальных доменов.
      • limit класс число временной-интервал имя-файла-с-сообщением
        ограничение на число одновременно работающих клиентов из данного класса. Временной-интервал определяется как в UUCP (например Any или Mo 0900-1800). Проверка производится только в момент входа. Если к сеансу применимо несколько команд limit, то используется первая.
      • noretrieve [ absolute | relative ] { class=класс } имя-файла ...
        запретить клиенту читать указанные файлы. Если имя начинается со слеша, то только этот файл, иначе любой файл с соответствующим именем. Если указана директория, то любой файл из этой директории или любой ее поддиректории. Можно также указывать шаблоны в стиле shell. По умолчанию имена воспринимаются как абсолютные (relative - относительно chroot).
      • allowretrieve [ absolute | relative ] { class=класс } имя-файла ...
        отменить действие директивы noretrieve
      • loginfails число
        после указанного числа неудачных попыток зайти на сервер делать запись в журнале и разрывать соединение (5)
      • private { yes | no }
        Нестандартные команды SITE GROUP и SITE GPASS позволяют пользователю поменять текущую группу (д.б. перечислены в ftpgroups). Не понял: private - это разрешить менять группу или запретить?
    • выдача сообщений клиенту
      • greeting { full | brief | terse | text строка }
        какой текст будет выдаваться в строке приветствия:
        • full - имя хоста и версия сервера
        • brief - имя хоста
        • terse - ничего, кроме факта готовности к обслуживанию
        • text - произвольная строка текста
      • banner имя-файла
        определяет текст сообщения, выдаваемого клиенту до ввода имени/пароля. Не совместим с клиентами, не умеющими обрабатывать многострочные сообщения. Имя файла - абсолютное.
      • hostname имя-хоста
        определяет имя хоста по умолчанию (если не используется механизм виртуальных серверов), которое подставляется в приветствие и в строки вместо %L. По умолчанию - имя локального хоста.
      • email адрес
        адрес администратора. Подставляется в строки вместо %E.
      • message имя-файла { LOGIN | CWD=имя-директории { класс } }
        содержимое файла выдается клиенту (однократно) при входе или смене директории. Имя файла - относительно chroot. Макроподстановки:
        • %T - местное время (Thu Nov 15 17:12:42 1990), без названия зоны. В 2.5.0/2.6.0 (RH Linux 6.0) иногда выдается GMT.
        • %F - свободное место в разделе (КБ). В 2.5.0/2.6.0 (RH Linux 6.0) не работает.
        • %C - текущая директория
        • %E - email адрес администратора
        • %R - имя удаленного хоста
        • %L - имя данного хоста
        • %u - имя пользователя, полученное от ident
        • %U - имя, указанное клиентом при регистрации
        • %M - максимальное число пользователей в данном классе
        • %N - текущее число пользователей в данном классе
        • %B - дисковых блоков. В 2.5.0/2.6.0 (RH Linux 6.0) не работает.
        • %b - предпочтительный предел числа дисковых блоков. В 2.5.0/2.6.0 (RH Linux 6.0) не работает.
        • %Q - текущее число блоков. В 2.5.0/2.6.0 (RH Linux 6.0) не работает.
        • %I - максимальное число inode-ов
        • %i -  предпочтительный предел числа inode-ов
        • %q - текущее число inode-ов
        • %H - лимит времени на использование чрезмерного дискового пространства
        • %h - лимит времени на использование чрезмерного числа файлов
      • readme имя-файла { LOGIN | CWD=имя-директории { класс } }
        в соответствующий момент (при входе или смене директории) сервер информирует клиента (однократно) о наличии этого файла и когда он был создан/изменен. Имя файла - относительно chroot. Макроподстановки аналогично директиве message.
    • Журнализация
      • log commands список-типов
        выводить в журнал все команды клиента, где список-типов - список через запятую слов real, guest и anonymous.
      • log transfers список-типов список-направлений
        выводить в журнал пересылки файлов, где список-типов - список через запятую слов real, guest и anonymous; список-направлений - список через запятую слов incoming и outbound.
      • log security список-типов
        выводить в журнал нарушения правил безопасности, где список-типов - список через запятую слов real, guest и anonymous.
      • log syslog - перенаправлять сообщения о пересылках в syslog (уровень info) вместо файла xferlog.
      • log syslog+xferlog - направлять сообщения о пересылках в syslog и файл xferlog.
    • разное
      • alias строка имя-директории
        позволяет переходить в данную директорию по команде "cd алиас" из любой директории. Имя относительное или абсолютное? Показывается ли оно в листинге?
      • cdpath имя-директории
        добавляет директорию к cdpath, которая используется в качестве списка поиска для команды cd
      • compress { yes | no } шаблон-классов ...
        разрешить/запретить компрессию/декомпрессию для классов, подпадающих под шаблон(ы) или слово all.
      • tar { yes | no } шаблон-классов ...
        разрешить/запретить использование tar для классов, подпадающих под шаблон(ы) или слово all.
      • shutdown имя-управляющего-файла
        файл содержит описание грядущей остановки сервера. Текущие пользователи извещаются, новые не принимаются и т.д. Можно использовать ftpshut для генерации этого файла.
      • passive address возвращаемый-ip-адрес cidr-шаблон
        если клиент выдает команду PASS, то сервер определяет вовращаемый адрес исходя из соответствия ip-адреса клиента cidr-шаблону. Прислушивается он к своему обычному адресу. Используется, если сервер находится позади firewall с NAT. firewall должен пропускать SYN-пакеты на указанные порты.
      • pasive ports cidr-шаблон min max
        определяется интервал портов, из которых сервер выбирает порт для прослушивания случайным образом и передает его номер клиенту
      • pasv-allow класс шаблон-адресов
        Обычно сервер после получения команды PASV разрешает соединяться только с того же адреса, что и управляющее соединение. Данная директива позволяет пользователям указанного класса соединяться не только с исходного адеса, но и с этих адресов.
      • port-allow класс шаблон-адресов
        Обычно сервер не позволяет указывать в команде PORT адреса, отличные от адреса управляющего соединения. Данная директива позволяет пользователям данного класса указывать в команде порт адрес, подходящий под шаблон.
      • lslong команда [ параметры ] - какую команду и параметры использовать для генерации листинга директории (пробелы в параметрах недопустимы).
      • lsshort команда [ параметры ] - какую команду и параметры использовать для генерации листинга директории (пробелы в параметрах недопустимы).
      • lsplain команда [ параметры ] - какую команду и параметры использовать для генерации листинга директории (пробелы в параметрах недопустимы).
      • incmail email-адрес
        кого извещать в случае анонимного upload. Если указано несколько адресов, то каждый получит извещение.
      • mailserver имя-хоста
        какой почтовый сервер использовать для рассылки сообщений об анонимном upload. Если указано несколько, то пробовать по очереди. По умолчанию - localhost.
      • mailfrom email-адрес
        какой обратный адрес подставлять при рассылке сообщений об анонимном upload. По умолчанию - wu-ftpd.
    • виртуальные сервера (лучше использовать ftpservers)
      • daemonaddress ip-адрес - прислушиваться к соединениям только на этот адрес
      • virtual ip-адрес { root | banner | logfile } имя-файла
        определить соответственно: корень файловой системы, банерный файл и журнал для указанного виртуального сервера
      • virtual ip-адрес { hostname | email } строка
        определить имя хоста (показываемое в приветствии) и адрес администратора для указанного виртуального сервера
      • virtual ip-адрес { allow | deny } имя-пользователя ...
      • virtual ip-адрес private - закрыть анонимный доступ
      • virtual ip-адрес incmail email-адрес
        кого извещать в случае анонимного upload. Если указано несколько адресов, то каждый получит извещение.
      • virtual ip-адрес mailfrom email-адрес
        какой обратный адрес подставлять при рассылке сообщений об анонимном upload. По умолчанию - wu-ftpd.
      • defaultserver { deny | allow }  имя-пользователя ...
        по умолчанию доступ разрешен всем. Вместо имени пользоваттеля можно указывать звездочку (т.е. для всех0
      • defaultserver private - закрыть анонимный доступ
      • defaultserver incmail email-адрес
        кого извещать в случае анонимного upload. Если указано несколько адресов, то каждый получит извещение.
      • defaultserver mailfrom email-адрес
        какой обратный адрес подставлять при рассылке сообщений об анонимном upload. По умолчанию - wu-ftpd.
    • права доступа
      • { chmod | delete | overwrite | rename | umask } { yes | no } список-типов
        разрешить/запретить пользователям выполнять соответствующее действие. По умолчанию - все разрешено. Список-типов - список через запятую слов anonymous, guest, real или class=имя-класса.
      • passwd-check { none | trivial | rfc822 } ( { enforce | warn } )
        уровень проверки правильности вводимых анонимными пользователями в качестве пароля email-адресов и реакция сервера в случае ошибки:
        • none - никакой проверки
        • trivial - строка д. содержать @
        • rfc822 - полная проверка
        • warn - если обнаружена ошибка, то выдавать предупреждение
        • enforce - если обнаружена ошибка, то не впускать
      • deny-email email-адрес
        считать данный email-адрес неправильным
      • path-filter список-типов имя-файла-сообщения шаблон-допустимых-имен шаблон-недопустимых ...
        когда пользователь типа из списка типов (слова real, guest и anonymous через запятую) пытается загрузить файл на сервер, то сервер проверяет что имя файла соответствует регулярному выражению, указанному в шаблоне-допустимых и не соответствует ни одному из регулярных выражений в шаблонах недопустимых. В противном случае выдается сообщение из файла.
      • upload [ absolute | relative ] [ class=имя-класса ]... [ - ] корень шаблон-директории { yes | no } owner group mode [ dirs |  nodirs ] [ dir_mode ]
        определяет директории, в которые разрешено/запрещено записывать файлы пользователям из указанного класса. Все вновь создаваемые файлы будут иметь соответствующие права доступа и принадлежность. Выбирается самый длинный подходящий шаблон. dirs/nodirs разрешает/запрещает создание поддиректорий (по умолчанию - разрешено). Применяется только к пользователям, домашняя директория которых (chroot-ed) совпадает с корень (можно указывать звездочку). В качестве owner и/или group можно указывать звездочку. В этом случае владелец/группа вновь создаваемого файла наследуются от директории, в которой он создается. См. upload.configuration.HOWTO
      • throughput - позволяет задать скорость передачи определенных файлов (директорий) на определенные хосты (в т.ч. экспоненциальное уменьшение скорости для "навязчивых").
      • anonymous-root корень [ класс ] ...
        Определяет корневую директорию (chroot) для анонимных пользователяй указанного класса и их домашнюю директорию (используется домашняя директория пользователя ftp  в корень/etc/passwd) . Если класс не указан, то определяет корневую директорию для анонимных пользователей из всех прочих классов. Если и этого нет, то используется старый механизм (специальная форма записи домашней директории пользователя ftp в настоящем /etc/passwd).
      • guest-root корень [ интервал-uid ] ...
        корень определяет аргумент chroot для гостевых пользователей и их домашнюю директорию (используется домашняя директория пользователя  в корень/etc/passwd) . Можно задавать отдельные uid (имена или номера со знаком процента перед ними) или интервалы через дефис (границы включаются, нижняя или верхняя гранцы могут быть опущены). Если uid опущен, то данная строка определяет корень для тех гостевых пользователей, для которых не нашлось более конкретного описания. Если guest-root вообще не задан, то используется старый метод (специальная форма записи домашней директории пользователя в настоящем /etc/passwd).
      • deny-uid интервал ...
        deny-gid интервал ...
        allow-uid интервал ...
        allow-gid интервал ...
        Можно задавать отдельные uid (имена или номера со знаком процента перед ними) или интервалы через дефис (границы включаются, нижняя или верхняя границы могут быть опущены). Данная команда запрещает/разрешает доступ к серверу определенным пользователям и может использоваться вместо файла ftpusers. deny проверяется до allow и до любых других проверок. Нельзя смешивать uid и gid в одном конфигурационном файле.
      • restricted-uid интервал ...
        restricted-gid интервал ...
        unrestricted-uid интервал ...
        unrestricted-gid интервал ...
        Давать/не давать реальному или гостевому пользователю (на анонимных не действует) доступ вовне его домашней директории.
      • site-exec-max-lines число [ класс ] ...
        ограничивает число строк посылаемых командой SITE EXEC (0 - без ограничений). По умолчанию - 20 строк.
      • dns refuse_mismatch файл-с-сообщением [ override ]
        выдавать сообщение, если прямой и обратный адреса клиента не совпадают. Если не указано override, то прекращать сеанс.
      • dns refuse_no_reverse файл-с-сообщением [ override ]
        выдавать сообщение, если клиент не имеет обратного адреса. Если не указано override, то прекращать сеанс.
      • dns resolveroptions [options]
        флаги из resolver(3), без префикса RES_, предварюемые плюсом или минусом.
  • ftpconversions - каждая строка описывает возможное преобразование файлов "на лету" и состоит из 8 полей, разделенных двоеточиями (только одно преобразование при каждом запросе):
    1. удаляемый префикс (не работает)
    2. удаляемый суффикс
    3. добавляемый префикс (не работает)
    4. добавляемый суффикс
    5. исполняемая при этом внешняя программа и ее параметры; вместо %s подставляется временное имя файла; должна работать как pipe; для Solaris поменять /bin на /usr/local/bin и убрать md5sum, которого нет
      :.Z: : :/usr/local/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS
      : : :.Z:/usr/local/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS
      :.gz: : :/usr/local/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP
      : : :.gz:/usr/local/bin/gzip -c %s:T_REG:O_COMPRESS:GZIP
      : : :.tar:/usr/local/bin/tar -c -f - %s:T_REG|T_DIR:O_TAR:TAR
      : : :.tar.Z:/usr/local/bin/tar -c -Z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS
      : : :.tar.gz:/usr/local/bin/tar -c -z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP

      : : :.crc:/usr/local/bin/cksum %s:T_REG::CKSUM
      однако tar+gzip почему-то не работает (tar+compress работает!), рекоментации насчет --use-compress-programm не помогают
    6. типы файла (входного или выходного) - по-моему путаница - T_REG (обычный файл), T_ASCII (текстовый), T_DIR (директория) или сочетание
    7. опции - O_COMPRESS, O_UNCOMPRESS,O_TAR или сочетание
    8. описание
  • ftpgroups - нестандартные команды SITE GROUP и SITE GPASS позволяют пользователю поменять текущую группу. Такие группы д.б. перечислены в ftpgroups:
    вводимое-клиентом-имя-группы:шифрованный-пароль:настоящее-имя-группы
  • ftphosts - ограничивает доступ под определенными именами пользователей с указанных хостов (по умолчанию: доступ открыт отовсюду). Формат:
    allow имя-пользователя шаблон-IP-адреса ... (доступ из других мест будет закрыт)
    deny имя-пользователя шаблон-IP-адреса ...
    где шаблон-IP-адреса
    • IP-адрес
    • шаблон в формате shell
    • адрес/cidr
    • адрес:маска
  • ftpusers - список имен пользователей, которые есть в /etc/passwd, но которым не надо давать ftp-доступ.

Формат журнала xferlog (для режима syslog, уровень info)- нет дня недели и года:

  1. сокращенное английское название дня недели (Sat); отсутствует для syslog
  2. сокращенное английское название месяца (Dec)
  3. день месяца
  4. часы:минуты:секунды (время местное)
  5. год (4 цифры); отсутствует для syslog, вместо него:
    • имя хоста, на котором расположен сервер
    • имя процесса и номер в квадратных скобках
    • xferlog
    • (send): или (recv):
  6. продолжительность передачи в секундах
  7. имя удаленного хоста
  8. размер файла в байтах
  9. имя файла (полное или относительно chroot)
  10. тип передачи
    • a - ascii
    • b - binary
  11. действие над файлом в процессе передачи
    • C - сжат
    • U - разжат
    • T - taer-ед
    • _- не было произведено никаких действий
  12. направление передачи
    • o - с сервера
    • i - на сервер
  13. тип пользователя
    • a - анонимный
    • g - guest
    • r - real (из /etc/passwd)
  14. имя реального пользователя или идентификационная строка (вводимая вместо пароля) для анонимного или гостя
  15. имя сервиса (ftp)
  16. способ аутентификации
    • 0 - никакой
    • 1 - ident (rfc931)
  17. аутентифицированный идентификатор пользователя. Если аутентификация не использовалась, то звездочка.
  18. завершенность передачи
    • c - передача была закончена
    • i - не закончена

Поддерживаемые команды:

  • ABOR - прервать предыдущую команду (должна быть предварена сигналами telnet IP и Synch)
  • APPE - добавить к файлу
  • CDUP/XCUP - подняться на директорию вверх
  • CWD /XCWD- поменять текущую директорию
  • DELE
  • HELP
  • LIST (ls -lgA)
  • MKD /XMKD- создать директорию
  • MDTM - показать время последнего изменения файла
  • MODE - задать режим пересылки
  • NLST - ls
  • NOOP
  • PASS - задать пароль
  • PASV - вход в "пассивный" режим передачи
  • PORT - указать порт для последующей передачи
  • PWD/XPWD
  • QUIT
  • REST - продолжить прерванную ранее передачу
  • RETR - взять файл
  • RMD/XRMD - удалить директорию
  • RNFR - исходное имя переименовываемого файла
  • RNTO - новое имя переименовываемого файла
  • SITE - нестандартные команды
    • UMASK - задать umask
    • IDLE - задать inactive timeout
    • CHMOD
    • HELP
    • NEWER - показать список файлов более новых, чем указанная дата (по умолчанию выключено)
    • MINFO - аналогично NEWER, но выдает больше информации
    • GROUP - сменить группу
    • GPASS - предъявить пароль группы
    • EXEC - запустить программу
  • SIZE - показать размер файла
  • STAT - показать состояние сервера (Можно запрашивать в процессе передачи, предварив сигналами IP и Synch протокола telnet)
  • STOR - записать файл
  • STOU - записать файл с уникальным именем
  • STRU - задать структуру передачи
  • SYST - показать тип операционной системы, на которой работает сервер
  • TYPE - задать тип передачи
  • USER - задать имя пользователя

Изменения от 2.4.2-beta-11 до 2.6.0

  • улучшено соответствие с RFC. "Побочным" эффектом является невозможность работы с некоторыми клиентами (зависание после передачи первого же файла - и клиент и сервер ждут, кто же первый закроет соединение данных):
    • libwww (Lynx, SQUID, Midnight Commander)
    • mirror до и включая 2.9

    Разработчики утверждают, что давится конфигурированием с ключом --enable-badclients. Увы... Надо еще после configure ручками добавлять define SUPPORT_BROKEN_CLIENTS в config.h

  • исправление ошибок, в частности:
    • отлавливается больше таймаутов по неактивности
  • усиление безопасности
  • email-on-upload feature from BeroFTPD
  • privatepw
  • управление timeout в ftpaccess
  • управление DNS в ftpaccess
  • управление PORT и PASV при несовпадении IP адресов с управляющим соединением
  • keepalive
  • журнализация через syslog: daemon (define FACILITY в src/config.h - LOCAL3)
  • byte-limit, file-limit, throughput, limit-time
  • множество улучшений в настройке
  • возможность работы в PASV позади NAT
  • отдельные корневые директории для различных классов анонимных и гостевых пользователей
  • SITE CHECKMETHOD [CRC|POSIX|MD5|RFC1321]
  • SITE CHECKSUM
  • New ftpconversions: .crc and .md5
  • noretrieve/allow-retrieve
  • QUOTA
  • ограничение доступа пользователей и/или групп только к их домашним директориям ("soft" chroot)
  • при обновлении файла его права и принадлежность не меняются
Sergey E. Bogomolov