@ Карта сайта News Автора!

Bog BOS: TFTP

Последние изменения:
2015.11.18: hard: обновлена статья про ИБП и их мониторинг

Последнее изменение файла: 2013.12.23
Скопировано с www.bog.pp.ru: 2017.03.26

Bog BOS: TFTP

Поисковая машина search.msn.com в течение 5 лет направляла пользователей на эту (несуществовавшую все эти 5 лет!) страницу. Раз уж им так хочется, то придется написать ;)

TFTP (Trivial File Transfer Protocol) представляет собой упрощенный протокол передачи файлов (никакой авторизации, выдачи оглавления и т.д). В отличие от FTP использует для передачи пакетов протокол UDP, что упрощает его реализацию для встроенных устройств.

Применяется для загрузки конфигурации или firmware различными устройствами (например, сетевыми принтерами или маршрутизаторами) в сочетании с протоколом bootp (DHCP) и ARP, RARP.

Протокол TFTP

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

Каждый пакет содержит заголовок TFTP, состоящий из двухбайтового кода пакета:

  1. запрос на чтение (пакет содержит имя файла, завершающееся нулем, и режим передачи - netascii или octet)
  2. запрос на запись (пакет содержит имя файла, завершающееся нулем, и режим передачи - netascii или octet)
  3. данные (содержит двухбайтовый номер блока, стало быть размер файла не может быть более 32 МБ; длина собственно данных от 0 до 512 байт)
  4. подтверждение (содержит двухбайтовый номер блока)
  5. ошибка (содержит двухбайтовый код ошибки и строку сообщения, завершающуюся нулем)

Позднейшие дополнения к протоколу (RFC 2347, RFC 2348, RFC 2349) позволяют согласовывать некоторые опции обмена (размер блока - blksize от 8 до 65464 байт, интервал задержек - timeout от 1 до 255 секунд, размер файла - tsize). Имена опций и их значения передаются в пакете запроса на чтение или запись. Сервер отвечает на это пакетом подтверждения опций вместо обычного пакета подтверждения, в котором он указывает опции, с которыми он согласен.

Если MTU сети недостаточно, чтобы передавать блоки данных (вместе с заголовками TFTP, UDP, IP) "одним куском", то реализация TCP/IP стека должна уметь фрагментировать/дефрагментировать IP пакеты.

TFTP клиенты

Программа tftp в Solaris 2.5 и Linux. Единственный параметр задает имя или адрес TFTP сервера. Команды:

В Cisco IOS TFTP клиент встроен в команду copy, а имя хоста и файла спрашиваются в интерактивном режиме.

TFTP сервера

Демон in.tftpd в Solaris 2.5 запускается с помощью супердемона inetd с правами nobody/nobody. В качестве параметра задается директория, относительно которой будут задаваться имена файлов (по умолчанию - /tftpboot). Ключ "-s" заставляет сервер сделать chroot() в указанную директорию, которая в этом случае должна существовать. Допускается чтение только общедоступных файлов. Записывать можно только те файлы, которые уже существуют и доступны на запись всем. Порт и прочие параметры задаются в файле /etc/inetd.conf:

tftp dgram udp wait root /usr/sbin/in.tftpd in.tftpd -s /tftpboot

Демон in.tftpd в Linux (Red Hat: пакет tftp-server, with remap, with tcpwrappers) запускается с помощью супердемона xinetd с правами nobody/nobody. В качестве параметра задается директория, относительно которой будут задаваться имена файлов (по умолчанию - /tftpboot или /var/lib/tftpboot). Допускается чтение только общедоступных файлов. Записывать можно только те файлы, которые уже существуют и доступны на запись всем. SELinux также проверяет контекст файлов, с которыми работает in.tftpd, так что требуется обрабатывать их с помощью restorecon. Сервер поддерживает дополнительные опции обмена, определенные в RFC 2347, RFC 2348 и RFC 2349. Ключи:

Порт и прочие параметры задаются в файле /etc/xinetd.d/tftp (не забыть сделать /etc/rc.d/init.d/xinetd reload):

service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
;        server_args             = -l -s /tftpboot
        server_args             = -s /tftpboot
        disable                 = no
}

tftp сервер в Cisco IOS.

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

Протокол не имеет средств аутентификации и авторизации, поэтому обеспечение его безопасного использования на клиентах является непростой задачей. Использование протокола без установления соединения UDP усугубляет проблему (возможна посылка пакетов вслепую с поддельными исходящими адресами и портами). Первым делом надо заблокировать прием пакетов на порт UDP/69 на периферии сети (Cisco ACL) и с помощью ipchains ограничить их прием на внутреннем экране (это, к сожалению, обходится, если не использовать дополнительных средств наподобие коммутатора с привязкой портов к MAC адресам), т.е. на клиентах добавить перед строками "запретить все" в /etc/sysconfig/ipchains (не забыть сделать /etc/rc.d/init.d/ipchains restart):

# tftp
-A input -s исходящие-адреса -d адрес-сервера/255.255.255.255 69:69 -p udp -j ACCEPT

Так как порты для передачи данных выбираются случайным образом, то необходимо обеспечить прием и передачу UDP пакетов на все порты из интервала ip_local_port_range сквозь внутренний экран.

Для iptables достаточно на клиенте (и промежуточных маршрутизаторах) подгрузить модуль ядра ip_conntrack_tftp (nf_conntrack_tftp) и разрешить

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Особенно осторожно надо распорядиться правами доступа к файлам в директории /tftpboot:

Ссылки

@ Карта сайта News Автора!

Bog BOS: TFTP

Последние изменения:
2015.11.18: hard: обновлена статья про ИБП и их мониторинг

TopList

Copyright © 1996-2017 Sergey E. Bogomolov; www.bog.pp.ru (КГБ знает все, даже то что у Вас на диске ;)