|
Bog BOS: TFTP |
Последние изменения: |
Последнее изменение файла: 2013.12.23
Скопировано с www.bog.pp.ru: 2023.10.01
Поисковая машина search.msn.com в течение 5 лет направляла пользователей на эту (несуществовавшую все эти 5 лет!) страницу. Раз уж им так хочется, то придется написать ;)
TFTP (Trivial File Transfer Protocol) представляет собой упрощенный протокол передачи файлов (никакой авторизации, выдачи оглавления и т.д). В отличие от FTP использует для передачи пакетов протокол UDP, что упрощает его реализацию для встроенных устройств.
Применяется для загрузки конфигурации или firmware различными устройствами (например, сетевыми принтерами или маршрутизаторами) в сочетании с протоколом bootp (DHCP) и ARP, RARP.
Используется протокол UDP, стандартный порт для инициализации соединения - 69, для передачи файла выбираются порты со случайным номером с обеих сторон. Передача начинается с посылки запроса на чтение или запись файла, далее файл пересылается блоками по 512 байт (к ним добавляются заголовки TFTP, UDP, IP и канального уровня), при получении очередного блока посылается подтверждение о приеме. Посылка блока длиной менее 512 байт сигнализирует о конце файла. Если блок теряется по дороге, то принимающая сторона по истечению времени ожидания повторяет передачу своего блока или подтверждения. В случае ошибки (нет такого файла, нет прав доступа, некорректный пакет, потеря доступа к ресурсу), любая сторона посылает сообщение об ошибке и завершает работу, не дожидаясь подтверждения. Проверка правильности передачи данных возлагается на подсчет контрольных сумм UDP.
Каждый пакет содержит заголовок TFTP, состоящий из двухбайтового кода пакета:
Позднейшие дополнения к протоколу (RFC 2347, RFC 2348, RFC 2349) позволяют согласовывать некоторые опции обмена (размер блока - blksize от 8 до 65464 байт, интервал задержек - timeout от 1 до 255 секунд, размер файла - tsize). Имена опций и их значения передаются в пакете запроса на чтение или запись. Сервер отвечает на это пакетом подтверждения опций вместо обычного пакета подтверждения, в котором он указывает опции, с которыми он согласен.
Если MTU сети недостаточно, чтобы передавать блоки данных (вместе с заголовками TFTP, UDP, IP) "одним куском", то реализация TCP/IP стека должна уметь фрагментировать/дефрагментировать IP пакеты.
Программа tftp в Solaris 2.5 и Linux. Единственный параметр задает имя или адрес TFTP сервера. Команды:
В Cisco IOS TFTP клиент встроен в команду copy, а имя хоста и файла спрашиваются в интерактивном режиме.
Демон 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 }
Протокол не имеет средств аутентификации и авторизации, поэтому обеспечение его безопасного использования на клиентах является непростой задачей. Использование протокола без установления соединения 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:
|
Bog BOS: TFTP |
Последние изменения: |