Tftp-hpa - настройка TFTP-сервера tftp-hpa

Версия для печатиОтправить другуPDF version

 Собственно, возникла необходимость в настройке tftp-сервера для хранения конфигурационных файлов коммутаторов, прошивок оборудования, etc. А если есть необходимость - значит пора приступать к настройке собственного TFTP-сервера. Для начала немного общей информации о принципах работы протокола TFTP.


Простейший протокол передачи файлов (TFTP) - это очень удобный и простой протокол, применяемый для копирования файлов с одного устройства,  поддерживающего протоколы TCP/IP, на другое.

В протоколе TFTP в качестве транспортного протокола используется UDP, а это означает, что на транспортном уровне TFTP является ненадежным. Но для обеспечения надежности в протоколе TFTP применяется собственная система подтверждения. При передаче файла с помощью TFTP этот файл разбивается на блоки по 512 байтов и передается в виде блоков. Устройство получателя должно передавать подтверждение ACK после получения каждого 512-байтового блока. Применение метода передачи с помощью окон не предусматривается. Вместо этого устройство отправителя просто следит за тем, на какой блок не было получено подтверждение АСК, и не отправляет больше данные до тех пор, пока не будет получено АСК для этого блока. Такое функциональное средство приводит к созданию простого и удобного в реализации механизма исправления ошибок.

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

Более детально с тем, как работает протокол TFTP можно здесь.

Протокол TFTP определен в документе RFC 1350 (стандарт 33), который находится по адресу ftp://ftp.isi.edu/in-notes/std/std33.txt.


С принципами работы протокола разобрались. Приступим к настройке ПО TFTP-сервера, а именно tftp-hpa. Основные возможности tftp-hpa:

  • запуск программы в режиме standalone от имени непривилегированного пользователя;
  • создавать от имени непривилегированного пользователя файлы с определенными правами;
  • выполнять chroot в выбранный каталог;
  • ограничение доступа к файлам по таким критериям, как имя файла и переданная команда (WRQ или RRQ);
  • прозрачное переименовывание файлов в зависимости от IP-адреса клиента.

В поставке идёт также достаточно удобная клиентская программа, которая, в отличие от поставляемой с базовой системой, позволяет передавать желаемые команды прямо в строке вызова.

Приступим к установке:

# cd /usr/ports/ftp/tftp-hpa && make install clean

Теперь добавим группу tftpd и пользователя tftpd, от имени которых и будет работать tftp-hpa:

# pw groupadd tftpd
# pw useradd tftpd -c TFTP\ manager -d /nonexistent -g tftpd -s /usr/sbin/nologin

Далее создаем рабочий каталог и выставляем необходимые права доступа:

# mkdir /var/tftp
# chown tftpd:tftpd /var/tftp
# chmod 750 /var/tftp

Создаем конфигурационный файл обработки файлов (переименование, контроль доступа), выставляем необходимые права доступа:

# touch /usr/local/etc/tftpd-remap.conf
# chmod 440 /usr/local/etc/tftpd-remap.conf
# chown tftpd:tftpd /usr/local/etc/tftpd-remap.conf

Редактируем /usr/local/etc/tftpd-remap.conf до следующего состояния:

# cat /usr/local/etc/tftpd-remap.conf
# Rename all files
# If WRQ: filename -> IP-filename
# If RRQ: IP-filename -> filename

r .* \i-\0

Создаем стартовый скрипт запуска и делаем его исполняемым:

# touch /usr/local/etc/rc.d/tftpd.sh
# chmod +x /usr/local/etc/rc.d/tftpd.sh

Правим его до следующего содержания:

# cat /usr/local/etc/rc.d/tftpd.sh

        #!/bin/sh
        #
        # tftp-hpa init script
        # Copyright (c) 2006 by Alexey Tsvetnov, vorakl [at] fbsd [dot] kiev [dot] ua
        #
        # PROVIDE: tftpd
        # REQUIRE: DAEMON
        # BEFORE: LOGIN
        # KEYWORD: shutdown
        #
        # Define these tftpd_* variables in one of these files:
        #       /etc/rc.conf
        #       /etc/rc.conf.local
        #       /etc/rc.conf.d/tftpd
        #
        # tftpd_enable (bool): Set it to "YES" to enable tftpd.
        #             Default is "NO".
        # tftpd_pidfile (path):           Set full path to tftpd.pid.
        #                                           Default is "/var/run/tftpd.pid".
        # tftpd_remapfile (path):      Set full path to remap file.
        #             Default is "/usr/local/etc/tftpd-remap.conf".
        # tftpd_datadir (path): Set full path to directory with data.
        #             Default is "/var/tftp".
        # tftpd_flags (str):            Extra flags passed to start command.
        #                                         Default is "-cps -u tftpd -U 037 -B 1468".
        #

        . /etc/rc.subr

        name="tftpd"
        rcvar=`set_rcvar`

        load_rc_config $name

        # DO NOT CHANGE THESE DEFAULT VALUES HERE

        : ${tftpd_enable="NO"}
        : ${tftpd_pidfile="/var/run/tftpd.pid"}
        : ${tftpd_remapfile="/usr/local/etc/tftpd-remap.conf"}
        : ${tftpd_datadir="/var/tftp"}
        : ${tftpd_flags="--ipv4 -vvcps -u tftpd -U 037 -B 1468"}

        extra_commands="reload"
        start_cmd="tftpd_start"
        stop_postcmd="tftpd_poststop"
        reload_cmd="tftpd_reload"
        required_files="/usr/local/etc/tftpd-remap.conf"
        pidfile=$tftpd_pidfile
        procname="/usr/local/libexec/in.tftpd"

        tftpd_start() {
            /bin/echo -n "Starting tftpd"
            /usr/local/libexec/in.tftpd $tftpd_flags -l -m $tftpd_remapfile $tftpd_datadir
            /bin/ps x | /usr/bin/grep in.tftpd | /usr/bin/grep -v grep | /usr/bin/awk '{print $1}' > $tftpd_pidfile
            /bin/echo "."
        }

        tftpd_poststop() {
            /bin/rm -f $tftpd_pidfile
        }

        tftpd_reload() {
            /bin/kill -1 `cat $tftpd_pidfile`
        }

        run_rc_command "$1"

Добавляем в rc.conf строку запуска tftp-сервера:

# echo '# TFTP Server' >> /etc/rc.conf
# echo 'tftpd_enable="YES"' >> /etc/rc.conf

Ну и, собственно, запускаем tftp-hpa:

# sh /usr/local/etc/rc.d/tftpd.sh start
Starting tftpd.

Собственно говоря, на этом все.  Проверку работоспособности описывать уже не буду. Единственный совет - не забывайте о файрволе ;) 

Ваша оценка: Нет Средняя: 3.3 (12 голосов)

FreeBSD 8.2 работает

FreeBSD 8.2 работает некорректно

Got ERROR packet: Unsupported option(s) requested
Error code 2048: Unsupported option(s) requested

всякий раз логиниться и набирать mode binary - для PXE это неприемлемо

 

# uname -rsm

# uname -rsm
FreeBSD 8.0-STABLE i386

Полет нормальный...

Re: # uname -rsm

 В 7.4 таже проблема. Как решать?

Re: # uname -rsm

Я у себя TFTP использую для бекапа конфигураций коммутаторов ну и время от времени - для обновления прошивок на железках. За все время использования багов пока не нашел - все нормально "сливается" и "заливается". Но вот грузиться по PXE не пытался, так что проблема может  и присутствовать.  Возможно железка не указывает непосредственно, что необходимо использовать режим  binary. Пробовали протестировать каким-либо другим способом работу tftp-сервера?

Re: # uname -rsm

Копировать на сервер можно, а вот скачать не удаётся пишет ошибку приходиться каждый раз включать другой режим передачи на binary.

Re: # uname -rsm

А если удалить правила из tftpd-remap.conf (сделать его пустым)?

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Вставай, Україно!

Литература