Опрос

Какая направленность контента сайта была бы вам наиболее интересна

Проводные сети
Беспроводные сети
Сетевое ПО
Общие аспекты сетей
Архив записей
Облако тегов
 

Сетевое ПО: TFTP-сервер под Linux

Автор: eugene210682 | 15-04-2010, 10:39 Просмотров: 14851

Эта заметка посвящена реализации файлового сервера под протокол TFTP. Такой сервер может найти применение для загрузки файлов конфигурации и обновлений ПО на всевозможное сетевое оборудование - от ADSL-модема до коммутатора операторского класса.

В ОС семейства Linux TFTP-сервер может быть реализован с помощью демона tftpd. Поэтому для полноты изложения далее привожу свой перевод страницы man in.tftpd.

Название

tftpd - сервер для передачи файлов по протоколу Trivial File Transfer Protocol (тривиальный протокол передачи файлов) поверх IPv4.

Синопсис

In.tftpd [опции…] директория…

Описание

tftpd является сервером TFTP для протокола IP 4-й версии. Протокол TFTP активно используется для загрузки бездисковых устройств. Обычно сервер запускается посредством inetd, но может также быть запущен самостоятельно (standalone).

Опции

-l
Запуск сервера самостоятельно, а не посредством inetd. В самостоятельном режиме опция -t игнорируется, а опция -a используется для указания конкретного адреса и порта, которые нужно прослушивать.
-a [адрес][:порт]
Указание конкретного адреса и порта, которые необходимо прослушивать при запуске сервера с опцией -l. По-умолчанию, прослушивается порт, соответствующий сервису tftp в файле /etc/services на всех локальных адресах.
-c
Позволяет создавать новые файлы. По-умолчанию, tftpd позволяет загружать только файлы, которые уже существуют. Новые файлы создаются с разрешением на чтение и запись для всех, если только не указаны опции -p или -U.
-s
Изменяет корневую директорию во время запуска. Это означает, что удаленный хост не должен осуществлять переход между директориями в процессе передачи, что также способствует повышению безопасности. Если указана опция -s, в командной строке в качестве параметра должен быть задан путь только к одной директории. Использование этой опции рекомендовано по соображениям безопасности, а также совместимости с некоторыми загрузчиками, в которых не могут быть просто реализованы переходы по директориям.
-u имя_пользователя
Указание пользователя, от имени которого будет запущен tftpd, по-умолчанию, это пользователь "nobody". Идентификаторы пользователя, группы и (если это позволяет платформа) дополнительный идентификатор группы будут установлены в соответствии с базой данных прав доступа к системе для указанного имени пользователя.
-U универсальная_маска
Установление маски для вновь созданных файлов в соответствии с указанным значением. Значение по-умолчанию - ноль (чтение и запись разрешены всем), если не задана опция -p, в противном случае, наследуется от родительского процесса, когда -p задано.
-p
Запрет проверки прав помимо осуществляемой системой для пользователя, указанного посредством опции -u.
-t период
В случае запуска через inetd, данная опция задает период времени в секундах, в течение которого сервер ожидает повторного соединения перед тем как закончить работу. В случае остановки сервера, inetd его восстановит как только поступит очередной запрос. Значение по-умолчанию 900 (15 минут).
-T период
Устанавливает период времени в микросекундах, между повторными отправками первого пакета. Этот параметр может быть изменен клиентом, если опции timeout или utimeout должны согласовываться. Значение по-умолчанию 1000000 (1 секунда).
-m правила_переименования
Устанавливает использование переименования файлов. Правила переименования содержатся в файле правила_переименования. Информация касательно правил приведена в нижеследующем разделе. Эта опция не может быть вкомпилирована, за информацией о доступности данной опции можно обратиться к выводу команды in.tftpd -V.
-v
Увеличивает детализацию логов tftpd. Данный флаг может быть указан несколько раз для получения еще большей степени детализации.
-r tftp-опции
Задает специфичные для RFC 2347 опции протокола TFTP, которые должны игнорироваться.
-V
Выводит номер версии и конфигурацию в консоль, после чего завершает работу.

Согласование опций RFC 2347

Текущая версия tftpd поддерживает согласование опций RFC 2347. Поддерживаемые на данный момент опции:
blksize (RFC 2348)
Устанавливает размер блока для передаваемых данных не больше указанного. Данная версия tftpd может поддерживать любые размеры блока вплоть до теоретического максимума в 65464 байта.
blksize2 (нестандартный)
Устанавливает размер блока передаваемых данных не больше указанного, но ограничивает ряд возможных значений числами, равными степени 2-х. Максимальное значение 32768 байт (наибольшее число, степень 2-х, не превышающее 65464).
tsize (RFC 2349)
Сообщает размер файла, который нужно передать. Данная версия tftpd поддерживает опцию tsize только при двоичном режиме передачи.
timeout (RFC 2349)
Задает задержку в секундах между повторными отправками пакета сервером.
utimeout (нестандартный)
Задает задержку в микросекундах между повторными отправками пакета сервером. При этом возможно использование опции -r для выявления ошибок в работе специфических клиентов TFTP. Например, выяснилось, что некоторый TFTP-клиент запрашивает опцию blksize, но завершает работу с ошибкой при получении значений этой опции, поддерживаемых сервером.

Переименование файлов

С помощью опции -m задается файл, содержащий правила переименования. Все незакомментированные строки (строки комментариев начинаются со знака решетки #) содержат операци, описанные ниже, регулярные выражения в стиле egrep и, опционально, образец для замены. Указанные операции выполняются в случае, когда регулярное выражение соответствует полностью или частично имени файла. Правила выполняются по очереди сверху вниз, и, по-умолчанию, выполняются вплоть до последнего, даже после того, как будет обнаружено совпадение.
Операции задаются с помощью комбинации следующих букв:
r
Заменить последовательность символов, соответствующую регулярному выражению на образец для замены. Образец для замены может содержать escape-последовательности (см. ниже).
g
Повторять правило до тех пор, пока не будут найдены все совпадения. Всегда используется вместе с r.
i
Выявлять совпадения с регулярным выражением без учета регистра. По-умолчанию, регистр имеет значение.
е
В случае, если обнаружено совпадение, после выполнения прекратить выполнение последующих правил.
s
Если обнаружено совпадение, после выполнения начать выполнение правил, начиная с самого первого.
a
Если обнаружено совпадение, отклонить запрос и отправить клиенту сообщение об отказе в доступе.
G
Данное правило применимо только к запросам, типа GET (RRQ).
P
Данное правило применимо только к запросам, типа PUT (WRQ).
Следующие escape-последовательности допустимы для использования в образцах для замены:
\0
Строка, заданная регулярным выражением, полностью.
\1 … \9
Строки, заданные первыми девятью последовательностями символов, заключенными в скобки \(…\) в составе регулярного выражения.
\i
IP-адрес запрашивающего узла, в точечно-десятичной форме (например, 192.0.2.169).
\x
IP-адрес запрашивающего хоста в шестнадцатиричной форме (например C00002A9).
\\
Символ "обратный слэш".
\ _пробел_
Символ пробела.
\#
Символ решетки.
Если в файл правил вносятся изменения, необходимо послать сигнал SIGHUP соответствующим процессам tftpd.

Безопасность

Использование TFTP-сервисов не требует запроса логина или пароля со стороны серверной системы. Из-за отсутствия данных для аутентификации пользователей, tftpd позволяет получить доступ только к публично доступным файлам (o+r), если только не задана опция -p. Запись может осуществляться только для уже существующих файлов, доступных для записи всем пользователям, если не задана опция -c. Следует обратить внимание, что это обстоятельство распространяет полный доступ для всех пользователей на всех узлах сети, имеющих связь с сервером, что является неприемлемым на некоторых системах и должно быть учтено перед тем, как будет запущен сервис TFTP. Как правило, следует использовать различные типы фаерволов или пакетных фильтров. Если tftpd скомпилирован соответствующим образом (см. вывод команды in.tftpd -V), возможно использование запросов host_access к базе данных сервера за информацией о правах доступа. Это может замедлить процесс передачи данных, в связи с чем узлы, требующие максимальной производительности, могут быть сконфигурированы без поддержки данной опции и ориентированы на защиту посредством фаервола или пакетных фильтров, работающих на уровне ядра.

Запуск сервера следует осуществлять от имени пользователя с наименьшими полномочиями (см. флаг -u). Разумным решением может быть создание соответствующего пользовательского аккаунта для использования tftpd, вместо запуска от имени пользователя nobody, во избежание утечки полномочий между приложениями.

Доступ к файлам может и должен быть ограничен указанием директорий и их полного пути в качестве параметров при запуске tftpd из командной строки. В этом случае, доступ будет ограничен файлами, чей путь начинается с указанной строки. По возможности, рекомендуется использовать флаг -s для указания chroot( )-окружения, доступного на сервере при установлении соединения.
И наконец, использование переименования файлов (флаг -m) может использоваться для обеспечения дополнительных ограничений на доступ.

Соответствует

RFC 1123, Requirements for Internet Hosts - Application and Support.
RFC 1350, The TFTP Protocol (revision 2).
RFC 2347, TFTP Option Extension.
RFC 2348, TFTP Blocksize Option.
RFC 2349, TFTP Timeout Interval and Transfer Size Options.

Автор

Данная версия tftpd поддерживается H. Peter Anvin . Она происходит, впрочем с существенными изменениями, из OpenBSD с дополнительными патчами Markus Gutschke и Gero Kulhman.

См. также

tftp(1), egrep(1), umask(2), hosts_access(5), regex(7), inetd(8).

Пример запуска tftpd в openSUSE Linux 11.2

В упомянутом дистрибутиве есть возможность установить пакет yast2-tftp-server, предоставляющий фронтенд для настройки tftpd. Но при беглом ознакомлении, таким образом можно настроить запуск tftpd только посредством inetd. Поэтому более предпочтительным (и не зависящим от дистрибутива) решением, с моей точки зрения, является запуск демона из командной строки с соответствующими параметрами. Перед запуском демона нужно убедиться и в случае необходимости установить пакет tftp.

После выполнения в консоли (от имени su)

in.tftpd -u someuser -l -c -p -s /somedir/someotherdir

Должен стратовать tftpd в standalone-режиме от имени указанного пользователя в заданном chroot( )-окружении с разрешением на создание новых файлов без проверки полномочий. Проверить успешный запуск демона можно, убедившись, что tftpd успешно стартовал и начал прослушивать используемый udp-порт (по-умолчанию 69):

ps -auxww | grep tftp
netstat -lnup | grep tftp

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

Комментарии: (0)    Распечатать

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.

Регистрация/Вход
Логин:
Пароль:

регистрация / восстановление
 

На главную / Регистрация / Статьи / Книги / Форум / О ресурсе / Обратная связь

 

Доменное имя зарегистрировано с помощью co.cc; хостинг предоставлен byethost.com; при построении сайта использованы скрипты DataLife Engine nulled. При копировании материалов, размещенных на сайте, просьба указывать ссылку на первоисточник. По всем вопросам, связанным с работой сайта, обращаться через форму обратной связи, либо по электронной почте: supervisor@redteapot.co.cc.