|
Bog BOS: TFTP |
Последние изменения: |
Последнее изменение файла: 2023.12.27
Скопировано с www.bog.pp.ru: 2024.11.23
Поисковая машина 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, размер окна передачи - windowsize). Имена опций и их значения передаются в пакете запроса на чтение или запись. Сервер отвечает на это пакетом подтверждения опций вместо обычного пакета подтверждения, в котором он указывает опции, с которыми он согласен.
Если MTU сети недостаточно, чтобы передавать блоки данных (вместе с заголовками TFTP, UDP, IP) "одним куском", то реализация TCP/IP стека должна уметь фрагментировать/дефрагментировать IP пакеты.
Программа 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).
Демон 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"). Рекомендуется самостоятельно
[Unit] Description=Tftp Server Activation Socket Wants=network-online.target After=network-online.target [Socket] ListenDatagram=адрес:69 [Install] WantedBy=sockets.target
[Unit] Description=Tftp Server bound Requires=tftpbound.socket Documentation=man:in.tftpd After=network.target Wants=network-online.target After=network-online.target [Service] ExecStart=/usr/sbin/in.tftpd -4 -p -U 002 -vvv -u tftpd -s /var/lib/tftpboot StandardInput=socket [Install] Also=tftpbound.socket WantedBy=multi-user.target
Протокол не имеет средств аутентификации и авторизации, поэтому обеспечение его безопасного использования на клиентах является непростой задачей. Использование протокола без установления соединения 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 |
Последние изменения: |