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

Bog BOS: TFTP

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)

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

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, размер окна передачи - windowsize). Имена опций и их значения передаются в пакете запроса на чтение или запись. Сервер отвечает на это пакетом подтверждения опций вместо обычного пакета подтверждения, в котором он указывает опции, с которыми он согласен.

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

TFTP клиенты

Программа tftp в Solaris 2.5 и Linux (CentOS 5/6). Параметры задают имя или адрес TFTP сервера и, возможно, порт, дальше вас спросят. Команды (можно задать в командной строке, см. ключ -c; перед именем удалённого файла можно указать "имя-хоста:"; имена удалённых файлов в формате Unix (разделитель имён каталогов - "/")):

В RHEL/CentOS 7 и выше используется модификация tftp-hpa от разработчик ядра Linux 5.2 (версия перескочила от 0.49 сразу к 5.0). Ключи:

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

В коммутаторах HPE TFTP клиент встроен в команду copy.

В коммутаторах Dell TFTP клиент встроен в команду copy.

В коммутаторах D-Link TFTP клиент встроен в команду copy (ещё в TFTP умеет команда debug и копирование ключей SSL ;).

В коммутаторах Huawei Cloud Engine TFTP клиент встроен в команду save и в BIOS и ZTP (Zero Touch Provisioning).

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 (RHEL/CentOS 5: пакет tftp-server, with remap, with tcpwrappers) запускается с помощью супердемона xinetd с правами nobody/nobody. В качестве параметра задается каталог, относительно которого будут задаваться имена файлов (по умолчанию - /tftpboot или /var/lib/tftpboot). Допускается чтение только общедоступных файлов (если не используется ключ "-p" или "--permissive"). Записывать можно только те файлы, которые уже существуют и доступны на запись всем (если не используется ключ "-c" или "--create"). SELinux также проверяет контекст файлов, с которыми работает in.tftpd, так что требуется обрабатывать их с помощью restorecon. Используется механизм /etc/hosts.allow и /etc/hosts.deny (рекомендуется использовать системный фильтр типа iptables). Сервер поддерживает дополнительные опции обмена, определенные в RFC 2347, RFC 2348 и RFC 2349: blksize (до 65464), blksize2 (степень 2; до 32768), tsize (размер файла), timeout (секунд ожидания перед повторной передачей блока), utimeout (микросекунд ожидания перед повторной передачей блока), rollover (0), windowsize (1; число блоков)). Ключи:

Порт и прочие параметры задаются в файле /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
}

В RHEL/CentOS 7 и выше используется модификация tftp-hpa от разработчиков ядра Linux 5.2. Изменения от 0.49 до 5.2 (версия перескочила от 0.49 сразу к 5.0):

В RHEL/CentOS 7 и выше устанавливаются выключенные сервисы tftp.socket (UDP/69) и tftp.service (-s /var/lib/tftpboot). Отдельный пользователь для tftp не создаётся, что нарушает рекомендацию разработчиков ("-p -c -U 002 -u tftpd"). Рекомендуется самостоятельно

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

Последние изменения:
2024.03.28: sysadmin: Файловая система zfs под Linux для архива (обновление от 0.6 до 2.2)



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru